V , 54 , 50 Bytes
¬ ~9ñ9É 11|á
ñ2ñ20lá
ñ$18é 9ñ^y|Ehé
Pf xxywk$hP>ñd
Probieren Sie es online!
Anders als üblich enthält dieses Programm keine nicht druckbaren Zeichen.
Erläuterung:
¬ ~ " Insert the entire printable ASCII range
9ñ ñ " 9 times:
9É " Insert 9 spaces at the beginning of this line
11| " Move to the 11'th column on this line
á<CR> " And append a newline after the 11'th column
Nun sieht der Puffer so aus:
!
"#
$%
&'
()
*+
,-
./
01
23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Jetzt bauen wir die Mitte auf:
2ñ ñ " Two times:
20l " Move 20 characters to the right (because 'l' == 'right', duh)
á<CR> " Append a newline
Hier wird es etwas komisch.
$ " Move to the end of this line
18é " Insert 18 spaces before the last character
9ñ " Repeat the following 9 times:
^ " Move to the first non-whitespace character
y| " Yank all the whitespace before the current character.
" We'll call this the "Leading whitespace register"
E " Move to the end of the current WORD (up to before a space)
h " Move back one character
é<CR> " And insert a newline before the current character
P " Paste the leading whitespace for indentation
f " Move forward to a space
xx " Delete two characters
" (Note how we are inbetween the two bottom branches right now)
yw " Yank everything upto the next branch (all spaces)
" We'll paste this on the line up so that we can yank it again later
" To keep track of how far apart the branches are
k$ " Move up a line and to the end of that line
hP " Move back a character and paste the whitespace we yanked
> " Indent this line by one space
ñ " End the loop
Hier ist ein wichtiger Hinweis. Der >
Befehl ist eigentlich ein Operator , was bedeutet, dass er nichts ohne ein Argument tut, den zu bearbeitenden Text. Beispielsweise,
>_ "Indent the current line
>> "Indent the current line
>j "Indent the current and next line
>G "Indent every line
Da sich dieser Befehl jedoch in einer Schleife befindet, können wir ein Zeichen speichern, indem wir keinen Operator angeben. Wenn am Ende einer Schleife ein Operator ansteht, wird er _
implizit als Argument (die aktuelle Zeile) eingefügt.
Jetzt gebe ich zu, dass diese Schleife etwas seltsam ist und es schwierig sein kann, den Überblick darüber zu behalten, wie der gesamte Text zu einem bestimmten Zeitpunkt aussehen sollte. Mit diesem einfacheren Programm können Sie also sehen, wie es nach N Schleifen aussehen wird .
Wenn Sie den Wert auf 9 setzen, sehen Sie, dass wir ein bisschen zusätzlichen Text haben, den wir loswerden müssen. (Nur die aktuelle Zeile).
Also löschen wir die aktuelle Zeile mit dd
. Aber warte! Weißt du, wie ich sagte, dass Operatoren ein Argument annehmen müssen, das manchmal implizit ausgefüllt wird? Argumente werden auch implizit am Ende des Programms eingetragen. Anstelle von dd
oder d_
(die äquivalent sind) können wir einfach d
V _
für uns ausfüllen lassen .