J, 62 Bytes
|."1@([:(#~[:-.[:*/"1' '=])|.@{:(}:@],{:@],[)|:@}:)^:(1<#)^:a:
Probieren Sie es online!
Ich bin mir sicher, dass man hier viel Golf spielen kann. Dadurch werden zusätzliche Leerzeichen gedruckt, jedoch nur aufgrund der Art und Weise, in der J die im ausgegebenen Array enthaltenen Arrays so formatiert, dass sie dieselbe Form haben.
Ich denke, wenn ich einmal reingehe und genau kommentiere, was ich tue, bekomme ich vielleicht eine bessere Vorstellung davon, wie man Golf spielt (nachdem ich das jetzt getan habe, weiß ich es nicht wirklich ...). Für die Zwecke des Golfspiels ist es erwähnenswert, dass
- Ich muss in Sonderfällen 1 Zeile eingeben (der while-Teil der Schleife)
- Ich muss alle Zeilen entfernen, die nur aus Leerzeichen bestehen (es muss entweder ein integrierter oder ein besserer Weg sein, dies zu tun). Dies ist der Filter gegen Ende
- Es gibt viele Caps, Identity-Funktionen und Atops
Erläuterung
Wenn ich dies nicht spiele, teile ich die Hauptfunktion in drei Teile.
unfurl_reversed =. |.@{: (}:@] , {:@] , [) |:@}:
whitespace_filter =. #~ [: -. [: */"1 ' ' = ]
unfurl =. |."1@(whitespace_filter @: unfurl_reversed) ^: (1 < #) ^: a:
test_case =. 3 3 $ 'GFEHIDABC'
Wir werden mit dem zweiten Testfall arbeiten.
unfurl_reversed
|.@{: (}:@] , {:@] , [) |:@}:
Dies gibt einem die einmal abgewickelte Saite, jedoch in umgekehrter Reihenfolge. All dies geschieht in umgekehrter Reihenfolge, so dass die Art und Weise, in der J Zeichenfolgen automatisch mit Leerzeichen auffüllt, die der Form des Arrays entsprechen, in dem sie sich befinden, den richtigen Abstand ergibt.
|:@}:
ist die Transponierte des Eingangs
|:@}: test_case
GH
FI
ED
|.@{:
ist die Umkehrung des Endes der Eingabe
|.@{: test_case
CBA
Ich denke, Sie können sehen, was wir tun wollen: Wir wollen die Rückseite des Schwanzes an den letzten Teil der Transponierung des Abschnitts anhängen (das ist ein Schluck, aber im Grunde genommen an CBA
das Ende von anhängen ED
). Dies gibt uns einen Schritt zum Entfalten, umgekehrt.
(}:@],{:@],[)
macht genau das.
Es hängt CBA
zu ED
, schließt sich dann die mit dem Rest des Arrays. Unsere Ausgabe ist daher
unfurl_reversed test_case
GH
FI
EDCBA
whitespace_filter
#~ [: -. [: */"1 ' ' = ]
' ' = ] Equate each element to space
*/"1 Product of each row (all true?)
-. Negate
#~ Filter rows that are true
Grundsätzlich wird hiermit geprüft, ob eine Zeile vollständig Leerzeichen enthält, und es wird entfernt, wenn dies der Fall ist. Bei der ersten Iteration des Testfalls wird nichts unternommen.
Dies ist notwendig (zumindest bis ich eine Alternative gefunden habe), da wir sonst irgendwann Leerzeichen in unserer Ausgabezeichenfolge auflösen.
entfalten
|."1@(whitespace_filter @: unfurl_reversed) ^: (1 < #) ^: a:
Unfurl fügt im Grunde genommen die anderen Funktionen zusammen und in Sonderfällen einzelne Zeicheneingaben.
Wenn der Potenz von verb ( ^:
) das leere Kästchen ( a:
) zugewiesen wird, wendet sie eine Funktion auf eine Eingabe an, bis sie konvergiert und die Ergebnisse in einem Array sammelt.
(1 < #)
prüft, ob die Zeilen immer größer als 1 sind (in Sonderfällen 1 Zeileneingaben).
|."1
Kehrt jede Zeile um, sodass die Ergebnisse von invertiert werden whitespace_filter @: unfurl
.
["A","A"]
für ausgeben"A"
, wie es mein Programm tut (anstelle von["A"]
)? Es erscheint mir vernünftig, da es sich nur um die Anfangs- und Endposition handelt und Sie versuchen, sie nur einmal zu entfalten.