Caminhe pelo teclado


21

Dada uma palavra (ou qualquer sequência de letras) como entrada, você deve interpolar entre cada letra para que cada par de letras adjacente no resultado também seja adjacente a um teclado QWERTY, como se você digitasse a entrada andando em um teclado gigante. Por exemplo, ' sim ' pode se tornar ' y tr es ', ' gato ' pode tornar-se ' c xz um wer t '.

Regras:

  • Este é o formato do teclado que você deve usar:

    qwertyuiop
    asdfghjkl
      zxcvbnm

    Qualquer par de teclas que toque nesse layout é considerado adjacente. Por exemplo, 's' e 'e' são compatíveis, mas 's' e 'r' não.

  • A entrada "palavra" consistirá em qualquer sequência de letras. Ele terá apenas letras, então você não precisa lidar com caracteres especiais.
  • A entrada pode estar em qualquer forma conveniente: stdin, uma string, uma lista etc. A caixa de letras não importa; você pode pegar o que for mais conveniente.
  • A saída pode estar em qualquer forma conveniente: stdout, uma string, uma lista etc. A caixa de letras não importa e não precisa ser consistente.
  • Qualquer caminho através do teclado é válido, exceto que você não pode cruzar a letra anterior novamente antes de chegar à próxima letra. Por exemplo, ' oi ' pode se tornar ' h j i ' ou ' h jnbgyu i ', mas não ' h b h u i '.
  • Uma carta não é adequada a si mesma; portanto, ' enquete ' não pode se tornar ' enquete '. Em vez disso, precisaria se tornar algo como ' pol k l '.
  • Nenhuma letra de saída é permitida antes ou depois da palavra. Por exemplo, ' was ' não pode se tornar 'tre was ' ou ' was dfg'.

Isso é código de golfe, a resposta mais curta em bytes vence.


Então, estamos produzindo qualquer 'caminhada' válida por entrada? Parece que seria melhor fornecer duas entradas, determinar se é uma caminhada válida.
Veskah

Parece que dewqwertyé um caminho válido para dy. Você poderia confirmar isso?
Arnauld

@ Arnauld sim, é.
Vaelus

@Veskah Isso mesmo; produzir qualquer caminhada válida para uma entrada. Isso permite otimizações que talvez não fossem possíveis se, por exemplo, tivesse que ser a caminhada mais curta.
Vaelus

Respostas:


6

Japonês -g , 23 bytes

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

Experimente online!

Aceita entrada como uma matriz de letras maiúsculas. Muito semelhante às outras respostas, caso contrário.

Explicação:

;                          :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

Python 2 , 83 bytes

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

Experimente online!

Anda no teclado inteiro até que a palavra seja escrita.


2
Como é que import revem depois do código, não antes?
precisa saber é o seguinte

@BruceWayne re.findallSeria avaliado quando o lambda for executado, portanto, importar após a definição do lambda está ok. Dito isto, é mais clara para importar antes, simplesmente não há necessidade de
Pushkin

@ ah pushkin, eu não sabia que obrigado por esclarecer! Você importou depois apenas como uma preferência / escolha pessoal ou ajuda na contagem de bytes?
precisa saber é o seguinte

2
@BruceWayne É um pouco de convenção para este fórum. É apenas para que ele funcione com a maneira como o site TiO organiza o código. Tente clicar no botão "Experimente online!" link para ver o que eu quero dizer.
mypetlion

8

Python 2 , 274 bytes (solução ideal)

296 300 302 308 315 319 324 327 328 430 432 bytes

-4 bytes graças ao mypetlion

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

Experimente online!

Esta solução oferece a menor saída possível. O teclado é transformado em um gráfico usado para encontrar o caminho mais curto para calcular a sequência de saída:

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


1
@mypetlion u fez uma redução importante, u pode atualizar a resposta :)
mdahmoune

4

JavaScript (ES6), 70 bytes

A mesma estratégia do TFeld.

s=>'qazsxdcfvgbhnjmklpoiuytrew'.repeat(s.length).match(s.join`.*?`)[0]

Experimente online!


3

05AB1E , 43 bytes

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

Não é o idioma certo para esse desafio, pois ele não pode usar regex como as outras respostas.

Experimente online ou verifique todos os casos de teste .

Explicação:

ü)               # 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

Carvão , 48 bytes

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

Experimente online! Link é a versão detalhada do código. Explicação:

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

Pegue a string qwertyuioplkmjnhbgvfcdxsza.

≔⌕η§θ⁰ζ

Encontre a posição do primeiro caractere da palavra. Normalmente, esse índice está além do caractere atingido, mas esse valor falsifica a primeira iteração do loop para imprimir o primeiro caractere da palavra.

Fθ

Faça um loop sobre cada caractere.

F⊕﹪⁻⌕ηιζ²⁶«

Calcule quantos caracteres imprimir para incluir o próximo caractere da palavra e loop tantas vezes.

§ηζ≦⊕ζ

Imprima o próximo caractere indexado ciclicamente e aumente o índice.


Você já tentou girar a string "qwertyuioplkmjnhbgvfcdxsza" e ver se alguma das rotações é mais compressível? Não estou familiarizado com a compressão do carvão vegetal; talvez isso não seja possível.
Vaelus

@ Vaelus Eu também não sei, então tentei todas as 26 rotações, mas todas elas compactam para 20 bytes. Naturalmente, aqueles que não são todos os possíveis passeios ...
Neil
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.