Bei einer gegebenen Zeichenfolge müssen Sie jeden Buchstaben (beginnend mit dem ersten Buchstaben) um seine Position im Alphabet verschieben. Wenn Sie das Ende der Zeichenfolge erreichen, müssen Sie sich umschließen. Nicht-Buchstaben müssen nicht verschoben werden.
Beispiel:
Dog
D
ist der vierte Buchstabe des Alphabets, also verschieben wir ihn um vier Stellen nach rechts. Nach dem Umbrechen ändert sich die Zeichenfolge in oDg
. o
ist der 15. Buchstabe, (15 mod 3) = 0, bewegt sich also nicht. g
ist der 7. Buchstabe - (7 mod 3) = 1, so wird die Zeichenfolge goD
.
hi*bye
h
ist der 8. Buchstabe, verschiebe ihn um 8 Stellen -hi*bye
=>i*hbye
i
ist der 9. Buchstabe, verschiebe ihn um 9 Stellen -i*hbye
=>*hbiye
b
ist der 2. Buchstabe, verschiebe ihn um 2 Stellen -*hbiye
=>*hiybe
y
ist der 25. Buchstabe, verschiebe ihn um 25 Stellen -*hiybe
=>*hibye
e
ist der 5. Buchstabe, verschiebe ihn um 5 Stellen -*hibye
=>*hibey
Nicht-Buchstaben müssen nicht verschoben werden, beanspruchen aber dennoch Speicherplatz.
cat
=>tca
F.U.N
=>.F.NU
mississippi
=>msiisppssii
Antworten:
CJam,
444240 BytesDie Ausgabe enthält einen nachfolgenden Zeilenvorschub.
Teste es hier.
Erläuterung
Anstatt die Buchstaben durch die Zeichenfolge zu bewegen, entferne ich wiederholt einen Buchstaben, drehe die Zeichenfolge entsprechend und füge den Buchstaben erneut ein. Dafür gibt es einen Haken: Wir müssen in der Lage sein, den Anfang der Zeichenkette vom Ende der Zeichenkette zu unterscheiden (was wir nach einer einfachen Drehung nicht können). Deshalb fügen wir am Ende einen Zeilenvorschub als Guard ein (Buchstabe vor dem Zeilenvorschub ist das Ende der Zeichenkette, Buchstabe nach dem Anfang). Der Bonus ist , dass diese automatisch die letzte Zeichenfolge in die richtige Rotation zurückkehrt , wo der Zeilenvorschub tatsächlich ist am Ende des Strings.
Betrachten Sie die letzte Iteration des
hi*bye
Beispiels, um festzustellen, warum dies an der richtigen Position endet . Nachdem wir die verarbeitet habene
, befindet sich die aufgezählte Zeichenfolge an der folgenden Position:Zuerst teilen wir uns den Zeilenvorschub auf und verketten die Teile in umgekehrter Reihenfolge:
Der Zeilenvorschub würde sich nun entweder am Anfang oder am Ende dieser Zeichenfolge befinden. Da der Zeilenvorschub jedoch nur ein Wächter ist, der das Ende der Zeichenfolge markiert , bedeutet dies, dass die Zeichen tatsächlich in der richtigen Reihenfolge sind. Jetzt ist der Zeilenvorschub kein Buchstabe, so dass das Array überhaupt nicht gedreht wird. Wenn wir also den Zeilenvorschub anhängen, geht er dahin, wo er hingehört, und alles ist in der Reihenfolge, nach der wir suchen:
Einige zusätzliche Ergebnisse, wenn jemand längere Testfälle vergleichen möchte:
Ich mag den letzten. :)
quelle
Ruby 125
130 132 139BytesOnline-Demo mit Tests: http://ideone.com/GYJm2u
Die Initiale (ungolfed version): http://ideone.com/gTNvWY
Edit: Vielen Dank an Manatwork für seine Vorschläge!
Edit 2 : feste Zeichenanzahl (Ich habe anfangs CRLF-Zeilenenden gezählt.)
quelle
c.upcase.ord-64
→c.ord%32
.a.join
??? Wer bist du und was hast du mit w0lf gemacht? Er würde es bestimmt so schreibena*''
.while ... end
dass ich vergessen habe, das zu tun. Danke fürs bemerken!while ... end
in(...)while ...
?Python 3,
278275273270260258249248243238 BytesIch sollte das wirklich besser runtergolfen, aber hier ist meine Lösung, danke an runtergolfen katenkyo für seine Hilfe bei der Logik und an Cyoce und Mego für ihre Hilfe beim Golfen.
Edit: Endlich habe ich es auf eine Vergleichsanweisung gebracht. WOO! (Und ja, ich könnte das
z=-z
in eina,m=m,a
Bit verschieben, aber das spart keine Bytes und verwirrt den Code mehr, als ich für notwendig hielt.)Bearbeiten: Bytezahl war aus.
Ungolfed:
quelle
p[j][0]
durch Einstellung reduziert werden kannJ=p[j];
am Anfang, dann ersetzt Instanzenp[j][0]
mitP[0]
p
direkt bearbeiten muss und keine Variable, die dieserp[j]
zugewiesen wurde. Wenn Sie sich meinen Revisionsverlauf ansehen, hatte ich zwar eine Variablek = p[j][0]
füra<=k<=m
Vergleiche, aber es stellte sich heraus, dass das Löschenk
besser war, weil ich mehr Bytes an Einzügen aus der zu setzenden zusätzlichen Zeilek
als mit gespeichert habek
.