CJam、44 42 40バイト
qN+ee_{Xa/~\+XW=eu__el=!\'@-*m<Xa+}fXWf=
出力には末尾の改行が含まれます。
ここでテストしてください。
説明
文字列内で文字を移動する代わりに、文字を繰り返し削除し、それに応じて文字列を回転させてから、文字を再挿入します。これを行うには、1つの落とし穴があります。文字列の先頭と文字列の末尾を区別できるようにする必要があります(単純な回転の後はできません)。これが、ガードとしてラインフィードを最後に挿入する理由です(ラインフィードの前の文字は文字列の終わりであり、その後の文字は始まりです)。ボーナスは、これは自動的に改行が実際に正しい回転の最終文字列を返すことである文字列の末尾を。
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.
これが正しい位置で終わる理由を見るために、hi*bye
例の最後の繰り返しを考えてください。を処理したe
後、列挙された文字列は次の位置にあります。
[[4 'y] [6 N] [2 '*] [0 'h] [1 'i] [3 'b] [5 'e]]
最初に、改行の周りで分割し、パーツを逆の順序で連結します。
[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y]]
改行は、この文字列の先頭または末尾になります。しかし、改行は文字列の終わりを示す単なるガードなので、これは文字が実際に正しい順序であることを意味します。改行は文字ではないため、配列はまったく回転しません。したがって、改行を追加すると、それが属する場所に移動し、すべてが探している順序になります:
[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y] [6 N]]
誰かがより長いテストケースを比較したい場合、いくつかの追加の結果:
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
最後の1つが好きです。:)