GNU sed , 178 158 132 + 1 = 133 Bytes
+1 Byte für -r
Flag.
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
Probieren Sie es online!
Erläuterung
In früheren Überarbeitungen habe ich viele Bytes verwendet, die sich mit Mathematik, Sonderfällen und Bereinigung befassten, obwohl ich intuitiv sicher war, dass sie vermieden werden konnten. Ich habe es seitdem meistens geschafft.
Angenommen, wir haben den Input abcdEFGHIJKLMnop
. Die Buchstaben EFGHIJKLM
werden am unteren Rand des Dreiecks angezeigt, daher habe ich sie als visuelle Hilfe großgeschrieben.
Zuerst bereiten wir die Eingabe vor, indem wir das erste Zeichen in eine eigene Zeile setzen (mit vorangestelltem Leerzeichen) und einen Cursor ( ;
) vor dem letzten Zeichen einfügen :
s/(.)(.*)(.)/ \1\n\2;\3/
Jetzt haben wir:
a
bcdEFGHIJKLMno;p
In einer Schleife machen wir jetzt ein paar Dinge in der letzten Zeile: 1. Kopieren Sie die Leerzeichen aus der vorherigen Zeile und fügen Sie sie nach dem ersten Zeichen plus zwei ein. 2. Bewegen Sie das letzte Zeichen nach den Leerzeichen nach rechts, gefolgt von einer neuen Zeile. und 3. Bewegen Sie den Cursor drei Zeichen nach links.
:
s/( *)(.\n.)(.*)(...);(.*)(.)/\1\2\1 \6\n\3;\4\5/m
t
Hier ist das Ergebnis jeder Iteration:
a
b p
cdEFGHIJKL;Mno
a
b p
c o
dEFGHI;JKLMn
a
b p
c o
d n
EF;GHIJKLM
Sie können sehen, wie die Pyramide Gestalt annimmt. Sie können auch sehen, wozu der Cursor diente: Bei jeder Iteration wurden drei Zeichen nach links verschoben, und wenn keine weiteren drei Zeichen mehr vorhanden sind, wird die Schleife unterbrochen. der Pyramide.
Jetzt machen wir eine ähnliche Operation, aber in umgekehrter Reihenfolge. In einer Schleife kopieren wir die Leerzeichen vom Zeilenanfang mit dem Cursor zum Zeilenanfang plus eins, wobei wir den Cursor auf diese Zeile bewegen.
:A
s/(.*\n)( *)(.*);/ \2;\1\2\3/m
tA
Hier sind ein paar Iterationen und das Endergebnis:
a
b p
c o
;d n
EFGHIJKLM
a
b p
;c o
d n
EFGHIJKLM
...
; a
b p
c o
d n
EFGHIJKLM
Bis auf einige zusätzliche Zeichen sind wir alle fertig: A ;
und zusätzliches Leerzeichen in der ersten Zeile und zwei Leerzeichen in der "Mitte" der Pyramide in den nächsten drei Zeilen. Eine einfache Ersetzung beseitigt sie:
s/. (.)$/\1/gm
Alles erledigt!
a
b p
c o
d n
EFGHIJKLM
✂
s?