키보드를 가로 질러 걸어


21

단어 (또는 일련의 문자)를 입력으로 사용하면 마치 거대 키보드를 밟아 입력을 입력 한 것처럼 결과의 각 인접 문자 쌍이 QWERTY 키보드에도 인접하도록 각 문자 사이를 보간해야합니다. 예를 들어, ' 예 '가 될 수도 Y 그럴 필요가 ES ',' 고양이 '가 될 수있는' C XZ WER t '.

규칙 :

  • 사용해야하는 키보드 형식입니다.

    qwertyuiop
     asdfghjkl
      zxcvbnm

    이 레이아웃에서 터치하는 모든 키 쌍은 인접한 것으로 간주됩니다. 예를 들어, 's'와 'e'는 인접하지만 's'와 'r'은 인접하지 않습니다.

  • 입력 된 "단어"는 임의의 문자로 구성됩니다. 문자 만 포함되므로 특수 문자를 다루지 않아도됩니다.
  • 입력은 편리한 형태 일 수 있습니다 : stdin, 문자열, 목록 등. 대소 문자는 중요하지 않습니다. 더 편리한 것을 취할 수 있습니다.
  • 출력은 stdout, 문자열, 목록 등과 같은 편리한 형식 일 수 있습니다. 대소 문자는 중요하지 않으며 일관성이 없어도됩니다.
  • 다음 문자에 도달하기 전에 이전 문자를 다시 교차 할 수 없다는 점을 제외하고 키보드의 모든 경로가 유효합니다. 예를 들어, ' hi '는 ' h j i '또는 ' h jnbgyu i '가 될 수 있지만 ' h b h u i '는 될 수 없습니다.
  • 문자 자체는 인접하지 않으므로 ' 설문 조사 '는 ' 설문 조사 ' 가 될 수 없습니다 . 대신 ' pol k l ' 과 같은 것이되어야합니다 .
  • 단어 앞뒤에 출력 문자가 허용되지 않습니다. 예를 들어 ' was '는 'tre was '또는 ' was dfg' 가 될 수 없습니다 .

이것은 코드 골프이며 바이트 단위의 최단 답변입니다.


그래서 우리는 입력 당 유효한 'walk'를 출력하고 있습니까? 이것은 두 개의 입력이 주어지면 더 나은 것처럼 보이며 유효한 보행인지 결정하십시오.
— Veskah

에 dewqwerty대한 올바른 경로 인 것 같습니다 dy. 당신은 그것을 확인할 수 있습니까?
— Arnauld

@Arnauld 네, 그렇습니다.
— Vaelus

@Veskah 맞습니다; 입력에 대한 유효한 보행을 출력합니다. 예를 들어 가장 짧은 보행이 필요한 경우 불가능한 최적화가 가능합니다.
— Vaelus

답변:


6

Japt -g , 23 바이트

;D·ÎÔ+D·Årí)pUl)fUq".*?

온라인으로 사용해보십시오!

대문자 배열로 입력을받습니다. 그렇지 않으면 다른 답변과 매우 유사합니다.

설명:

;                          :Set D to the keyboard layout
 D·Î                       :Get the first row of keys
    Ô                      :Reversed
     +                     :Concat
      D·Å                  :The other two rows
         rí)               :Interleaved
            p              :Repeat that string
             Ul)           : A number of times equal to the length of the input
                f          :Get the substrings that match
                 U         : The input
                  q".*?    : joined with ".*?"
                           :Implicitly output just once of the matches

14

파이썬 2 , 83 바이트

lambda s:re.findall('.*?'.join(s),'qwertyuioplkmnjhbvgfcxdsza'*len(s))[0]
import re

온라인으로 사용해보십시오!

단어가 쓰여질 때까지 키보드 전체를 걷습니다.


2
import re코드가 어떻게 오게 되었습니까?
— BruceWayne

@BruceWayne re.findall람다가 실행될 때 평가되므로 람다 정의 후 가져 오기는 괜찮습니다. 즉, 이전에 수입하는 것이 더 명확하며, 필요가 없습니다
— pushkin

@ pushkin 아, 나는 명확히 해줘서 고마워하지 않았다! 개인 취향 / 선택으로 가져온 것이거나 바이트 수에 전혀 도움이 되었습니까?
— BruceWayne

2
@BruceWayne이 포럼에서는 약간의 규칙입니다. TiO 사이트가 코드를 구성하는 방식으로 작동하도록하기 위해서입니다. "온라인으로 사용해보십시오!"를 클릭하십시오. 무슨 뜻인지 알기 위해
— mypetlion

8

Python 2 , 274 바이트 (최적 솔루션)

296 300 302 308 315 319 324 327 328 430 432 바이트

mypetlion 덕분에 -4 바이트

from networkx import*
i=input()
M,z='qwertyuiop  asdfghjkl   zxcvbnm'.center(55),i[:1]
G=from_edgelist([(M[e],M[e+h])for h in[-1,1,11,12,-11,-12]for e in range(44)if' '!=M[e]and' '!=M[e+h]])
for y,x in zip(i,i[1:]):z+=[shortest_path(G,y,x)[1:],list(G[y])[0]+y][x==y]
print z

온라인으로 사용해보십시오!

이 솔루션은 가능한 가장 짧은 출력을 제공합니다. 키보드는 출력 문자열을 계산하기위한 최단 경로를 찾는 데 사용되는 그래프로 변환됩니다.

puzzles     --> poiuhbvcxzazxcvbhjklkiuytres
programming --> poiuytrtyuioijhgtresasdcvbnmkmkijnbg
code        --> cvbhjioijhgfde
golf        --> ghjiolkjhgf
yes         --> ytres
hi          --> hji
poll        --> polpl


1
@mypetlion u는 중요한 감소를 만들었습니다, u는 대답을 업데이트 할 수 있습니다 :)
— mdahmoune


3

05AB1E , 43 바이트

ü)Jε©žVćRs`.ιJ«D«Œʒg≠yн®нQyθ®θQ**}yªн¨}JIθ«

이 답변에 적합한 언어는 아닙니다. 다른 답변과 마찬가지로 정규식을 사용할 수 없기 때문입니다.

온라인으로 시도 하거나 모든 테스트 사례를 확인하십시오 .

설명:

ü)               # Split the input into overlapping pairs
                 #  i.e. "poll" → ["p","o"],["o","l"],["l","l"]]
  J              # Join each inner list together
                 #  i.e. ["p","o"],["o","l"],["l","l"]] → ["po","ol","ll"]
   ε             # Map each to:
    ©            #  Store the current value in the register
    žV           #  Push ["qwertyuiop","asdfghjkl","zxcvbnm"]
    ćR           #  Extract the head, and reverse it
                 #   i.e. ["qwertyuiop","asdfghjkl","zxcvbnm"] → "poiuytrewq"
    s`           #  Swap to take the remainder, and push them to the stack
      .ι         #  And then interweave them with each other
                 #   i.e. ["asdfghjkl","zxcvbnm"]
                 #    → ["a","z","s","x","d","c","f","v","g","b","h","n","j","m","k","l"]
        J        #  Join the list to a single string
                 #   i.e. → "azsxdcfvgbhnjmkl"
         «       #  Merge them together
                 #   i.e. "qwertyuiop" and "azsxdcfvgbhnjmkl"
                 #    → "poiuytrewqazsxdcfvgbhnjmkl"
          D«     #  Duplicate it, and append it to itself
                 #   i.e. "poiuytrewqazsxdcfvgbhnjmkl"
                 #    → "poiuytrewqazsxdcfvgbhnjmklpoiuytrewqazsxdcfvgbhnjmkl"
            Œ    #  Get all substrings of this strings
                 #   i.e. → ["p","po","poi",...,"k","kl","l"]
ʒ              } #  Filter this list by:
 g≠              #   Where the length is NOT 1 (otherwise pair "ll" would result in "l")
              *  #   and
   yн®нQ         #   Where the first character of the substring and pair are the same
             *   #   and
        yθ®θQ    #   Where the last character of the substring and pair are the same
                 #    i.e. "po" → []
                 #    i.e. "ll" → ["lazsxdcfvgbhnjmkl"]
yª               #  After filtering, append the current pair to the filtered list
                 #   i.e. [] → ["po"]
                 #   i.e. ["lazsxdcfvgbhnjmkl"] → ["lazsxdcfvgbhnjmkl","ll"]
  н              #  Get the first item
                 #   ["po"] → "po"
                 #   ["lazsxdcfvgbhnjmkl","ll"] → "lazsxdcfvgbhnjmkl"
   ¨             #  Remove the last character
                 #   i.e. "po" → "p"
                 #   i.e. "lazsxdcfvgbhnjmkl" → "lazsxdcfvgbhnjmk"
}                # Close the map
 J               # Join everything together
                 #  i.e. ["p","o","lazsxdcfvgbhnjmk"] → "polazsxdcfvgbhnjmk"
  Iθ«            # And append the last character of the input
                 # (and output the result implicitly)
                 #  i.e. "polazsxdcfvgbhnjmk" and "poll" → "polazsxdcfvgbhnjmkl"

3

숯 , 48 바이트

≔”&⌈″⌊5EWXVNa…-εW¶ζR”η≔⌕η§θ⁰ζFθF⊕﹪⁻⌕ηιζ²⁶«§ηζ≦⊕ζ

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 설명:

≔”&⌈″⌊5EWXVNa…-εW¶ζR”η

문자열을 가져옵니다 qwertyuioplkmjnhbgvfcdxsza.

≔⌕η§θ⁰ζ

단어의 첫 문자 위치를 찾으십시오. 이 색인은 일반적으로 방금 도달 한 문자보다 하나이지만이 값은 루프의 첫 번째 반복을 가짜로 만들어 단어의 첫 번째 문자를 인쇄합니다.

Fθ

각 문자를 반복합니다.

F⊕﹪⁻⌕ηιζ²⁶«

단어의 다음 문자를 포함하기 위해 인쇄 할 문자 수를 계산하고 여러 번 반복합니다.

§ηζ≦⊕ζ

주기적으로 색인화 된 다음 문자를 인쇄하고 색인을 늘리십시오.


문자열“qwertyuioplkmjnhbgvfcdxsza”를 회전하고 회전이 더 압축 가능한지 확인 했습니까? 나는 숯의 압축에 익숙하지 않다. 아마도 불가능할 수도 있습니다.
— Vaelus

@Vaelus 나도 몰라 26 회전을 모두 시도했지만 모두 20 바이트로 압축합니다. 물론, 모든 가능한 산책은 아닙니다 ...
— Neil
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.