CJam, 44 42 40 byte
qN+ee_{Xa/~\+XW=eu__el=!\'@-*m<Xa+}fXWf=
Đầu ra chứa một linefeed trailing.
Kiểm tra nó ở đây.
Giải trình
Thay vì di chuyển các chữ cái qua chuỗi, tôi liên tục xóa một chữ cái, xoay chuỗi tương ứng và sau đó đặt lại chữ cái. Có một nhược điểm để làm điều này: chúng ta cần có khả năng phân biệt phần đầu của chuỗi với phần cuối của chuỗi (mà chúng ta không thể sau một vòng quay đơn giản). Đó là lý do tại sao chúng tôi chèn một nguồn cấp dữ liệu ở cuối như một người bảo vệ (chữ cái trước dòng cấp dữ liệu là phần cuối của chuỗi, chữ cái sau nó là phần đầu). Phần thưởng là điều này sẽ tự động trả về chuỗi cuối cùng cho phép xoay chính xác trong đó nguồn cấp thực sự nằm ở cuối chuỗi.
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.
Để xem tại sao điều này kết thúc ở đúng vị trí, hãy xem xét lần lặp cuối cùng của hi*bye
ví dụ. Sau khi chúng tôi xử lý e
, chuỗi liệt kê ở vị trí này:
[[4 'y] [6 N] [2 '*] [0 'h] [1 'i] [3 'b] [5 'e]]
Đầu tiên, chúng tôi phân chia xung quanh nguồn cấp dữ liệu và nối các phần theo thứ tự ngược lại:
[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y]]
Nguồn cấp dữ liệu bây giờ sẽ ở đầu hoặc cuối chuỗi này. Nhưng vì linefeed chỉ là một người bảo vệ đánh dấu sự kết thúc của chuỗi, điều này có nghĩa là các ký tự thực sự theo đúng thứ tự. Bây giờ linefeed không phải là một chữ cái, do đó, mảng không được xoay vòng. Do đó, khi chúng tôi nối thêm nguồn cấp dữ liệu, nó sẽ đi đến nơi nó thuộc về và mọi thứ theo thứ tự chúng tôi đang tìm kiếm:
[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y] [6 N]]
Một số kết quả bổ sung nếu ai đó muốn so sánh các trường hợp thử nghiệm dài hơ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
Tôi thích cái cuối cùng :)