CJam, 44 42 40 Bytes
qN+ee_{Xa/~\+XW=eu__el=!\'@-*m<Xa+}fXWf=
Die 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.
lN+ e# Read input and append a linefeed.
ee e# Enumerate the array, so input "bob" would become [[0 'b] [1 'o] [2 'b] [3 N]]
e# This is so that we can distinguish repeated occurrences of one letter.
_{ e# Duplicate. Then for each element X in the copy...
Xa/ e# Split the enumerated string around X.
~ e# Dump the two halves onto the stack.
\+ e# Concatenate them in reverse order. This is equivalent to rotating the current
e# character to the front and then removing it.
XW= e# Get the character from X.
eu e# Convert to upper case.
_ e# Duplicate.
_el=! e# Check that convert to lower case changes the character (to ensure we have a
e# letter).
\'@- e# Swap with the other upper-case copy and subtract '@, turning letters into 1 to
e# 26 (and everything else into junk).
* e# Multiply with whether it's a letter or not to turn said junk into 0 (that means
e# everything which is not a letter will be moved by 0 places).
m< e# Rotate the string to the left that many times.
Xa+ e# Append X to the rotated string.
}fX
Wf= e# Extract the character from each pair in the enumerated array.
Betrachten Sie die letzte Iteration des hi*bye
Beispiels, um festzustellen, warum dies an der richtigen Position endet . Nachdem wir die verarbeitet haben e
, befindet sich die aufgezählte Zeichenfolge an der folgenden Position:
[[4 'y] [6 N] [2 '*] [0 'h] [1 'i] [3 'b] [5 'e]]
Zuerst teilen wir uns den Zeilenvorschub auf und verketten die Teile in umgekehrter Reihenfolge:
[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y]]
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:
[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y] [6 N]]
Einige zusätzliche Ergebnisse, wenn jemand längere Testfälle vergleichen möchte:
Hello, World!
,W oeHlo!lrld
Programming Puzzles & Code Golf
ago fgliPomomnrr elP& uC dezzsG
The quick brown fox jumps over the lazy dog
t eg chbi ko qfTounyzrj omw epx ueoahs rlvd
abcdefghijklmnopqrstuvwxyz
aqbrcdsetfguhivjwklxmnyozp
zyxwvutsrqponmlkjihgfedcba
abcdefghijklmnopqrstuvwxyz
Ich mag den letzten. :)