V , 54 , 50 byte
¬ ~9ñ9É 11|á
ñ2ñ20lá
ñ$18é 9ñ^y|Ehé
Pf xxywk$hP>ñd
Hãy thử trực tuyến!
Không giống như thông thường, chương trình này không chứa bất kỳ ký tự không thể in được.
Giải trình:
¬ ~ " 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
Bây giờ bộ đệm trông như thế này:
!
"#
$%
&'
()
*+
,-
./
01
23456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Bây giờ chúng tôi xây dựng ở giữa:
2ñ ñ " Two times:
20l " Move 20 characters to the right (because 'l' == 'right', duh)
á<CR> " Append a newline
Đây là nơi nó có một chút kỳ lạ.
$ " 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
Đây là một lưu ý quan trọng. Các >
lệnh thực sự là một nhà điều hành , có nghĩa là nó không làm bất cứ điều gì mà không cần một cuộc tranh cãi, các văn bản hoạt động trên. Ví dụ,
>_ "Indent the current line
>> "Indent the current line
>j "Indent the current and next line
>G "Indent every line
Nhưng vì lệnh này nằm trong một vòng lặp, chúng ta có thể lưu một ký tự bằng cách không đưa ra một toán tử. Ở cuối vòng lặp, nếu bất kỳ toán tử nào đang chờ xử lý, nó sẽ điền vào _
(dòng hiện tại) dưới dạng một đối số ngầm.
Bây giờ tôi sẽ thừa nhận vòng lặp này hơi kỳ lạ và thật khó để theo dõi tất cả các văn bản sẽ trông như thế nào tại bất kỳ thời điểm nào. Vì vậy, bạn có thể sử dụng chương trình đơn giản này để xem nó sẽ trông như thế nào sau N vòng lặp.
Nếu bạn đặt nó thành 9, bạn có thể thấy rằng chúng tôi có một chút văn bản bổ sung để loại bỏ. (Chỉ là dòng hiện tại).
Vì vậy, chúng tôi xóa dòng hiện tại với dd
. Nhưng chờ đã! Bạn có biết làm thế nào tôi nói rằng các nhà khai thác phải đưa ra một đối số mà đôi khi được ngầm định điền vào? Các đối số cũng được ngầm điền vào cuối chương trình. Vì vậy, thay vì dd
hoặc d_
(tương đương), chúng ta có thể chỉ cần d
và để V điền vào _
cho chúng ta.