Harfler, Harekete Geçin!


35

Bir dize verildiğinde, her harfi (ilk harften başlayarak) alfabedeki konumuna göre hareket ettirmelisiniz. İpin sonuna ulaşırsanız, etrafa sarmanız gerekir. Harf olmayanların taşınması gerekmez.

Örnek:

Dog

DAlfabedeki dördüncü harftir, bu yüzden sağa hareket ettiririz. Kaydırdıktan sonra dizeyi değiştirir oDg. o15. harf, (15 mod 3) = 0, yani hareket etmiyor. g7. harf - (7 mod 3) = 1, dize olur goD.

hi*bye

  • h8. harftir, onu 8 noktaya getirin - hi*bye=>i*hbye
  • i9'uncu harftir, 9 puntoyu hareket ettirin - i*hbye=>*hbiye
  • b2. harften, 2 noktaya getirin - *hbiye=>*hiybe
  • y25 harfidir, 25 puntayı hareket ettirin - *hiybe=>*hibye
  • e5. harftir, 5 noktaya taşıyın - *hibye=>*hibey

Harf olmayanların taşınması gerekmez, ancak yine de yer kaplarlar.

  • cat => tca
  • F.U.N => .F.NU
  • mississippi => msiisppssii

Bağımsız bir program mı yapmamız gerekiyor yoksa bir işlev yeterli mi? Ayrıca, dizgeyi yazdırmak zorunda mıyız?
Katenkyo

Girişte hangi karakterler görünebilir? Yazdırılabilir ASCII? Linefeeds? Herhangi bir ASCII? Unicode var mı?
Martin Ender

3
Ayrıca tekrarlanan harflerle yapılan bir test durumu iyi olacaktır.
Martin Ender

@Martin Herhangi bir ASCII.
geokavel

@Katenkyo işlevine izin verilir. Bir işlev kullanıyorsanız, çıktı dönüş değeridir.
geokavel

Yanıtlar:


6

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. :)


Pyth'un listede doğrama listesine ihtiyacı var.
isaacg

@isaacg Nah, olmadığından eminim. ;)
Martin Ender

Çok satırlı dizeleri desteklemesi için yapabilir misiniz?
geokavel

@geokavel Oh doğru, düzeltildi.
Martin Ender

Sith memnun, Darth Büttner.
geokavel

4

Ruby 125 130 132 139 bayt

->q{a=q.chars.map{|c|[c,c=~/[a-z]/i&&c.ord%32]}
while i=a.index{|c,s|s}
c,s=a.delete_at i
a.insert (i+s)%q.size,[c]
end
a*''}

Testlerle çevrimiçi demo: http://ideone.com/GYJm2u

İlk (ungolfed versiyonu): http://ideone.com/gTNvWY

Düzenleme: Önerileri için manatwork için büyük teşekkürler !

Düzenleme 2 : sabit karakter sayımı (başlangıçta CRLF satır sonlarını sayıyordum.)


Sadece zorlukla test edildi: c.upcase.ord-64c.ord%32.
Manat çalışması

@ manatwork Bu iyi çalışıyor, teşekkürler!
Cristian Lupascu

Tekrar bakıyor… Bekle! a.join??? Sen kimsin ve w0lf ile ne yaptın? Kesinlikle olarak yazardı a*''.
Manat çalışması

@ manatwork :) Kodumu girmeyi unuttuğum için çok üzüldüm while ... end. Fark ettiğiniz için teşekkürler!
Cristian Lupascu

Bunu açamıyorum while ... endiçine (...)while ...?
Martin Ender

3

Python 3, 278 275 273 270 260 258 249 248 243 238 bayt

Gerçekten golf bu aşağı daha iyi gerektiği, ama burada sayesinde benim çözümdür katenkyo mantığı ile yaptığı yardım için, ve Cyoce ve Mego golf ile yardım için.

Düzenleme: Sonunda, bir karşılaştırma ifadesine indirdim. WOO! (Ve evet, bu hareket olabilir z=-ziçine a,m=m,abiraz, ama bu bayt tasarruf yapmıyor ve düşündüğümden gerekli olandan daha fazla kod bulanık)

Düzenleme: Bayt sayısı kapalı idi.

def m(s):
 l=len(s);r=range(l);p=[[i,s[i]]for i in r]
 for i in r:
  if s[i].isalpha():
   a=p[i][0];p[i][0]=m=(a+ord(s[i])%32)%l;z=1
   if a>m:a,m=m,a;z=-z
   for j in r:p[j][0]-=z*(j!=i)*(a<=p[j][0]<=m) 
 return''.join(dict(p).values())

Ungolfed:

def move(string):
 length = len(string)
 places = [[i,string[i]]for i in range(length)]
 for index in range(length):
  char = string[index]
  if char.isalpha():
   a = places[index][0]
   mov = (a + ord(char)%32) % length
   places[index][0] = mov
   for j in range(length):
    k = places[j][0]
    if a <= k <= mov and j!=index:
     places[j][0]-=1
    elif mov <= k <= a and j != index:
     places[j][0]+=1
 return''.join(dict(places).values())

Ben * in * , başlangıçta p[j][0]ayarlayarak azaltılabileceğini J=p[j];, sonra örneklerini p[j][0]P[0]
10'da

@Cyoce Sorunun pdoğrudan düzenlemeye ihtiyacım olduğunu ve buna p[j]atanmış bir değişkeni değil. Ayrıca, revizyon geçmişime bakarsanız, karşılaştırmalar k = p[j][0]için bir değişkenim vardı a<=k<=m, ancak bırakmanın kdaha iyi olduğu ortaya çıktı, çünkü fazladan satırdan ayarlamak için girintilere daha fazla bayt kkaydettim k.
Sherlock 9
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.