V , 54 , 50 bytes
¬ ~9ñ9É 11|á
ñ2ñ20lá
ñ$18é 9ñ^y|Ehé
Pf xxywk$hP>ñd
Experimente online!
Diferentemente do habitual, este programa não contém caracteres imprimíveis.
Explicação:
¬ ~ " 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
Agora o buffer fica assim:
!
"#
$%
&'
()
*+
,-
./
01
23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Agora construímos o meio:
2ñ ñ " Two times:
20l " Move 20 characters to the right (because 'l' == 'right', duh)
á<CR> " Append a newline
Aqui é onde fica um pouco estranho.
$ " 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
Aqui está uma nota importante. O >
comando é realmente um operador , o que significa que ele não faz nada sem um argumento, o texto para operar. Por exemplo,
>_ "Indent the current line
>> "Indent the current line
>j "Indent the current and next line
>G "Indent every line
Mas como esse comando está em loop, podemos salvar um caractere não fornecendo um operador. No final de um loop, se houver um operador pendente, ele será preenchido _
(a linha atual) como um argumento implicitamente.
Agora vou admitir que esse loop é um pouco estranho, e pode ser difícil acompanhar como deve ser todo o texto a qualquer momento. Portanto, você pode usar este programa mais simples para ver como ficará depois de N loops.
Se você configurá-lo para 9, poderá ver que temos um pouco de texto extra para nos livrar. (Apenas a linha atual).
Então, excluímos a linha atual com dd
. Mas espere! Você sabe como eu disse que os operadores precisam adotar um argumento que às vezes é preenchido implicitamente? Os argumentos também são implicitamente preenchidos no final do programa. Então, em vez de dd
ou d_
(que são equivalentes), podemos simplesmente d
deixar e V preencher o campo _
para nós.