CJam, 44 42 40 байт
qN+ee_{Xa/~\+XW=eu__el=!\'@-*m<Xa+}fXWf=
Вихідні дані містять зворотний канал.
Перевірте це тут.
Пояснення
Замість переміщення літер через рядок я кілька разів виймаю букву, відповідно обертаю рядок, а потім знову вставляю літеру. Для цього є одна увага: нам потрібно вміти відрізнити початок рядка від кінця рядка (чого ми не можемо після простого обертання). Ось чому ми вставляємо подачу рядка в кінці як захист (лист перед передачею рядків - це кінець рядка, буква після - це початок). Бонус полягає в тому, що це автоматично повертає остаточний рядок до правильного обертання, коли фактично передача рядка знаходиться в кінці рядка.
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
Мені подобається той останній. :)