키보드를 가로 질러 걸어


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.