GNU sed , 178 158 132 + 1 = 133 byte
+1 byte per -rflag.
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
Provalo online!
Spiegazione
Nelle revisioni precedenti ho usato molti byte relativi a matematica, casi speciali e pulizia, anche se intuitivamente ero sicuro che potevano essere evitati. Da allora sono riuscito a farlo, principalmente.
Supponiamo di avere l'input abcdEFGHIJKLMnop. Le lettere EFGHIJKLMsaranno la parte inferiore del triangolo, quindi le ho scritte in maiuscolo come aiuto visivo.
Per prima cosa prepariamo l'input mettendo il primo carattere su una propria riga (preceduto da uno spazio) e inserendo un cursore ( ;) prima dell'ultimo carattere:
s/(.)(.*)(.)/ \1\n\2;\3/
Ora abbiamo:
a
bcdEFGHIJKLMno;p
Ora, in un ciclo, faremo alcune cose sull'ultima riga: 1. Copia gli spazi dalla riga precedente e inseriscili dopo il primo carattere, più due; 2. Sposta l'ultimo carattere a destra dopo gli spazi, seguito da una nuova riga; e 3. Spostare il cursore di tre caratteri a sinistra.
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1 \6\n\3;\4\5/m
t
Ecco il risultato di ogni iterazione:
a
b p
cdEFGHIJKL;Mno
a
b p
c o
dEFGHI;JKLMn
a
b p
c o
d n
EF;GHIJKLM
Puoi vedere la piramide che inizia a prendere forma. Puoi anche vedere a cosa serviva il cursore: in ogni iterazione si spostava di tre caratteri a sinistra e quando non ci sono più tre caratteri alla sua sinistra, interrompe il ciclo, che succede proprio quando abbiamo raggiunto il "fondo" della piramide.
Ora eseguiremo un'operazione simile ma al contrario. In un ciclo, copieremo gli spazi dall'inizio della riga con il cursore all'inizio della riga precedente, più uno, nel processo spostando il cursore su quella riga.
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
Ecco un paio di iterazioni e il risultato finale:
a
b p
c o
;d n
EFGHIJKLM
a
b p
;c o
d n
EFGHIJKLM
...
; a
b p
c o
d n
EFGHIJKLM
Ora abbiamo finito tutti, ad eccezione di alcuni personaggi extra: A ;e spazio extra sulla prima riga e due spazi nel "mezzo" della piramide sulle tre righe successive. Una semplice sostituzione si libera di loro:
s/. (.)$/\1/gm
Tutto fatto!
a
b p
c o
d n
EFGHIJKLM
✂s?