CJam, 44 42 40 ไบต์
qN+ee_{Xa/~\+XW=eu__el=!\'@-*m<Xa+}fXWf=
เอาท์พุทมี linefeed ต่อท้าย
ทดสอบที่นี่
คำอธิบาย
แทนที่จะย้ายตัวอักษรผ่านสายอักขระฉันลบตัวอักษรซ้ำ ๆ หมุนสายอักขระตามลำดับจากนั้นแทรกตัวอักษรอีกครั้ง มีสิ่งหนึ่งที่ต้องทำเช่นนี้: เราจำเป็นต้องแยกแยะจุดเริ่มต้นของสตริงจากจุดสิ้นสุดของสตริง (ซึ่งเราไม่สามารถทำได้หลังจากการหมุนแบบธรรมดา) นั่นเป็นเหตุผลที่เราแทรก linefeed ที่ท้ายเป็นการ์ด (ตัวอักษรก่อน linefeed คือจุดสิ้นสุดของสตริงตัวอักษรหลังจากที่มันเป็นจุดเริ่มต้น) โบนัสคือสิ่งนี้จะส่งคืนสตริงสุดท้ายโดยอัตโนมัติไปยังการหมุนที่ถูกต้องโดยที่ linefeed จริง ๆ แล้วจะอยู่ที่ส่วนท้ายของสตริง
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]]
อันดับแรกเราแบ่งแถว linefeed และต่อส่วนเข้าด้วยกัน:
[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y]]
linefeed ตอนนี้จะเป็นที่จุดเริ่มต้นหรือจุดสิ้นสุดของสตริงนี้ แต่เนื่องจากตัวป้อนบรรทัดเป็นเพียงตัวป้องกันที่ทำเครื่องหมายจุดสิ้นสุดของสายอักขระซึ่งหมายความว่าอักขระนั้นอยู่ในลำดับที่ถูกต้อง ตอนนี้ linefeed ไม่ใช่ตัวอักษรดังนั้นอาร์เรย์จะไม่หมุนเลย ดังนั้นเมื่อเราต่อท้าย linefeed มันจะไปที่ไหนและทุกอย่างอยู่ในลำดับที่เรากำลังมองหา:
[[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
ฉันชอบอันสุดท้าย :)