GNU sed , 178 158 132 + 1 = 133 байт
+1 байт для -r
прапора.
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
Спробуйте в Інтернеті!
Пояснення
У попередніх редакціях я використовував багато байтів, що стосуються математики, особливих випадків та прибирання, хоча інтуїтивно я був впевнений, що їх можна уникнути. З тих пір я встиг це зробити, в основному.
Припустимо, у нас є вхід abcdEFGHIJKLMnop
. Букви EFGHIJKLM
будуть внизу трикутника, тому я написав їх великими літерами як наочний посібник.
Спочатку ми готуємо введення, помістивши перший символ у свій власний рядок (перед яким пробіл) та вставивши курсор ( ;
) перед останнім символом:
s/(.)(.*)(.)/ \1\n\2;\3/
Тепер ми маємо:
a
bcdEFGHIJKLMno;p
Тепер, у циклі, ми збираємось зробити кілька речей до останнього рядка: 1. Скопіюйте пробіли з попереднього рядка та вставіть їх після першого символу плюс два; 2. Перемістіть останній символ праворуч після пробілів, після чого слід новий рядок; і 3. Перемістіть курсор на три символи ліворуч.
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1 \6\n\3;\4\5/m
t
Ось результат кожної ітерації:
a
b p
cdEFGHIJKL;Mno
a
b p
c o
dEFGHI;JKLMn
a
b p
c o
d n
EF;GHIJKLM
Видно, що піраміда починає формуватися. Ви також можете побачити, для чого був курсор: у кожній ітерації він переміщав ліворуч три символи, а коли вже немає трьох символів ліворуч, він розбиває цикл, що трапляється саме тоді, коли ми досягли "дна" піраміди.
Зараз ми будемо робити аналогічну операцію, але в зворотному напрямку. У циклі ми будемо копіювати пробіли від початку рядка курсором до початку попереднього рядка плюс один у процесі переміщення курсору до цього рядка.
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
Ось кілька повторень та кінцевий результат:
a
b p
c o
;d n
EFGHIJKLM
a
b p
;c o
d n
EFGHIJKLM
...
; a
b p
c o
d n
EFGHIJKLM
Зараз у нас все закінчено, за винятком кількох зайвих символів: A ;
та додаткового пробілу на першому рядку та двох пробілів у «середині» піраміди на наступних трьох рядках. Проста заміна позбавляється від них:
s/. (.)$/\1/gm
Готово!
a
b p
c o
d n
EFGHIJKLM
✂
s?