편지, 움직여!


35

문자열이 주어지면 각 문자 (첫 글자부터 시작)를 알파벳 위치로 이동해야합니다. 줄 끝에 도달하면 감싸 야합니다. 비 레터는 이동할 필요가 없습니다.

예:

Dog

D알파벳의 네 번째 문자이므로 오른쪽으로 네 자리 이동합니다. 줄 바꿈 후 문자열이로 변경됩니다 oDg. o15 번째 문자, (15 mod 3) = 0이므로 움직이지 않습니다. g는 7 번째 문자-(7 mod 3) = 1이므로 문자열은 goD입니다.

hi*bye

  • h8 번째 글자입니다. 8 자리 이동하십시오- hi*bye=>i*hbye
  • i9 번째 글자입니다. 9 자리 이동하세요- i*hbye=>*hbiye
  • b두 번째 글자입니다. 2 자리 이동하십시오- *hbiye=>*hiybe
  • y25 번째 글자, 25 자리로 이동- *hiybe=>*hibye
  • e다섯 번째 글자입니다, 5 자리 이동하십시오- *hibye=>*hibey

비 레터는 이동할 필요는 없지만 여전히 공간을 차지합니다.

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

독립형 프로그램을 수행해야합니까, 아니면 기능이 충분합니까? 또한 문자열을 인쇄해야합니까?
Katenkyo

입력에 어떤 문자가 나타날 수 있습니까? 인쇄 가능한 ASCII? 줄 바꿈? ASCII가 있습니까? 유니 코드?
Martin Ender

3
또한 반복되는 글자가있는 테스트 케이스가 좋습니다.
Martin Ender

@Martin 모든 ASCII.
geokavel

@Katenkyo 기능이 허용됩니다. 함수를 사용하는 경우 출력이 리턴 값입니다.
geokavel

답변:


6

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

나는 그 마지막을 좋아합니다. :)


Pyth는 목록에 절단 목록이 필요합니다.
isaacg

@isaacg Nah, 나는 그렇지 않다고 확신합니다. ;)
Martin Ender

여러 줄 문자열을 지원하도록 만들 수 있습니까?
geokavel

@geokavel 아 맞아.
Martin Ender

다스 뷔 트너는 기뻐한다.
geokavel

4

루비 125130132139 바이트

->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*''}

테스트를 통한 온라인 데모 : http://ideone.com/GYJm2u

초기 (교체되지 않은 버전) : http://ideone.com/gTNvWY

편집 : 그의 제안에 대한 manatwork 덕분에 큰 감사합니다 !

편집 2 : 고정 문자 수 (처음에는 CRLF 줄 끝을 세고있었습니다.)


간신히 테스트 : c.upcase.ord-64c.ord%32.
manatwork

@manatwork 감사합니다!
Cristian Lupascu

다시 찾고… 잠깐! a.join??? 당신은 누구이며 당신은 w0lf로 무엇을 했습니까? 그는 확실히 그것을 다음과 같이 쓸 것 a*''입니다.
manatwork

@manatwork :) 나는 while ... end그것을 잊어 버린 내 코드에 대해 너무 화가났다 . 알아 주셔서 감사합니다!
Cristian Lupascu

당신은을 켤 수 없습니다 while ... end(...)while ...?
Martin Ender

3

파이썬 3 278 275 273 270 260 267 249 248 243 238 바이트

나는 이것을 정말로 더 잘 골라 내야 한다. 그러나 논리에 대한 그의 도움을 위한 katenkyo 와 골프에 대한 그들의 도움을위한 CyoceMego 에 감사하는 나의 해결책이 여기있다 .

편집 : 마침내, 나는 그것을 하나의 비교 진술로 내 렸습니다. 우와! (그리고 그래, 나는 그것을 움직일 수 z=-za,m=m,a비트,하지만 바이트 저장하지 않습니다 그리고 내가 생각 필요한 것보다 더 많은 코드를 뒤죽박죽)

편집 : 바이트 수가 해제되었습니다.

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())

언 골프 드 :

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())

나는 * * 그 생각 p[j][0]설정하여 감소시킬 수 J=p[j];인스턴스를 한 후, 시작 부분에 교체 p[j][0]P[0]
Cyoce

@Cyoce 문제는 할당 된 p변수가 아니라 직접 편집해야 p[j]한다는 것입니다. 또한 개정 내역 k = p[j][0]a<=k<=m보면 비교할 변수 가 있지만 을 사용하여 저장 한 것보다 k여분의 줄에서 들여 쓰기에 더 많은 바이트를 저장했기 때문에 삭제 가 더 나은 것으로 나타났습니다 . kk
Sherlock9
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.