GNU sed , 178 158 132 + 1 = 133 bytes
+1 byte para -r
bandera.
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
Pruébalo en línea!
Explicación
En revisiones anteriores , utilicé muchos bytes relacionados con matemáticas, casos especiales y limpieza, aunque intuitivamente estaba seguro de que podrían evitarse. Desde entonces he logrado hacerlo, principalmente.
Supongamos que tenemos la entrada abcdEFGHIJKLMnop
. Las letras EFGHIJKLM
serán la parte inferior del triángulo, así que las he capitalizado como una ayuda visual.
Primero preparamos la entrada colocando el primer carácter en su propia línea (precedido por un espacio) e insertando un cursor ( ;
) antes del último carácter:
s/(.)(.*)(.)/ \1\n\2;\3/
Ahora tenemos:
a
bcdEFGHIJKLMno;p
Ahora, en un bucle, vamos a hacer algunas cosas en la última línea: 1. Copie los espacios de la línea anterior e insértelos después del primer carácter, más dos; 2. Mueva el último carácter a la derecha después de los espacios, seguido de una nueva línea; y 3. Mueva el cursor tres caracteres hacia la izquierda.
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1 \6\n\3;\4\5/m
t
Aquí está el resultado de cada iteración:
a
b p
cdEFGHIJKL;Mno
a
b p
c o
dEFGHI;JKLMn
a
b p
c o
d n
EF;GHIJKLM
Puedes ver que la pirámide comienza a tomar forma. También puede ver para qué era el cursor: en cada iteración se movía a la izquierda tres caracteres, y cuando ya no hay tres caracteres a su izquierda, se rompe el bucle, que sucede justo cuando hemos llegado al "fondo" de la pirámide
Ahora vamos a hacer una operación similar pero a la inversa. En un bucle, copiaremos los espacios desde el comienzo de la línea con el cursor hasta el comienzo de la línea anterior, más uno, en el proceso moviendo el cursor hacia esa línea.
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
Aquí hay un par de iteraciones y el resultado final:
a
b p
c o
;d n
EFGHIJKLM
a
b p
;c o
d n
EFGHIJKLM
...
; a
b p
c o
d n
EFGHIJKLM
Ya hemos terminado, excepto algunos caracteres adicionales: A ;
y espacio adicional en la primera línea, y dos espacios en el "centro" de la pirámide en las siguientes tres líneas. Una simple sustitución se deshace de ellos:
s/. (.)$/\1/gm
¡Todo listo!
a
b p
c o
d n
EFGHIJKLM
✂
s?