Wenn Sie eine Liste von Wörtern eingegeben haben, geben Sie die Wörter mit diagonal angeordneten Buchstaben aus:
p
r
o
p g
u r
z a
a z m
n l m
d e i
c s n
o g
d
g e
o
l
f
(Das Obige sollte die Ausgabe für die Eingabe sein programming puzzles and code golf
.)
Um genau zu sein, beginnt jedes Wort in der ersten Spalte und drei Zeilen unter dem vorherigen Wort, und jeder nachfolgende Buchstabe verschiebt eine Spalte nach rechts und eine Zeile nach unten.
Die Eingabe kann entweder als einzelne Wortfolge, die durch genau ein Leerzeichen getrennt ist, oder als Liste / Array von Wörtern erfolgen. Die Wörter bestehen nur aus Kleinbuchstaben a-z
und bestehen immer aus mindestens einem Zeichen.
Die Ausgabe kann eine einzelne Zeichenfolge, ein Array von Zeilen oder ein Array von Zeichen sein. Führende oder nachfolgende Leerzeichen sind mit Ausnahme einer einzelnen nachfolgenden Zeile nicht zulässig.
Weitere Testfälle:
a bcd efgh i j
a
b
c
d
e
f
g
i h
j
x
x
verylongword short
v
e
r
s y
h l
o o
r n
t g
w
o
r
d
Da es sich um Code-Golf , gewinnt der kürzeste Code in Bytes!
Antworten:
Vim,
85, 76, 66, 52 Tastenanschläge / ByteAls ich mir diese Herausforderung zum ersten Mal ansah, dachte ich: "Das ist perfekt für Vim!" Und als ich es versuchte, lief alles schief. Hier ist es, in all seiner chaotischen, hackigen Pracht:
Probieren Sie es online aus, dank des (meistens) abwärtskompatiblen V-Interpreters.
Erläuterung:
Zuerst dachte ich, ich könnte diese wunderschön einfache 37-Byte-Version machen:
Leider ist es nicht so einfach. Nehmen wir es Zeile für Zeile:
Dies ermöglicht eine Funktion namens "Virtuelle Bearbeitung". Es ermöglicht dem Cursor, sich zu Spalten zu bewegen, die noch nicht existieren. Diese Antwort wäre ohne sie im Grunde unmöglich.
Jetzt müssen wir die Wörter in verschiedene Zeilen unterteilen. Also ersetzen wir jedes Leerzeichen durch 3 Zeilenumbrüche. Da dies ein Ex-Befehl ist, können wir ihn gleichzeitig mit unserem letzten Ex-Befehl
:se ve=all
ausführen, indem wir die beiden mit einem Strich trennen.Nun sieht der Puffer so aus:
Hier beginnt der Spaß. Wir richten das traditionelle rekursive Makro mit: ein
qq
und rufen dann Folgendes auf:Dann beenden wir das rekursive Makro mit
@qq@q
. An diesem Punkt haben wir alle Diagonalen, wir müssen nur ein wenig aufräumen.quelle
Turtlèd ,
2826 BytesOh mein Gott, ich scheine eine Sprache zu schlagen, die speziell für das Golfen entwickelt wurde. Das ist ein großartiger Tag.
Probieren Sie es online!
Erläuterung
(Schreiben bedeutet, dass in die Zelle im Raster geschrieben wird. Punktzeichen bedeutet, dass Zeichen in der Eingabe eingegeben wird, auf die der Zeichenfolgenzeiger zeigt.)
Leerzeichen beachten.
Die Eingabe benötigt auch Leerzeichen am Ende. Da Python eine Liste erstellen kann, ähnelt dies in etwa der Erstellung einer Liste in Turtlèd
quelle
MATL , 28 Bytes
Die Eingabe ist ein Zellenarray von Zeichenfolgen mit Kommas als optionalen Trennzeichen:
oder
Probieren Sie es online! Oder überprüfen Sie alle Testfälle: 1 , 2 , 3 , 4 .
Erläuterung
Betrachten Sie die folgende Eingabe als Beispiel:
Sie können die Teilergebnisse (Stapelinhalte) anzeigen, indem Sie das Kommentarsymbol
%
an einer beliebigen Stelle im Code einfügen. Zeigen Sie beispielsweise den Stapelinhalt nach der vierten Funktion (&n
) an.quelle
JavaScript (ES6),
11810984 ByteNimmt die Eingabe als Array von Wörtern. Gibt ein Array von Arrays von Zeichen zurück.
Alternative Version, 109 Bytes
Gibt eine Zeichenfolge zurück.
Code-Snippet anzeigen
quelle
Common Lisp,
673668597 BytesSchreckliche Lösung, ich weiß. Ich werde das wahrscheinlich nach ein bisschen Schlaf noch ändern.
Verwendungszweck:
Dies durchläuft jedes Wort in der angegebenen Liste und fügt der aktuellen Zeile die entsprechenden Zeichen hinzu. Eine angemessene Polsterung ergibt sich aus meiner unterdurchschnittlichen Verwendung von
format
.Hinweis: Ich bin neu in Common Lisp, aber ich weiß genug, um zu erkennen, dass dies eine Menge Verbesserung gebrauchen könnte.
quelle
C #, 336 Bytes:
Golf gespielt:
Ungolfed:
Testen:
quelle
Func<string[], string>
und nehmen Sie verschiedene andere Änderungen für 297 Bytes vor.s=>{int i=0,x=0,y=0,r=0,l=s.Length,q=2*(s.Max().Length+l)+1,j;var a=new char[q,q];for(;i<l;i++){y=r;for(j=0;j<s[i].Length;)a[y++,x++]=s[i][j++];x=0;r+=3;}var o="";for(;x<q;x++){var t="";for(y=0;y<q;)t+=a[x,y++];o+=t==string.Join("",Enumerable.Repeat('\0',q))?"":(t.TrimEnd('\0')+"\n");}return o;};
Sie müssen jedoch 18 Bytes fürusing System.Linq;
i
undj
der int-Deklaration oben und das Verschieben von einigen,++
damit sie bei der letzten Verwendung der Variablen verwendet werdenPython 2, 146 Bytes
Hinweis: Die Einrückungen für die letzten beiden Zeilen sind
<space>
und<tab>
, wodurch ein Byte gespart wird, da ich nicht doppelt einrücken muss.Die Eingabe muss wie folgt als Array von Zeichenfolgen eingegeben werden:
["hello", "world"]
oder['hello', 'world']
. Die Ausgabe ist ein Array von Arrays von Zeichen.Es gibt wahrscheinlich einen besseren Weg, dies zu tun ...
BEARBEITEN Danke an Doorknob für den Hinweis auf eine fehlende enge eckige Klammer. Ich habe es vor
*k...
die dritte Zeile gestellt.quelle
Mathematica, 146 Bytes
Ich bin enttäuscht von diesem bytecount, aber na ja.
Definiert eine anonyme Funktion, die eine Liste von Wörtern (z. B.
{"this","that","these"}
) aufnimmt und ein zweidimensionales Array von Zeichen zurückgibt. Fügen Sie zum Anzeigen in Rasterform//Grid
am Ende ein hinzu.Konvertiert die Zeichenfolgen in ein Array, fügt zusätzliche Zeilen hinzu, transponiert das Array, stellt die erforderlichen Verschiebungen voran und transponiert dann erneut.
Beispielergebnis (als Raster formatiert):
quelle
Gelee , 24 Bytes
Probieren Sie es online!
Wie?
quelle
Python 2, 182 Bytes
Ein bisschen lang, aber auf der positiven Seite gibt es eine Zeichenfolge ohne abschließenden Leerraum in jeder Zeile und ohne abschließenden Leerraum oder am Ende zurück. Einschränkungen, denen einige andere Einträge nicht entsprechen.
Eine Liste von Wörtern wird an die Funktion übergeben. Einige 'Leerzeichen' werden in diese Liste eingefügt. Anschließend ordnet der Algorithmus ein Zeilen- / Spaltenpaar einer wordNumber- / characterNumber-Zahl in der erweiterten Liste zu. (Dies ist ein bisschen umgekehrt zu der in anderen Lösungen üblichen Strategie).
Wenn wir Leerzeichen in allen Zeilen mit Ausnahme der letzten zulassen, können wir etwas mehr erreichen (163 Bytes):
quelle
q / kdb +,
13010994908684 BytesLösung:
Beispiele:
Erklärung (ungolfed):
Der Grundgedanke besteht darin, aus der Eingabezeichenfolge eine Reihe von Zeichenfolgen gleicher Länge zu erstellen, diese umzudrehen (zu drehen) und dann ein geeignetes Leerzeichen hinzuzufügen, um etwas zu erhalten, das wie folgt aussieht:
das wird wieder umgedreht und auf stdout gedruckt.
Hier ist eine zeilenweise Aufschlüsselung des Konzepts:
Anmerkungen:
Einige Möglichkeiten, um einige (11) einfache Bytes zu entfernen, wenn wir wirklich wollten:
f:
Funktion gelöscht und als anonyme Funktion verlassen wurde-1
und gelöscht und;
eine Liste von Zeichenfolgen zurückgegeben wird, anstatt auf stdout zu druckenBearbeitungen:
rtrim
, um die maximale Länge zum Auffüllen zu finden, entfernt Notwendigkeit zum Speichern vonC
Variablenmax count each
für eine Lambda-Funktion,a
die einmal erstellt und zweimal verwendet wirdraze
in die Lambda-Funktion, um araze each
(+)
als Kurzform fürflip
quelle
Kohle ,
169 BytesMeine erste Antwort auf Kohle. Vielen Dank an @DLosc für den Vorschlag
P
undM
anstattS
undJ
(Jump) zu verwenden, um zum Anfang der Zeile zurückzukehren (und drei nach unten).Probieren Sie es online (ausführlich) oder online (rein) .
Erläuterung:
Schleife solange es noch einen nächsten Input-String gibt:
Diese Zeichenfolge drucken, ohne den Cursor nach rechts unten zu bewegen:
Und dann drei Positionen nach unten für die nächste Iteration verschieben:
quelle
θ
Variable die erste Eingabe dar. Ich ordne die Testeingabe nur dieser Variablen im Header zu und schreibe dann den Rest des Codes, damit Sie dieα
Variable entfernen und über die aufgeteilten Elemente von iterieren könnenθ
. Probieren Sie es online! (Nicht teilnehmend wegen der führenden Räume.)Japt
-Rx
,171613 BytesNimmt die Eingabe als Array von Wörtern. Wenn nachfolgende Leerzeichen in jeder Zeile zulässig wären, könnten die letzten 4 Zeichen entfernt werden, um die Verbindung mit der Charcoal-Lösung herzustellen.
Probieren Sie es aus oder führen Sie alle Testfälle aus
Erläuterung
quelle
K4 , 58 Bytes
Lösung:
Beispiele:
Erläuterung:
Saiten mit dem
" "
rechten Pad auf die gleiche Länge bringen, transponieren, zusammenfügen, mit dem linken Pad Diagonalen erzeugen, dann mit dem rechten Pad Längen korrigieren und zurück transponieren. Nimmt eine Liste von Zeichenfolgen und gibt eine Liste von Zeichenfolgen zurück. Wahrscheinlich golffähig, aber immer noch kürzer als meine Q / KDB + -Lösung.quelle
Perl 6 , 73 Bytes
Probieren Sie es online!
Das Eingabeargument ist eine Liste von Wörtern. Die Ausgabe ist ein Array von Zeichen.
quelle
PHP , 100 Bytes
Probieren Sie es online!
quelle