Retina , 45 43 Bytes
Die Anzahl der Bytes setzt die Kodierung nach ISO 8859-1 voraus.
O$#`.(?<=(.+))|¶
$.1
!`(?<=(¶)+.*)(?<-1>.)+
Der Zeilenvorschub ist signifikant. Eingabe und Ausgabe sind Zeilenvorschub-terminierte Listen druckbarer ASCII-Zeichenfolgen (beachten Sie, dass beide einen einzelnen nachgestellten Zeilenvorschub haben).
Probieren Sie es online!
Ich wusste für eine Weile, dass das Transponieren von rechteckigen Blöcken eine Belastung für die Netzhaut sein würde (wohingegen das Transponieren von Quadraten nicht allzu schlimm ist), habe es aber nie wirklich versucht. Die erste Lösung war in der Tat satte 110 Bytes lang, aber nach einigen wesentlichen Änderungen im Ansatz sind die resultierenden 45 Bytes bei weitem nicht so schlecht, wie ich vermutet habe (aber immer noch ...). Erklärung folgt morgen.
Erläuterung
Stufe 1: Sortieren
O$#`.(?<=(.+))|¶
$.1
Dies erledigt die Hauptarbeit des Neuordnens der Zeichen in der Eingabe, führt jedoch dazu, dass die Trennung in Zeilen durcheinander gebracht wird. Interessanterweise, wenn wir die entfernen|¶ , den Code, der erforderlich ist, um eine Quadrateingabe zu transponieren.
Sortierphasen (gekennzeichnet durch O) funktionieren wie folgt: Sie finden alle Übereinstimmungen des angegebenen regulären Ausdrucks (das Ding nach dem `), sortieren diese Übereinstimmungen und fügen sie erneut an den Stellen ein, an denen die Übereinstimmungen gefunden wurden. Dieser reguläre Ausdruck entspricht zufällig jedem einzelnen Zeichen: Nicht-Zeilenvorschub über die .(?<=(.*))Alternative und Zeilenvorschub über die ¶. Daher werden alle Zeichen in der Eingabe sortiert. Der interessantere Teil ist, was sie sortiert sind durch .
Die $Option aktiviert einen "Sortieren nach" -Modus, in dem jede Übereinstimmung durch das Substitutionsmuster in der zweiten Zeile ersetzt wird, das dann zum Vergleichen der Übereinstimmungen verwendet wird. Darüber hinaus ist die# weist Retina an, das Ergebnis der Ersetzung in eine Ganzzahl umzuwandeln und diese Ganzzahlen zu vergleichen (anstatt sie als Zeichenfolgen zu behandeln).
Schließlich müssen wir uns den regulären Ausdruck und die Substitution ansehen. Wenn die erste Alternative zutrifft (dh wir haben ein Zeichen in einer der Zeilen gefunden), (?<=(.*))fängt das Programm alles bis zu diesem Zeichen in dieser Zeile in Gruppen ein 1. Das $.1in dem Substitutionsmuster ersetzt dies durch die Länge der Gruppe 1. Daher wird das erste Zeichen in jeder Zeichenfolge 1, das zweite wird2 das dritte 3und so weiter. Es sollte jetzt klar sein, wie dies eine Quadrateingabe transponiert: Alle ersten Zeichen der Zeilen kommen zuerst und landen alle in der obersten Zeile, dann enden alle zweiten Zeichen in der zweiten Zeile und so weiter. Für diese rechteckigen Eingänge passen wir jedoch auch die Zeilenvorschübe an. Seit Gruppe1Wird in diesem Fall nicht verwendet, ist die Ersetzung leer, dies wird jedoch für die Zwecke der #Option berücksichtigt 0. Das heißt, alle Zeilenvorschübe werden nach vorne sortiert.
Jetzt haben wir also die Zeichen in der ersten Reihenfolge (erstes Zeichen jeder Zeichenfolge, zweites Zeichen jeder Zeichenfolge usw.) und alle Zeilenvorschübe am Anfang.
Stufe 2: Match
!`(?<=(¶)+.*)(?<-1>.)+
Wir müssen jetzt die Zeichen in Zeilen der richtigen Länge aufteilen. Diese Länge entspricht der Anzahl der Zeilen in der ursprünglichen Eingabe, die der Anzahl der Zeilenvorschübe entspricht, die wir am Anfang der Zeichenfolge haben.
Die Aufteilung erfolgt hier mit Hilfe einer Match-Phase, die einfach alle Übereinstimmungen des angegebenen Regex findet und die !Option verwendet, um diese Übereinstimmungen auszudrucken (standardmäßig werden sie stattdessen gezählt). Das Ziel des regulären Ausdrucks besteht also darin, jeweils eine Zeile abzugleichen.
Wir beginnen mit dem "Zählen" der Zahl mit dem Lookbehind (?<=(¶)*.*). Es wird eine Erfassung in der Gruppe 1für jeden Zeilenvorschub an der Vorderseite generiert .
Dann ordnen wir für jede dieser Erfassungen ein einzelnes Zeichen zu (?<-1>.)+.