Binäre Zweige


15

Bei einer gegebenen Binärzahl besteht Ihre Aufgabe darin, eine Verzweigung dieser Zahl mit einer Tiefe von 2 zu erstellen.

Beispielsweise 0sollten Sie als Eingabe genau Folgendes ausgeben:

     /000
  /00
 /   \001
0
 \   /010
  \01
     \011

Dies sollte ziemlich selbsterklärend sein, wie die Zweige erstellt werden sollten. Tiefe 2 bedeutet, dass wir Zweige für Nummern mit einer Länge von bis zu 2 Nummern berechnen. Wir berechnen auch die Zweige in der Reihenfolge, mit Nullen oben und Einsen unten.

Weitere Testfälle:

0

     /000
  /00
 /   \001
0
 \   /010
  \01
     \011

1

     /100
  /10
 /   \101
1
 \   /110
  \11
     \111

00

       /0000
   /000
  /    \0001
00
  \    /0010
   \001
       \0011

01

       /0100
   /010
  /    \0101
01
  \    /0110
   \011
       \0111

10

       /1000
   /100
  /    \1001
10
  \    /1010
   \101
       \1011

11

       /1100
   /110
  /    \1101
11
  \    /1110
   \111
       \1111

Regeln

  • Sie erhalten in der Eingabe niemals andere Zeichen als 1und 0.
  • 0 < length of input < 11.
  • Leerzeichen am Zeilenende dürfen nachgestellt werden.

4
0 < length of input < 11ist 11dezimal oder binär? : P
ETHproductions

@ETHproductions Dezimalzahl: P
Okx

Antworten:


4

Jelly , 39 38 Bytes

L⁶ẋ,W;“/0¶\1 ”ṃ@“ð&ẏ{×ẏĊfẏȷ®ỤṪ⁻ʠaƇGⱮȷ’

Probieren Sie es online!

Wie?

Die zu druckende Kunst ist:

L  L /N00
L /N0
L/ L \N01
N
L\ L /N10
L \N1
L  L \N11

Wo Nist die Eingabezeichenfolge und List eine Zeichenfolge von Leerzeichen der Länge der Eingabezeichenfolge.

Als solche ist sie von acht Komponenten besteht ( L, N, /, 0, die Zeilenende- Zeichen, \, 1, und das Leerzeichen) , und somit können als Basis-8 - Nummer gespeichert werden (was als Basis-250 - Nummer in Jelly komprimiert werden kann). Das Atom kombiniert Basiskonvertierung und Indexierung in einer Liste (effektiv kann man beliebige zu verwendende Ziffern definieren).

L⁶ẋ,W;“/0¶\1 ”ṃ@“ð&ẏ{×ẏĊfẏȷ®ỤṪ⁻ʠaƇGⱮȷ’ - Main link: binary string s  e.g. "100"
 ⁶                                     - space character
  ẋ                                    - repeat by:
L                                      -     length(s)                    [' ',' ',' ']
    W                                  - wrap s in a list                 [['1','0','0']]
   ,                                   - pair               [[' ',' ',' '],['1','0','0']]
      “/0¶\1 ”                         - char list: ['/','0',<newline>,'\',','1',' ']

     ;                                 - concatenate        [[' ',' ',' '],['1','0','0'],'/','0',<newline>,'\',','1',' ']
                “ð&ẏ{×ẏĊfẏȷ®ỤṪ⁻ʠaƇGⱮȷ’ - base 250 number: 91531517467460683226372755994113932025707662527
              ṃ@                       - base decompression [reversed @arguments]
                                        -     this uses the concatenated list above as
                                        -     the 8 digits of that number in base 8.
                                        - implicit print

5

Batch, 178 170 159 Bytes

@set/pb=
@set s=%b:0= %
@set s=%s:1= %
@set e=@echo %s%
%e%  %s% /%b%00
%e% /%b%0
%e%/ %s% \%b%01
@echo %b%
%e%\ %s% /%b%10
%e% \%b%1
%e%  %s% \%b%11

Bearbeiten: 11 Bytes dank @ ConorO'Brien gespeichert.


Ich zähle nur 149 Bytes .
Ingenieur Toast

Ich nehme an, Neil zählt Zeilenumbrüche als Windows-CRLF, während TIO sie als LF zählt. Ich bin nicht sicher, ob LF für Batch unter Windows funktioniert.
Alex A.

4

JavaScript (ES6), 112 Byte

s=>`22   /300
2 /30
2/2  4301
3
242  /310
2 431
22   4311`.replace(/./g,n=>[s.replace(/./g,' '),s,'\\'][n-2]||n)

Demo


warum nicht [n,n,s.replace(/./g,' '),s,'\\'][n]?
tsh

@tsh Dazu müsste nach nicht numerischen Zeichen gesucht werden, /\d/ganstatt sie /./gzu ignorieren.
Arnauld

4

Python 3 , 117 109 Bytes

lambda k:'ll   /g00\nl /g0\nl/l  \g01\ng\nl\l  /g10\nl \g1\nll   \g11'.replace('l',' '*len(k)).replace('g',k)

Probieren Sie es online!

  • 8 Bytes gespart dank JonathanAllan (Verwendung der Lambda-Funktion)

Die Formatzeichenfolge sieht beim Drucken folgendermaßen aus:

ll   /g00
l /g0
l/l  \g01
g
l\l  /g10
l \g1
ll   \g11

Dies sieht bereits für eine Zeichenfolge der Länge 1 gut aus. Wir müssen nur l durch Leerzeichen der Länge g ersetzen, und natürlich muss g durch die ursprüngliche Zeichenfolge ersetzt werden


1
Sie können ein Byte mit einem unbenannten Lambda speichern. Dies bedeutet auch, dass Sie den Ausdruck entfernen können (da die Rückgabe der Zeichenfolge akzeptabel sein sollte) und weitere sieben Byte speichern können. Sie können dann zwei weitere sparen, indem Sie eine mehrzeilige Zeichenfolge verwenden, die Sie zu 107 ... TIO
Jonathan Allan

4

Python 3.6, 172 153 128 Bytes

Einfacher geht es buchstäblich nicht ... Das ist eigentlich kürzer als mein ursprünglicher Versuch, es mit einem Algorithmus zu generieren. Wie traurig.

k=input()
l=len(k)
b=' '*l
print(f'{b*2}   /{k}00\n{b} /{k}0\n{b}/ {b}\\{k}01\n{k}\n{b}\\ {b}/{k}10\n{b} \\{k}1\n{b*2} \\{k}01')

-19 Bytes dank @Leo
-25 Bytes dank @ L3viathan


Ich denke, es wäre kürzer, a, c und d zu löschen und nur b und Leerzeichen in der letzten Zeichenfolge zu verwenden. (a is b*2+' ')
Leo

Seltsam, scheint immer noch 172 Bytes für mich.
programmer5000

@ programmer5000 Sorry, das liegt daran, dass ich vergessen habe, den Code selbst zu aktualisieren.
HyperNeutrino

Speichern Sie 26 Zeichen mit print(f'{a}/{k}00\n{b} /{k}0\n{b}/ {b}\\{k}01\n{k}\n{b}\\ {b}/{k}10\n{b} \\{k}1\n{b*2} \\{k}01')
Formatzeichenfolgen

@ L3viathan Kannst du die Syntax dazu überprüfen? Es gibt mir einen Syntaxfehler.
HyperNeutrino

3

C 170 168 Bytes

Vielen Dank an @Neil für das Speichern von zwei Bytes!

n;f(char*s){n=strlen(s);printf("%*c%s00\n%*c%s0\n %*c%*c%s01\n%s\n %*c%*c%s10\n%*c%s1\n%*c%s11",2*n+4,47,s,n+2,47,s,n,47,n+3,92,s,s,n,92,n+3,47,s,n+2,92,s,2*n+4,92,s);}

Probieren Sie es online!


1
Anstatt ein /oder ` padded to width n + 1 , why not print a space, and then a / `zu drucken oder \auf Breite zu setzen n?
Neil

Ugh, lass es mich nochmal versuchen. Anstatt einen Druck /oder \gepolstert , um Breite n+1, warum nicht einen Raum zu drucken, und dann einem /oder \auf der Breite gepolsterte n?
Neil

3

Python 3 , 96 Bytes

lambda s:"""   /00
 /0
/  \01

\  /10
 \1
   \11""".translate([s,' '*len(s),s])

Probieren Sie es online! Die nicht druckbaren Zeichen werden nicht korrekt angezeigt. Das Format der Zeichenkette ist dasselbe wie das von officialaimm , jedoch mit \x01for lund \x02for g.

ll   /g00
l /g0
l/l  \g01
g
l\l  /g10
l \g1
ll   \g11

Verwendet die Zeichenfolgensubstitution in Python 3's flexibletranslate . Die Liste übersetzen [s,' '*len(s),s]Karten \x01zu ' '*len(s)und\x02 zu s. Alle größeren Zeichen bleiben unverändert, da sie Indizes enthalten, die für die Liste außerhalb des zulässigen Bereichs liegen. \x00konnte nicht verwendet werden, da ein Null-Byte als Programmende gelesen wird und der erste Eintrag verschwendet wird.



2

Gestapelt , 81 Bytes

{!n#'' '*@s's  s /n00
s /n0
s/ s \n01
n
s\ s /n10
s \n1
s  s \n11' '\l'$#~1/repl}

Probieren Sie es online!

Leider nicht sehr interessant. Hier ist der interessanteste Teil:

'\l'$#~1/repl
         repl     replace all
'\l'              letters
    $#~           by evaluating
       1/         over one argument (otherwise, it would evaluate the "last" thingy)

Dies ist im Grunde eine String-Interpolation, die jedoch 10 Byte kürzer ist als die eingebaute.


2

/// 116 Bytes

/[/\\\///x///*/[y\\0[ y\/\/y\\1[ y\//**********/y///s/yx//~/  /~ ss[x00
 s[x0
s[~s\\x01
x
s\\~s[x10
 s\\x1
~ ss\\x11

Probieren Sie es online!

Die Eingabe ist wie folgt:

/[/\\\///x/INPUT HERE!!!!!!!!//*/[y\\0[ y\/\/y\\1[ y\//**********/y///s/yx//~/  /~ ss[x00
 s[x0
s[~s\\x01
x
s\\~s[x10
 s\\x1
~ ss\\x11

Arbeitet mit einer einfachen Vorlage und fügt bei Bedarf Leerzeichen und Zeichen hinzu.

Die Byteanzahl stieg, weil Ørjan Johansen erkannte, dass der Abstand zunächst nicht verarbeitet wurde. Aber das Problem ist bekanntlich behoben.


Ich habe Sie positiv bewertet, bevor ich überprüft habe, ob es funktioniert - aber Sie passen den Abstand nicht an die Länge an. Ich sehe keine prägnante Möglichkeit, dies mit einem solchen wörtlichen Eingabeformat zu tun.
Ørjan Johansen

Oder warten Sie, es ist nicht ganz hoffnungslos, da die Länge der Eingabe auf 11 begrenzt ist.
Ørjan Johansen,

So etwas wie /*/\/y0\/ y\/\/y1\/ y\//**********/y///s/yx/und dann bekommst du Abstand mit s.
Ørjan Johansen

@ ØrjanJohansen Hoppla, Abstand vergessen ... danke. Wie würde ich Ihren Code in die Antwort einbauen?
Genosse SparklePony

FWIW /00/0|0//01/0|1//10/1|0//11/1|1//|/<\\y>//z/<y>x//<y>0/ //<y>1/ //<\\y\>///s/z/kann beliebige Längen verarbeiten.
Ørjan Johansen

1

Python 2 , 101,91 Bytes 113 Bytes

lambda y:'   ++/_00\n +/_0\n+/  +\\_01\n_\n+\\  +/_10\n +\\_1\n   ++\\_11'.replace('_',y).replace('+',' '*len(y))

Probieren Sie es online!

Die Eingabe ist eine Folge von Nullen und Einsen der Länge 1 oder 2! Das ist 0,01,10 oder 11!

+12 Bytes - korrigiert den Abstand in \ für die Eingabe der Länge zwei.


3
Ihre Ausgabe passt sich nicht an die Länge der Zeichenfolge an.
Amtszeit

1
... und die Frage gibt " 0 < length of input < 11" an.
Jonathan Allan

1
@officialaimm oh yeah. Gerade bemerkt. Vielen Dank. Werde meine Antwort aktualisieren! Jonathan ... das war ein Tippfehler. Danke, ich habe es korrigiert.
Keerthana Prabhakaran

0

Kohle , 34 Bytes

P<³←⮌θF²«J³⁻×⁴ι²θP<²Iι↗F²«P⁺⁺θικ↓↓

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:

P<³

Drucken Sie die linken Paare von /s und \s.

←⮌θ

Gibt die Eingabe rechtsbündig an der aktuellen Position aus.

F²«

Schlinge dich durch die Zweige.

J³⁻×⁴ι²

Verschieben Sie die Position des Zweigs. Wir können dies tun, weil die Wurzel rechtsbündig gedruckt wurde, so dass der mittlere Zweig immer an der gleichen absoluten Position ist.

θ

Die Eingabe drucken.

P<²

Drucken Sie das richtige Paar von /und aus\ .

Iι

Drucken Sie das Zweigsuffix.

Gehe zum ersten Blatt.

F²«

Schlaufe durch die Blätter.

P⁺⁺θικ

Drucken Sie die Eingabe und das Suffix für Zweig und Blatt.

↓↓

Gehen Sie zum nächsten Blatt. Hinweis: Wenn abschließendes Leerzeichen zulässig ist F²⁺⁺⁺θι궶, wird ein Byte gespeichert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.