Traversez un clavier


21

Étant donné un mot (ou toute séquence de lettres) en entrée, vous devez interpoler entre chaque lettre de sorte que chaque paire de lettres adjacente dans le résultat soit également adjacente sur un clavier QWERTY, comme si vous tapiez l'entrée en marchant sur un clavier géant. Par exemple, « oui » pourrait devenir « y tr es », « chat » pourrait devenir « c xz a wer t ».

Règles:

  • Voici le format de clavier que vous devez utiliser:

    qwertyuiop
    asdfghjkl
      zxcvbnm

    Toute paire de touches qui touche dans cette disposition est considérée comme adjacente. Par exemple, «s» et «e» sont adjacents, mais «s» et «r» ne le sont pas.

  • Le "mot" d'entrée sera composé de n'importe quelle séquence de lettres. Il n'aura que des lettres, vous n'aurez donc pas à vous occuper des caractères spéciaux.
  • L'entrée peut être sous n'importe quelle forme pratique: stdin, une chaîne, une liste, etc. La casse des lettres n'a pas d'importance; vous pouvez prendre ce qui vous convient le mieux.
  • La sortie peut être sous n'importe quelle forme pratique: stdout, une chaîne, une liste, etc. La casse des lettres n'a pas d'importance et n'a pas besoin d'être cohérente.
  • Tout chemin sur le clavier est valide, sauf que vous ne pouvez pas croiser à nouveau la lettre précédente avant de passer à la lettre suivante. Par exemple, « hi » pourrait devenir « h j i » ou « h jnbgyu i », mais pas « h b h u i ».
  • Une lettre n'est pas adjacente à elle-même, donc « sondage » ne peut pas devenir « sondage ». Au lieu de cela, il devrait devenir quelque chose comme « pol k l ».
  • Aucune lettre de sortie n'est autorisée avant ou après le mot. Par exemple, « était » ne peut pas devenir «tre était » ou « était dfg».

C'est le golf de code, la réponse la plus courte en octets gagne.


Donc, nous émettons une «marche» valide par entrée? Il semble que ce serait mieux avec deux entrées, déterminez si c'est une marche valide.
Veskah

Il semble que ce dewqwertysoit un chemin valide pour dy. Pourriez-vous confirmer cela?
Arnauld

@Arnauld oui, ça l'est.
Vaelus

@Veskah C'est vrai; sortie toute marche valide pour une entrée. C'est pour permettre des optimisations qui pourraient ne pas être possibles si, par exemple, cela devait être une marche la plus courte.
Vaelus

Réponses:


6

Japt -g , 23 octets

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

Essayez-le en ligne!

Prend l'entrée comme un tableau de lettres majuscules. Très similaire aux autres réponses sinon.

Explication:

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

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

Essayez-le en ligne!

Parcourt le clavier entier jusqu'à ce que le mot soit écrit.


2
Comment se fait-il que import revient le code, pas avant?
BruceWayne

@BruceWayne Le re.findallserait évalué lors de l'exécution du lambda, donc l'importation après la définition du lambda est correcte. Cela étant dit, il est plus clair d'importer avant, il n'y a tout simplement pas besoin de le faire
pushkin

@pushkin ah, je ne le savais pas merci d'avoir clarifié! Avez-vous importé après juste comme préférence / choix personnel ou cela aide-t-il à compter des octets?
BruceWayne

2
@BruceWayne C'est un peu une convention pour ce forum. C'est juste pour que cela fonctionne avec la façon dont le site TiO organise le code. Essayez de cliquer sur "Essayez-le en ligne!" lien pour voir ce que je veux dire.
mypetlion

8

Python 2 , 274 octets (solution optimale)

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

-4 octets grâce à 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

Essayez-le en ligne!

Cette solution donne la sortie la plus courte possible. Le clavier est transformé en un graphique utilisé pour trouver le chemin le plus court pour calculer la chaîne de sortie:

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


1
@mypetlion u a fait une réduction importante, vous pouvez mettre à jour la réponse :)
mdahmoune


3

05AB1E , 43 octets

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

Pas le bon langage pour ce défi, car il ne peut pas utiliser l'expression régulière comme les autres réponses.

Essayez-le en ligne ou vérifiez tous les cas de test .

Explication:

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

Fusain , 48 octets

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

Essayez-le en ligne! Le lien est vers la version détaillée du code. Explication:

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

Obtenez la chaîne qwertyuioplkmjnhbgvfcdxsza.

≔⌕η§θ⁰ζ

Trouvez la position du premier caractère du mot. Cet index dépasse normalement le caractère qui vient d'être atteint, mais cette valeur simule la première itération de la boucle pour imprimer le premier caractère du mot.

Fθ

Faites une boucle sur chaque personnage.

F⊕﹪⁻⌕ηιζ²⁶«

Calculez le nombre de caractères à imprimer pour inclure le caractère suivant du mot et bouclez autant de fois.

§ηζ≦⊕ζ

Imprimer le caractère suivant indexé cycliquement et incrémenter l'index.


Avez-vous essayé de faire tourner la chaîne «qwertyuioplkmjnhbgvfcdxsza» et de voir si l'une des rotations est plus compressible? Je ne connais pas la compression du charbon de bois; ce n'est peut-être pas possible.
Vaelus

@Vaelus Je ne sais pas non plus alors j'ai essayé les 26 rotations mais elles se compressent toutes à 20 octets. Bien sûr, ce ne sont pas toutes les promenades possibles ...
Neil
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.