GNU sed , 178 158 132 132 + 1 = 133 octets
+1 octet pour le -r
drapeau.
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
Essayez-le en ligne!
Explication
Dans les révisions précédentes, j'utilisais beaucoup d'octets traitant des mathématiques, des cas spéciaux et du nettoyage, même si intuitivement j'étais sûr qu'ils pouvaient être évités. Depuis, j'ai réussi à le faire, surtout.
Supposons que nous ayons l'entrée abcdEFGHIJKLMnop
. Les lettres EFGHIJKLM
seront au bas du triangle, je les ai donc mises en majuscule comme aide visuelle.
Nous préparons d'abord l'entrée en plaçant le premier caractère sur sa propre ligne (précédé d'un espace) et en insérant un curseur ( ;
) avant le dernier caractère:
s/(.)(.*)(.)/ \1\n\2;\3/
Maintenant nous avons:
a
bcdEFGHIJKLMno;p
Maintenant, dans une boucle, nous allons faire quelques choses sur la dernière ligne: 1. Copiez les espaces de la ligne précédente et insérez-les après le premier caractère, plus deux; 2. Déplacez le dernier caractère à droite après les espaces, suivi d'une nouvelle ligne; et 3. Déplacez le curseur de trois caractères vers la gauche.
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1 \6\n\3;\4\5/m
t
Voici le résultat de chaque itération:
a
b p
cdEFGHIJKL;Mno
a
b p
c o
dEFGHI;JKLMn
a
b p
c o
d n
EF;GHIJKLM
Vous pouvez voir la pyramide commencer à prendre forme. Vous pouvez également voir à quoi servait le curseur: à chaque itération, il se déplaçait de trois caractères vers la gauche, et lorsqu'il n'y avait plus trois caractères à sa gauche, il rompait la boucle, qui se trouve être juste au moment où nous avons atteint le "bas" de la pyramide.
Maintenant, nous allons faire une opération similaire mais en sens inverse. Dans une boucle, nous allons copier les espaces du début de la ligne avec le curseur au début de la ligne précédente, plus un, dans le processus de déplacement du curseur vers cette ligne.
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
Voici quelques itérations et le résultat 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
Nous avons tous terminé maintenant, à l'exception de quelques caractères supplémentaires: un ;
espace supplémentaire sur la première ligne et deux espaces au "milieu" de la pyramide sur les trois lignes suivantes. Une simple substitution s'en débarrasse:
s/. (.)$/\1/gm
Terminé!
a
b p
c o
d n
EFGHIJKLM
✂
s?