V , 54 , 50 byte
¬ ~9ñ9É 11|á
ñ2ñ20lá
ñ$18é 9ñ^y|Ehé
Pf xxywk$hP>ñd
Cobalah online!
Tidak seperti biasanya, program ini tidak mengandung karakter yang tidak diinginkan.
Penjelasan:
¬ ~ " 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
Sekarang buffer terlihat seperti ini:
!
"#
$%
&'
()
*+
,-
./
01
23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Sekarang kita membangun tengah:
2ñ ñ " Two times:
20l " Move 20 characters to the right (because 'l' == 'right', duh)
á<CR> " Append a newline
Di sinilah agak aneh.
$ " 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
Ini catatan penting. The >
perintah sebenarnya merupakan operator yang , yang berarti tidak melakukan apa-apa tanpa argumen, teks untuk beroperasi pada. Sebagai contoh,
>_ "Indent the current line
>> "Indent the current line
>j "Indent the current and next line
>G "Indent every line
Tetapi karena perintah ini dalam satu lingkaran, kita dapat menyimpan karakter dengan tidak memberikan operator. Pada akhir loop, jika ada operator yang tertunda akan mengisi _
(baris saat ini) sebagai argumen secara implisit.
Sekarang saya akui loop ini sedikit aneh, dan bisa sulit untuk melacak seperti apa semua teks pada setiap saat. Jadi, Anda dapat menggunakan program yang lebih sederhana ini untuk melihat seperti apa bentuknya setelah N loop.
Jika Anda mengaturnya ke 9, Anda dapat melihat bahwa kami memiliki sedikit teks tambahan untuk dihilangkan. (Hanya garis saat ini).
Jadi kami menghapus baris saat ini dengan dd
. Tapi tunggu! Anda tahu bagaimana saya mengatakan bahwa operator harus mengambil argumen yang kadang-kadang diisi secara implisit? Argumen juga secara implisit diisi pada akhir program. Jadi daripada dd
atau d_
(yang setara), kita bisa dengan mudah d
dan membiarkan V mengisi _
untuk kita.