CJam, 44 42 40 bayt
qN+ee_{Xa/~\+XW=eu__el=!\'@-*m<Xa+}fXWf=
Çıktı izleyen bir satır beslemesi içeriyor.
Burada test et.
açıklama
Harfleri dizgiden geçirmek yerine, sürekli olarak bir harfi kaldırırım, dizgiyi uygun şekilde döndürür ve sonra mektubu yeniden yerleştiririm. Bunu yapmak için bir yakalama var: dizenin başlangıcını dizenin sonundan (basit bir döndürmeden sonra yapamayacağımız) ayırt edebilmemiz gerekir. Bu nedenle, sonuna bir satır başı besleme olarak yerleştiriyoruz (satır başlangıcından önceki harf dizgenin sonu, başlangıçtan sonraki harf). Bonus Bu otomatik satır besleme gerçekte doğru rotasyona son dize döndürür olmasıdır olduğu dizenin sonunda.
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.
Bunun neden doğru konumda durduğunu görmek için, hi*bye
örneğin son yinelemesini dikkate alın . e
İşlemi tamamladıktan sonra , numaralandırılan dize şu konumdadır:
[[4 'y] [6 N] [2 '*] [0 'h] [1 'i] [3 'b] [5 'e]]
İlk önce, kalıbın etrafına ayrılır ve parçaları ters sırayla birleştiririz:
[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y]]
Satırlar şimdi bu dizginin başında veya sonunda olur. Ancak satır besleme sadece dizenin sonunu işaretleyen bir koruma olduğundan , bu karakterlerin aslında doğru sırada olduğu anlamına gelir. Şimdi satır beslemesi bir harf değildir, böylece dizi hiç döndürülmez. Böylece, çizgi akışını eklediğimizde, ait olduğu yere gider ve aradığımız her şey aradığımız sırada olur:
[[2 '*] [0 'h] [1 'i] [3 'b] [5 'e] [4 'y] [6 N]]
Birisi daha uzun test durumlarını karşılaştırmak istiyorsa bazı ek sonuçlar:
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
Sonuncusunu beğendim. :)