V , 54 , 50 bytes
¬ ~9ñ9É 11|á
ñ2ñ20lá
ñ$18é 9ñ^y|Ehé
Pf xxywk$hP>ñd
Pruébalo en línea!
A diferencia de lo habitual, este programa no contiene caracteres no imprimibles.
Explicación:
¬ ~ " 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
Ahora el búfer se ve así:
!
"#
$%
&'
()
*+
,-
./
01
23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Ahora construimos el medio:
2ñ ñ " Two times:
20l " Move 20 characters to the right (because 'l' == 'right', duh)
á<CR> " Append a newline
Aquí es donde se pone un poco raro.
$ " 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
Aquí hay una nota importante. El >
comando es en realidad un operador , lo que significa que no hace nada sin un argumento, el texto para operar. Por ejemplo,
>_ "Indent the current line
>> "Indent the current line
>j "Indent the current and next line
>G "Indent every line
Pero dado que este comando está en un bucle, podemos guardar un carácter al no proporcionar un operador. Al final de un ciclo, si algún operador está pendiente, completará_
(la línea actual) como argumento implícitamente.
Ahora admito que este bucle es un poco extraño, y puede ser difícil hacer un seguimiento de cómo debería verse todo el texto en un momento dado. Entonces puede usar este programa más simple para ver cómo se verá después de N bucles.
Si lo configura en 9, puede ver que tenemos un poco de texto adicional para eliminar. (Solo la línea actual).
Entonces eliminamos la línea actual con dd
. ¡Pero espera! ¿Sabes cómo dije que los operadores tienen que tomar un argumento que a veces se rellena implícitamente? Los argumentos también se completan implícitamente al final del programa. Entonces, en lugar de dd
o d_
(que son equivalentes), simplemente podemos d
y dejar que V complete el _
para nosotros.