J, 54 Bytes
[:|:|.@i.@#(>@],~' '#~[)"_1[:(,' '&,)/&.>>:@i.@#<@#"0]
Probieren Sie es online! (Beachten Sie, dass die Ausgabe auf TIO eine neue Zeile und drei Leerzeichen hat, aber nicht vom Funktionsaufruf stammt - es ist wahrscheinlich genau das, was der J-Interpreter automatisch macht).
Ich denke, die allgemeine Idee, dies zu lösen, ist richtig, aber es gibt kleine Dinge, die ich wahrscheinlich suboptimal mache und die das bytecount erweitern.
Vorherige Varianten
55 Bytes
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1>:@i.@#(,' '&,)/@#"0]
56 Bytes
<:@+:@#{.[:|:|.@i.@#(],~' '#~[)"_1#{.[:(,' '&,)//.[:]\.]
Erläuterung
Dies wird in einige Funktionen aufgeteilt. Außerdem war ich mit den letzten Teilen der Erklärung nicht so gründlich. Lassen Sie mich wissen, ob Sie eine bessere Erklärung für einen bestimmten Teil wünschen, und ich kann diese in bearbeiten.
dup =. >:@i.@# <@#"0 ]
space =. (,' '&,)/&.>
pad =. |.@i.@# (>@],~' '#~[)"_1 ]
trans =. |:
dup
dupliziert jedes Zeichen so oft wie sein Index (plus eins) in der Zeichenfolge
space
Fügt Leerzeichen zwischen die einzelnen Zeichen ein
pad
füllt die Zeichen mit der richtigen Anzahl von Leerzeichen auf
trans
transponiert die resultierende Matrix
Beispielanruf:
trans pad space dup 'abc'
c
b
a c
b
c
Dup
>:@i.@# <@#"0 ]
>:@i.@# Indices of each character plus one
# Length of the string
i. Range [0,length)
>: Add one
<@#"0 ] Duplicate each character as many times as it index (plus one)
"0 For each
# ] Copy the character
>:@i.@# as many times as it index
< Box the result
Die Ergebnisse sind mit einem Kästchen versehen, um zu verhindern, dass J die Enden mit Leerzeichen auffüllt (da sie ungleich lang sind).
Beispielanruf:
dup 'abc'
┌─┬──┬───┐
│a│bb│ccc│
└─┴──┴───┘
Platz
(,' '&,)/&.>
&.> For each boxed element
(,' '&,)/ Insert spaces between each
Beispielanruf:
space dup 'abc'
┌─┬───┬─────┐
│a│b b│c c c│
└─┴───┴─────┘
Pad
|.@i.@# (>@],~' '#~[)"_1 ]
(>@],~' '#~[) Pad the right arg with spaces given by the left arg
|.@i.@# Indices in reverse order
i. # Range [0,length)
|. Reverse
Grundsätzlich füllen Sie das erste Element mit der Länge 1, das zweite mit der Länge 2 usw. auf. Dadurch wird auch der Rahmen entfernt.
Beispielanruf:
pad space dup 'abc'
a
b b
c c c
Transponieren
Dies ist nur die eingebaute Funktion, |:
die die Transponierung einer Matrix übernimmt.