BEARBEITEN Ich habe den Wortlaut der Regeln geändert, um einige Dinge, die implizit waren, deutlicher zu machen. Ich habe auch einige Akzente gesetzt, um einige offensichtliche Unklarheiten zu beseitigen, und die Option, ein eigenständiges Programm anstelle einer Funktion zu erstellen, explizit definiert.
Das Ziel hier ist es, eine Funktion zu erstellen, die eine Textdatei (oder einen String) aufnimmt und so transponiert, dass Zeilen zu Spalten werden und umgekehrt.
Beispiel:
Ich bin ein text Transponiere mich. Kannst du es machen?
Ergebnisse in:
ITC ra aan mn sy apo du ts eed xo tm .ei .t ?
Die Regeln:
- Sie dürfen davon ausgehen, dass nur Leerzeichen verwendet werden
" "
und"\n"
in keiner Zeile ein Leerzeichen nachgestellt ist. - Sie können davon ausgehen, dass die Datei ASCII ist. Welchen Endzeilenmarker Sie verwenden möchten, liegt bei Ihnen (CRLF oder LF). Es muss im Beispiel korrekt funktionieren, aber es sollte auch bei jeder Eingabe funktionieren , die die obigen Annahmen erfüllt.
- Möglicherweise müssen Sie Leerzeichen (wie im Beispiel) einfügen, wenn keine vorhanden sind, damit die Spalten in einer Linie bleiben.
- Ihr Ergebnis darf in keiner Zeile ein nachgestelltes Leerzeichen enthalten .
- Das letzte Zeilenumbruchzeichen (für die letzte Zeile) ist optional.
- Es sollte entweder eine Funktion oder ein vollständiges Programm sein. Wenn Ihre Funktion eine Zeichenfolge akzeptiert, sollte sie die Ergebnisse als Zeichenfolge zurückgeben. Wenn ein Dateiname akzeptiert wird, geben Sie den Namen der Datei zurück, in der Sie das Ergebnis gespeichert haben. Sie dürfen außerdem ein vollständiges Programm schreiben , das Eingaben von STDIN akzeptiert und das richtige Ergebnis an STDOUT ausgibt. wenn Sie dies tun, müssen Sie nicht ausgegeben , etwas zu STDERR.
- Das kürzeste Verfahren gewinnt, aber ich stimme jeder Antwort zu, die ich mag.
Basierend auf den Regeln ist die Ausgabe im Beispiel entweder 53 oder 52 Byte lang (für LF-Zeilenumbrüche), je nachdem, ob der letzte Zeilenumbruch enthalten ist oder nicht.
Hinweis: Dies ist keine spezielle Anforderung, aber wenn Ihre Funktion beim zweimaligen Ausführen nacheinander nicht mit der ursprünglichen Funktion identisch ist (die letzte Zeile kann abweichen und alle leeren Zeilen am Ende der Datei werden gelöscht), sind Sie es wahrscheinlich gegen eine der Regeln verstoßen.
Antworten:
Japt , 6 Bytes
Probieren Sie
es zweimal aus - gibt die ursprüngliche Zeichenfolge zurück
Erläuterung
Transponieren Sie die Eingabe
Karte über jede Linie
Nach rechts schneiden
quelle
J (
3140)Dies ist eine Funktion , die einen String annimmt, und gibt eine Zeichenfolge (dh ein Zeichenvektor mit Zeilenvorschübe an den richtigen Stellen eingesetzt ist , und nicht eine Matrix.)
Bearbeiten: Kein abschließendes Leerzeichen in einer Zeile.
Prüfung:
quelle
?\n
.cut
oderdlb
standardmäßig keine bereitstellt und das Schreiben selbst auch in APL eine Reihe von Zeichen erfordert.Rubin 111
Golf gespielt:
Ungolfed:
Ruby verfügt über eine Array-Transponierungsfunktion. Auf diese Weise werden die Zeilen einfach aufgefüllt, in ein Array von Zeichen umgewandelt, die Array-Transponierungsfunktion von Ruby verwendet und das Array von Zeichen wieder in Zeilen umgewandelt.
Beim Golfen wurden lediglich Einzelzeichen-IDs verwendet, Leerzeichen entfernt, eine temporäre Zeile für text.lines verwendet und die Berechnung für max_length inline gestellt (es gibt keine Punkte für die Effizienz).
quelle
"\n"
mit?\n
..to_a
ist überflüssig. Sie können dort weitere 5 Zeichen gewinnen.R 171
Anwendungsbeispiel:
Das nachfolgende Leerzeichen wird entfernt.
quelle
Python 2.7 (
97799490)BEARBEITEN: Verpasste die Funktionsanforderung;
Ich bin mir ziemlich sicher, dass dies verbessert wird, da ich hier ein Anfänger bin, aber zunächst einmal;
Der Code verwendet eine einfache
split
, um die Zeichenfolge in einen Vektor von Zeilen aufzuteilen. Anschließend wirdmap
mit einem Funktionswert wieNone
(der Einheitsfunktion) und dem Splat-Operator der Vektor transponiert und aufgefüllt (ähnliche Funktionalität wiezip_longest
in Python3).Der Rest des Codes ist nur
None
dem Leerzeichen zugeordnet, schneidet die Matrix ab und setzt sie wieder zu einer einzelnen Zeichenfolge zusammen.quelle
map
. Ich bin immer auf der Suche nach einem Ort, an dem ich das nutzen kann ... und du hast mich einfach geschlagen. ;)Bash + Coreutils + Sed, 83
fold
undpaste
erledige die wichtige Arbeit. Der Rest ist nur die Formatierung.Akzeptiert Eingaben von stdin und Ausgaben von stdout:
quelle
C (278 Bytes)
Bearbeiten: Dies verstößt gegen die Regeln, da ein Dateiname als Argument verwendet wird, aber in stdout geschrieben wird. Ich bearbeite es später, um in eine Datei zu schreiben und dann den Dateinamen auf stdout zu drucken.
Dies ist mein erster Code Golf überhaupt, also erbarme dich. Irgendein schlichtes altes C. Gib die Eingabe ein
test.txt
und lass sie laufen!clang transpose.c -o transpose && ./transpose test.txt
Durch die Verwendung kurzer Variablennamen, das Entfernen unbegründeter Formatierungen, das Zulassen von Leckstellen bei Dateihandles und das Deaktivieren aller Warnungen wird dies auf 278 Byte reduziert. (Da implizite Importe verwendet werden, ist die Verknüpfung möglicherweise nicht auf allen Systemen ordnungsgemäß. Funktioniert auf meinem Computer!)
quelle
int
, um einige Ihrer Erklärungen zu verkürzen, oder ist das jetzt illegal?A,B,D,I,J,*F
als globale Variablen deklarieren , umint
Schlüsselwörter zu vermeiden . Ebenso können Sieint
ausmain
Deklaration undC
Argument entfernen . InC
,int
ist an vielen Stellen optional.AutoHotkey 210
Prüfung
quelle
Ruby: 88 Zeichen
(Wird veröffentlicht, weil es kürzer ist als die anderen Ruby-Lösungen. Wird nicht überprüft, ob mein Code im Vergleich zu diesen neue Funktionen bietet. Wenn Sie bereits eine Ruby-Lösung veröffentlicht haben und der Meinung sind, dass dies hauptsächlich eine Kopie von Ihnen ist, kommentieren Sie dies bitte und ich werde meine Antwort zurückziehen. )
Probelauf:
quelle
Bash, 124 Bytes
Es liest die Standardeingabe und schreibt die Standardausgabe. Versuch es:
Wie es funktioniert:
split
Eingabe in einzelne Zeilen (Dateien im temporären Verzeichnis$D
)grep
(Dateien * +)paste
(durch Tabulatoren getrennten Spalten)sed
Bearbeiten:
;rm -r $D
(danke Tim)+
statt_
als Suffix verwenden und kürzen${F}_
zu$F+
L
aus geteilten Ergebnisdateien entfernenquelle
rm
Bit von Ihrer Zeichenanzahl weglassen.Ruby - 144 Zeichen
Hier ist mein erster Versuch, Golf zu spielen:
Führen Sie für die Ausgabe aus,
puts f text
wotext
sich eine mehrzeilige Zeichenfolge befindet, die den obigen Regeln entspricht. Die ungolfed Version ist unten:Eine ähnliche, aber letztendlich bessere Lösung in Ruby finden Sie im obigen Code von Wayne Conrad.
quelle
transpose
in deiner Antwort nicht bemerkt , bevor ich meine geschrieben habe. Es scheint mir nicht ganz koscher zu sein, Ihre Antwort grundlegend umgeschrieben zu haben, nur ein bisschen besser. :(transpose
, wäre möglicherweise keine bessere Ruby-Lösung aufgetaucht. Eines der Dinge, die ich an der Programmierung am meisten liebe, ist die Bereitschaft zur Zusammenarbeit und zur gegenseitigen Abstimmung von Ideen. Bis wir uns wiedersehen, mein Herr. Prost!PHP 194
Nicht golfen:
Dies ist mein erster Golfversuch, seien Sie also bitte nett! Auch Tipps / Vorschläge wären sehr dankbar!
quelle
"
s entfernen"trim"
. PHP wird eine Warnung geben, aber es funktioniert gut.@
, um Warnungen zu unterdrücken.MATHEMATICA 117 Zeichen
quelle
f
! .. tksPerl (92 + 1)
liest stdin und schreibt an stdout. Hinzufügen von 1 zur Punktzahl für
say
quelle
CJam,
3225 BytesCJam ist neuer als diese Herausforderung, daher kann diese Antwort nicht akzeptiert werden.
Deutlich verkürzt durch user23013.
Teste es hier.
quelle
Javascript, 103
Weniger golfen
Prüfung
quelle
Retina , 40 Bytes
Probieren Sie es online!
Basierend auf diesem Programm , das ich erstellt habe, um jede Größe von Rechtecken zu transponieren, die verwendet werden der Vorschlag von Leo verwendet wird zum Transponieren eines Rechtecks bekannter Größe verwendet.
Bearbeiten: Mehr Golf gespielt und keine Leerzeichen mehr in den Zeilen.
quelle
Perl 5 , 25 Bytes
Beachten Sie, dass dies ANSI-Escape-Sequenzen verwendet und daher auf TIO nicht funktioniert. Sie können es jedoch hier in Aktion sehen .
Erläuterung
Dieser Code ändert zuerst den Wert von list separator (
$"
) in einen vertikalen Tabulator, gefolgt von der ANSI-Escape-Sequenz für '1 Spalte zurückgehen' (\x1b[1D
). Anschließend setzen wir die implizit gedruckte Variable$_
auf eine Zeichenfolge, die mit der ANSI-Escape-Sequenz beginnt für 'Drucken in Zeile 1 Spalte beginnen$.
(wo$.
ist die aktuelle Textzeile)' (\x1b1;$.H
) und interpoliert die Liste@F
(die eine Liste aller Zeichen in dieser Zeile ist, die mit Autosplit (-a
) mit einem leeren Aufteilungsmuster (-F
) gefüllt ist ) was setzt den Inhalt von$"
zwischen die einzelnen Elemente eingefügt, wobei der Cursor vertikal nach unten bewegt wird, anstatt die Ausgabe nach dem vorherigen Zeichen fortzusetzen.Probieren Sie es online!
quelle
C ++ (243 Zeichen)
Hier ist eine Funktion, die eine Zeichenfolge akzeptiert und zurückgibt.
Ich hätte ein paar Dutzend Zeichen rasieren können, aber ich habe beschlossen, es als nicht-dummen Code zu behalten (läuft schnell, liest sich in Ordnung). Vielleicht habe ich mich nur dafür entschieden, weil dies mein erster Code Golf ist ... ich bin noch nicht hardcore genug :)
Mit Formatierung:
quelle
using namespace std;
.using namespace std;
sollte die Anzahl der Zeichen hinzugefügt werden.Python 2.7 - 115 Zeichen :
Einzeiler:
und in einem saubereren Druck:
in 115 Zeichen:
quelle
\n
die alslen
einzelnes Zeichen betrachtet werden, aber es sind zwei :)\n
ist einer. Also ich sage eins ist in Ordnung.len("\n")
zeigt 1 an, obwohl es sich im Quellcode sicherlich um 2 separate Zeichen handelt. Das Speichern der Quelle in einer Datei führt zurls
Anzeige 116. Nur zu sagen, dass dieslen
nicht der beste Weg ist, die Codegröße zu messen, da Escape-Zeichen vor dem Messen verarbeitet werden :)GolfScript, 51 Zeichen
Dies ist ein erster Versuch; Ich vermute, es kann verbessert werden. Der größte Teil des Codes besteht darin, die Anforderungen für die Entfernung von Auffüll- und Leerzeichen zu erfüllen - ohne sie
n%zip n*
würde es nur ausreichen.Ps. Folgende 46- stellige Version erledigt die Aufgabe für die angegebene Beispieleingabe, stürzt jedoch ab, wenn eine Eingabespalte vollständig aus Leerzeichen besteht:
Ich gehe davon aus, dass dies ausreicht, um das Spiel zu disqualifizieren, auch wenn die Herausforderung dies nicht ausdrücklich angibt.
quelle
Schema / Schläger 113
Der Text:
Ohne neue Zeilen und zusätzliche Leerzeichen:
Die benutzerfreundliche Version
quelle
Haskell
Es war so kurz, ich musste in Leerzeichen hinzufügen ...
quelle
I am a text..?
Transpose met
Can you do i
.Python
89103 ZeichenIch fühle mich dreckig.
90104 Zeichen für Industriestärkenversion. : ^)quelle
Mathematica, 95 Zeichen
quelle
K, 56
Dies sollte die Spezifikation jetzt erfüllen.
Akzeptiert eine Zeichenfolge und gibt eine Zeichenfolge zurück.
.
quelle
{`/:x@'/:!max@#:'x:`\:x}
für 26.Groovig, 98 Zeichen
online
ungolfed:
quelle
Pyth , 11 Bytes
Probieren Sie es online!
Nimmt Eingaben als Zeichenfolge und gibt eine Liste von Listen aus
Pyth , 25 Bytes
Nimmt Eingaben als Zeichenfolge und gibt eine Zeichenfolge aus.
Probieren Sie es online!
quelle
J
2826 Bytes2 Bytes dank frownyfrog gespeichert
Nimmt einen String, gibt einen String zurück. Ich bin nicht sicher , ob es eine kürzere Version der ‚cutopen‘
FunktionVerb , dass ich verwenden könnte.Es gibt auch die kürzeren
Ich bin mir jedoch nicht sicher, ob es unter die Richtlinien des OP fällt, da es eine Reihe von Zeichen zurückgibt.
Wie es funktioniert:
Die andere Version funktioniert genauso, konvertiert das transponierte Array jedoch nicht in eine korrekt formatierte Zeichenfolge.
Beispiele:
quelle
cutLF
.0|:>@cutLF
Lua ,
203189 BytesProbieren Sie es online!
Ich habe hier eine andere Lua-Lösung gesehen, aber ich glaube nicht, dass es ein Problem gibt, zwei Lösungen in derselben Sprache zu veröffentlichen. Wenn ja, sag es mir :)
quelle