Verdrehen von Wörtern!
Gegeben eine Zeichenfolge und eine positive Ganzzahl. Sie müssen die Schnur hin und her drehen.
Beispiel Eingabe / Ausgabe
Eingang
Programming Puzzles & Code Golf
4
Ausgabe
Prog
mmar
ing
zzuP
les
oC &
de G
flo
Eingang
Die Eingabe kann über STDIN oder ein Funktionsargument erfolgen. Die Eingabe besteht aus einer Zeichenfolge und einer positiven Ganzzahl n . Die Ganzzahl bestimmt die Länge jeder verdrillten Linie.
Die Saite ist hin und her gedreht. Eine Eingabe von HELLO, WORLD!
und 5 würde folgendermaßen aussehen:
Ausgabe
Die Ausgabe ist der verdrehte Text. Es darf kein nachgestelltes Leerzeichen stehen. Wenn die Länge der Eingabezeichenfolge nicht durch die Zeilenlänge teilbar ist, fügen Sie ein Leerzeichen hinzu, bis die Zeile gefüllt ist:
Ein Beispiel dafür:
Eingang
Hello, World!
5
Ausgabe (Beachten Sie das Leerzeichen ganz am Ende)
Hello
roW ,
ld!
Antworten:
Pyth,
1915Füllt die Zeichenfolge vor und kehrt die Zeilen beim Drucken um. Der Abstand entspricht der Größe des Feldes, die letzte Zeile nach dem Zerlegen der Eingabe wird jedoch verworfen.
Probieren Sie es hier aus
quelle
CJam, 19 Bytes
Eingabebeispiel:
Erklärungen
quelle
Schneemann 1.0.1 , 91 Bytes
Oder alles in einer Zeile (für Ästhetik oder genauer gesagt für Antiästhetik) zum Preis von 2 Byte:
Für Snowman ist das viel zu kurz. (Es ist wahrscheinlich die kürzeste, die es geben kann. Ich habe ziemlich lange daran gearbeitet.)
Dies hat eine Einschränkung: Es wird in 50% der Fälle mit einem Fehler beendet (erzeugt aber immer noch die richtige Ausgabe), wenn die letzte Zeile nicht umgekehrt wird. (Dies liegt daran, dass ich
ag
die Array-Elemente in Zweiergruppen gruppiere, damit ich alle anderen Elemente umkehren kann. Ich überprüfe jedoch nicht, ob das letzte Element beide erwarteten Elemente enthält. Daher wird versucht, auf ein nicht vorhandenes Element zuzugreifen, wenn Es gibt eine ungerade Anzahl von Zeilen.)Ungolfed / Erklärung:
quelle
Python 2, 60
Nimmt
n
Zeichen aus dem von auf einmals
und druckt sie in einer Richtungd
, die zwischen1
und wechselt-1
. Wird beim Abstand in der letzten Zeile am Endes
mitn
Leerzeichen aufgefüllt, bevor sie abgeschnitten wird. Dies wirkt sich nur dann aus, wenn weniger alsn
Zeichen übrig sind.Eine rekursive Lösung würde ein Zeichen (59) speichern, mit der Ausnahme, dass eine nachgestellte Zeile verbleibt, was nicht zulässig ist.
quelle
Haskell ,
8375 BytesEinfache
chunksOf
Implementierung mit Take-and-Drop, wobei eine gerade oder ungerade Anzahl von Umkehrungen auf die Ausgabe angewendet wird.Vielen Dank an @BMO für fünf Bytes und @ ØrjanJohansen für drei Bytes!
Probieren Sie es online!
quelle
cycle
spart 5 Bytes, versuchen Sie es online!g
und austauschen,n
undl
: Probieren Sie es online aus!Feststecken ,
42414038 BytesDies ist ein bisschen zu lang, wird wahrscheinlich versuchen, mehr Golf zu spielen!
Eingabe sollte so sein
"string"|n
.Erläuterung:
quelle
Haskell, 108 Bytes
Das ist ziemlich lang, Herrgott. Hier ist es in Aktion:
quelle
let
Ausdrucks?let
Anweisung, die durch ein Semikolon getrennt ist. Normalerweise werden Zeilenumbrüche und Einrückungen verwendet, aber in Haskell können Sie auch schreibenlet a=b; c=d in expr
.(%) :: String -> String -> String
anstelle vonIO ()
.Python 2, 109 Bytes
Musste mit Leerzeichen auffüllen, damit die letzte Zeile korrekt ist.
Probieren Sie es hier aus
quelle
Lua,
918888848382 BytesAlte Version:
Neue Version:
quelle
O, 60 Bytes
Mein allererstes O-Programm, und noch dazu ein langes!
Live-Demo.
quelle
Perl, 87 Bytes
Alte Version (druckt eine nachgestellte neue Zeile):
Die Zeichenfolge wird als Funktionsargument ohne nachfolgende Newline übergeben. Rufen Sie wie folgt an:
quelle
Mumps, 86 Bytes
Obwohl es 2 Bytes kürzer sein könnte, wenn Sie das erste ',!' Zeichen in der R-Anweisung (aus STDIN gelesen); das fügt einen Wagenrücklauf zwischen der Eingabe und der Ausgabe hinzu. Wäre dies nicht der Fall, wäre die Ausgabe technisch korrekt, die erste Zeile würde jedoch an die Eingabezeichenfolge angehängt.[[Das von mir verwendete Standard-Mumps-Terminal hat kein lokales Echo. ]] Wie es sitzt, hier ist der Test:
Beachten Sie auch, dass zwischen '123' und '6' am Ende der Eingabe ein Wagenrücklauf / Eingabe-Tastendruck erfolgt. [[Wieder das lokale Echo. ]]
Wenn jemand interessiert ist, kann ich beschreiben, was mit dem Code los ist. aber mir ist klar, dass es nicht viele Mumps-Enthusiasten gibt ... :-)
quelle
PowerShell, 102 Bytes
Wird wie folgt aufgerufen (wenn in Datei gespeichert
CodeGolf55051.ps1
)Frühere Versuche
(länger oder ungültig)
PowerShell, 110 Bytes
PowerShell, 111 Bytes
Erläuterung
PowerShell, 180 Bytes
PowerShell, 196 Bytes
Erläuterung
(
{...}
In den obigen Kommentaren steht eigentlich{0}|{1}|{2}
; ich setze{...}
auf bessere Lesbarkeit.Powershell, 120 Bytes (ungültig)
quelle
param($s,$i)$s+' '*($i-$s.Length%$i)-replace'(.{4})?(.)(.)(.)(.)',"`$1`n`$5`$4`$3`$2`n"-split"`n"|?{$_-ne""}
der Sie zu 108 herunterkommen[$r]
Index tauschen, um den Fluss in die richtige Richtung zu bringen. Andernfalls[-not$r]
lautet die erste Zeile anders (dh von rechts nach links) als in den bereitgestellten Beispielen. Ansonsten wirklich geschickte Ausführung!n
positiv ist , und wir sind garantiert , dass die Länge der Saite nicht negativ ist (per Definition), das heißt,(($i-$l%$i)%i)
auf äquivalente ist($i-$l%$i)
, spart vier Zeichen.(-$l)%$i
. Ich weiß nicht, woher das kommt. Interessant ist jedoch, dass es nicht gleichwertig ist, obwohl es sein sollte. Es ist anscheinend eine Eigenheit, wie PowerShell (unter anderem) die Modulo-Funktion implementiert, die sich von der von mir (als Hauptfach Mathematik) oder von Wolfram-Alpha erwarteten unterscheidet. Anscheinend musst du bei der längeren Version bleiben. Referenznachweis ->((y-x%y)%y) ==> ((y%y)-(x%y%y))%y ==> ((0)-(x%y))%y ==> (-x%y)%y ==> (-x)%y
Clojure, 83 Bytes,
87 Bytes,79 BytesMehrere Korrekturen nach Kommentaren unten, danke Ørjan .
Probieren Sie es online!
Clojure scheint in Code-Golf-Antworten oft leider nicht vorzukommen. Es kann sicherlich nicht mit Golf-Sprachen in Byte-Länge konkurrieren, aber ich denke, die völlige Abwesenheit ist etwas ungerechtfertigt.
Erläuterung:
s
es in eine Folge von Zeichenlisten Chunking , wo die Listen Länge habenn
. Der letzte Block wird mit Leerzeichen der Länge nachn
mit der "Pad-Sammlung" aufgefüllt , die von zurückgegeben wird(repeat " ")
der eine unendliche Folge von Leerzeichen zurückgegeben wird#(..)
)#(or %)
die wie die Identitätsfunktion und umgekehrt (dh[#(or %) reverse #(or %) reverse ...]
) funktionieren, wie sie vom Zyklus zurückgegeben werden .#(apply ...)
:identity
oderreverse
abwechselnd einen Chunk an. Dies erfolgt über den(% %2)
Ausdruck, der die als erstes Argument an die anonyme Funktion gesendete Funktion aufruft [dhidentity
oderreverse
], wobei das zweite Argument [dh der Block] an die anonyme Funktion als Argument für den Aufruf verwendet wird.(apply str ...)
auf, um die Liste der Zeichen in eine Zeichenfolge umzuwandelnEin Trick, den wir hier anwenden, ist, dass viele Clojure-Funktionen
map
eine beliebige Anzahl von Sammlungen als(map f coll1 coll2 coll3 ...)
Argumente annehmen , dh, die Funktion f muss nur so viele Argumente akzeptieren, wie es Sammlungen gibt. In diesem Fall senden wir zwei Sammlungen, eine Sammlung alternierender Funktionsreferenzen und die zerlegte Zeichenfolge.quelle
ld!
.fn
oderdefn
ist in Ordnung.) Auf der anderen Seite kann Ihre Funktion nur das Ergebnis zurückgeben, anstatt es zu drucken.APL (Dyalog Unicode) , 19 Byte
Probieren Sie es online!
Nahm den
⊢∘⌽\
Trick von ngns brillanter Antwort auf die Herausforderung der Boustrophedonise .Nachdem ich festgestellt habe, dass meine Übermittlung für Zeilen mit führenden Zeilenumbrüchen unterbrochen wird, habe ich zwei weitere Bytes hinzugefügt. Unten ist die ältere Vorlage.
APL (Dyalog Unicode) , 17 Byte
Probieren Sie es online!
quelle
Python 3,
110108107103 Bytes(auf andere Antworten schauend), mit
rjust
:95939290 Bytesquelle
PHP, 135 Bytes
Nimmt zwei Befehlszeilenargumente wie mit gezeigt an
$argv
.quelle
CoffeeScript, 131 Bytes
Das scheint zu lang.
quelle
Julia, 104 Bytes
Ungolfed:
quelle
Python 3, 101 Bytes
Probieren Sie es hier aus
quelle
q, 46
.
quelle
{-1@[l;(&)(til(#)l:y cut x)mod 2;'[neg[y]$;|:]];}
(49 Byte). Danke für die Inspiration! :)Q
6456 Bytes{}
ist eine Funktion, die als aufgerufen werden sollte{}[x;y]
.x
wird die Zeichenfolge sein.y
wird die Länge der resultierenden Linien sein.Prüfung:
edit : Verwendet kürzere Funktionen, inspiriert von der anderen q Antwort von @tmartin
quelle
Python 2,
8275 BytesIch konnte @willem nicht kommentieren, aber ich habe seinen Code verkleinert.
VersuchenSie es hierVersuchenSie es hierquelle
Perl, 72 Bytes
70 Bytes plus 2 Bytes für
-p0
.Demo:
Beachten Sie, dass die von STDIN gelesene Eingabe nicht mit einer neuen Zeile enden kann (dies würde 2 zusätzliche Bytes kosten).
Erläuterung:
quelle
JavaScript ES6, 123 Byte
Aufruf mit
t(input_string, twist_length)
, der die Ausgabezeichenfolge zurückgibt.quelle
Perl 5 , 51 Bytes
Probieren Sie es online!
quelle
Rubin, 80
Online-Demo: http://ideone.com/w6o8PI
quelle
Kaffeeskript, 151 Bytes
Zu viel = (
quelle
Bash,
8374Dies wechselt zwischen
cat
undrev
für Teilzeichenfolgen des ersten Arguments mit einer Länge des zweiten Arguments.Zu den verwendeten Sondervariablen gehören
${#1}
(die Länge der Zeichenfolge$1
)((i/$2%2))
(Ein arithmetischer Ausdruck, der den Inkrementor$i
durch$2
das Modulo dividiert und dann verwendet, um ungerade und gerade Werte zu bestimmen, die vorschreiben, ob ein Inkrementor verwendet werden soll oder nichtrev
)${1:i:$2}
(Teilstring von$1
ab Position$i
mit einer Länge von$2
).quelle
bash
Antwort gemacht, die ich gerade erst gesehen habe. Wir haben praktisch die gleiche Logik. ... eigentlich ließ mich viktorahlströms antwort nur 9 weitere zeichen abschneiden.JavaScript ES6, 113 Bytes
Nur mein eigener Riss bei meiner eigenen Frage. Es wird Leerzeichen hinzufügen, so dass es teilbar ist
n
, auf diese Weise wird es einfach geteilt und umgekehrt.quelle