GNU sed , 178 158 132 + 1 = 133 byte
+1 byte cho -r
cờ.
s/(.)(.*)(.)/ \1\n\2;\3/
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1 \6\n\3;\4\5/m
t
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
s/. (.)$/\1/gm
Hãy thử trực tuyến!
Giải trình
Trong các lần sửa đổi trước, tôi đã sử dụng rất nhiều byte liên quan đến toán học, các trường hợp đặc biệt và dọn dẹp, mặc dù theo trực giác tôi chắc chắn rằng chúng có thể tránh được. Kể từ đó tôi đã xoay sở để làm như vậy.
Giả sử chúng ta có đầu vào abcdEFGHIJKLMnop
. Các chữ cái EFGHIJKLM
sẽ là đáy của hình tam giác, vì vậy tôi đã viết hoa chúng như một trợ giúp trực quan.
Trước tiên, chúng tôi chuẩn bị đầu vào bằng cách đặt ký tự đầu tiên trên dòng riêng của nó (trước một khoảng trắng) và chèn một con trỏ ( ;
) trước ký tự cuối cùng:
s/(.)(.*)(.)/ \1\n\2;\3/
Bây giờ chúng tôi có:
a
bcdEFGHIJKLMno;p
Bây giờ, trong một vòng lặp, chúng ta sẽ thực hiện một số điều cho dòng cuối cùng: 1. Sao chép khoảng trắng từ dòng trước đó và chèn chúng sau ký tự đầu tiên, cộng với hai; 2. Di chuyển ký tự cuối cùng sang phải sau dấu cách, theo sau là dòng mới; và 3. Di chuyển con trỏ ba ký tự sang trái.
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1 \6\n\3;\4\5/m
t
Đây là kết quả của mỗi lần lặp:
a
b p
cdEFGHIJKL;Mno
a
b p
c o
dEFGHI;JKLMn
a
b p
c o
d n
EF;GHIJKLM
Bạn có thể thấy kim tự tháp bắt đầu hình thành. Bạn cũng có thể thấy con trỏ dùng để làm gì: Trong mỗi lần lặp, nó di chuyển sang trái ba ký tự và khi không còn ba ký tự bên trái, nó sẽ phá vỡ vòng lặp, điều này xảy ra ngay khi chúng ta chạm đến "đáy" của kim tự tháp.
Bây giờ chúng ta sẽ thực hiện một hoạt động tương tự nhưng ngược lại. Trong một vòng lặp, chúng tôi sẽ sao chép các khoảng trắng từ đầu dòng bằng con trỏ đến đầu dòng trước, cộng với một, trong quá trình di chuyển con trỏ lên đến dòng đó.
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
Dưới đây là một vài lần lặp và kết quả cuối cùng:
a
b p
c o
;d n
EFGHIJKLM
a
b p
;c o
d n
EFGHIJKLM
...
; a
b p
c o
d n
EFGHIJKLM
Bây giờ chúng ta đã hoàn thành, ngoại trừ một số ký tự phụ: A ;
và thêm khoảng trắng trên dòng đầu tiên và hai khoảng trắng ở "giữa" của kim tự tháp trên ba dòng tiếp theo. Một sự thay thế đơn giản được loại bỏ chúng:
s/. (.)$/\1/gm
Tất cả đã được làm xong!
a
b p
c o
d n
EFGHIJKLM
✂
s làm gì?