Le mot peut-il être tapé avec des touches adjacentes?

13

Avant de lire ceci, je suggère de lire ce petit puzzle: /puzzling/11408/longest-word-with-adjacent-letters-on-a-keyboard

Je veux que vous fassiez un programme qui prend un argument, un mot (uniquement des lettres minuscules), et génère "Oui" si le mot peut être tapé avec des touches adjacentes sur le clavier (voir l'article) et "Non" si le mot peut 't être tapé avec des lettres adjacentes.

Voici la disposition du clavier utilisée dans ce défi:

 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
 | Q | W | E | R | T | Y | U | I | O | P |
 └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┘
   | A | S | D | F | G | H | J | K | L |
   └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┘
     | Z | X | C | V | B | N | M |
     └───┴───┴───┴───┴───┴───┴───┘

N'oubliez pas: il s'agit de codegolf, donc la réponse la plus courte l'emporte!

Loovjo
la source
Pouvons-nous supposer que l'entrée se compose uniquement de lettres? Peut-on supposer qu'ils sont tous donnés dans un seul cas?
Martin Ender
2
Je suis confus par ceci: "Deux clés adjacentes peuvent avoir au maximum 1,5 * l'espace d'une clé entre elles." Les clés adjacentes sont sûrement adjacentes, c'est-à-dire qu'elles n'ont pas d'espace entre elles, comme dans le puzzle lié?
Luke
Comment prendre argument? STDIN? Une fonction?
theonlygusti

Réponses:

9

Pyth, 66

?"Yes".Am>2sm^-.uk2Cm.Dx"qwertyuiopasdfghjkl*zxcvbnm"b9.5dC,ztz"No

Essayez-le ici.

J'ai été surpris d'apprendre que Pyth n'a pas de fonction d'hypoténuse, donc cela sera probablement battu par un langage différent. Je proposerai une fonction d'hypoténuse à Pyth, donc cette atrocité ne se produira pas à l'avenir.

Explication

Je transforme le clavier en ceci:

┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
| Q | W | E | R | T | Y | U | I | O | P |
└─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┐
  | A | S | D | F | G | H | J | K | L | * |
  └─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┴───┘
    | Z | X | C | V | B | N | M |
    └───┴───┴───┴───┴───┴───┴───┘

Que j'encode ensuite comme "qwertyuiopasdfghjkl*zxcvbnm". Ensuite, j'ai utilisé divmod avec modulo 9.5 pour déterminer les coordonnées 2D de chaque touche. Ensuite, je calcule les distances entre les touches consécutives et vérifie si la distance au carré <2.

orlp
la source
3

CJam, 83 75 74 octets

l_1>]z["qwertyuiop asdfghjkl  zxcvbnm "[__B>]z+s_W%+_]zsf{\#)}:*"Yes""No"?

Essayez-le en ligne.

Explication

L'approche générale consiste à produire une grande chaîne d'adjacence contenant chaque paire de caractères de clavier adjacents, puis à vérifier que chaque paire de caractères d'entrée adjacents est contenue dans cette chaîne.

Je suis assez content de la façon dont j'ai réussi à construire la chaîne d'adjacence, qui utilise une logique très simple et compacte.

l_1>]z          "Read a line of input and create a list of every pair of
                 adjacent input characters. There will be a trailing element
                 of just the final character, but that's okay since any single
                 lowercase letter can be found in the adjacency string.";
["qwertyuiop asdfghjkl  zxcvbnm "
              "^ Create the in-row forward adjacency string.";
[__B>]z         "Create the alternating-row forward adjacency string by
                 interleaving the in-row string with a substring of itself
                 starting with the middle row letters:
                   'q w e r t y u i o p   a s d f g h j k l  zxcvbnm '
                 + ' a s d f g h j k l     z x c v b n m  '[no interleave here]
                 -----------------------------------------------------
                   'qawsedrftgyhujikolp   azsxdcfvgbhnjmk l  zxcvbnm '";
+s              "Append the alternating-row forward adjacency string to the
                 in-row forward adjacency string.";
_W%+            "Append the reverse of the forward adjacency string (the
                 backward adjacency string) to the forward adjacency string.";
_]zs            "Double every character in the adjacency string so every
                 character is adjacent to itself.";
f{\#)}          "Map each pair of input characters to its 1-indexed location in
                 the adjacency string (0 if not found).";
:*              "Calculate the product of each pair's location in the adjacency
                 string. This will be nonzero if and only if every pair of
                 input characters are in fact adjacent.";
"Yes""No"?      "If the product is nonzero, produce 'Yes'; otherwise, produce
                 'No'.";
                "Implicitly print the result.";
Runer112
la source
Voilà, j'apprends CJam.
Soham Chowdhury
@octatoan On dirait que nous ferions tous les deux mieux d'apprendre Pyth. : P
Runer112
Haha, peut-être dans ce cas, oui.
Soham Chowdhury
2

J, 77 octets

No`Yes{::~[:*/2>+/"1@(2|@-/\3(|,.<.@%~+-:@|)'qazwsxedcrfvtgbyhnujmikXolX'i.])

Usage:

   f=.No`Yes{::~[:*/2>+/"1@(2|@-/\3(|,.<.@%~+-:@|)'qazwsxedcrfvtgbyhnujmikXolX'i.])

   f 'redresser'
Yes
   f 'qwergy'
No
   f 'ppcg'
No

Méthode:

Pour chaque lettre d'entrée, je génère sa coordonnée 2D (similaire à l'image de la question) en fonction de son index dans la chaîne 'qazwsxedcrfvtgbyhnujmikXolX'. Pour chaque paire de lettres dans l'entrée, je vérifie si la distance Manhattan de leurs coordonnées est inférieure à 2. Si toutes le sont, je les émets Yes, Nosinon (en abusant de l'opérateur `).

Essayez-le en ligne ici.

randomra
la source
Tu as oublié la lettre p.
mbomb007
@ mbomb007 Pour les caractères non trouvés, l' i.opérateur retourne le index of the last element + 1afin que je puisse enregistrer 1 octet en n'écrivant pas pet toujours obtenir son index correct.
randomra
1

CJam, 75

r(1$+]z[1AB]"qwertyuiop asdfghjkl  zxcvbnm"f/:zSff+s_W%+f{\_|#}W&"No""Yes"?

Essayez-le ici ( Firefox ici ).

Oublié la partie Oui / Non ... Fixé.

jimmy23013
la source