¿Se puede escribir la palabra con teclas adyacentes?


13

Antes de leer esto, sugiero leer este pequeño rompecabezas: /puzzling/11408/longest-word-with-adarest-letters-on-a-keyboard

Quiero que cree un programa que tome un argumento, una palabra (solo letras minúsculas) y que muestre "Sí" si la palabra se puede escribir con teclas adyacentes en el teclado (vea el artículo) y "No" si la palabra puede No se escriba con letras adyacentes.

Aquí está la distribución del teclado utilizada en este desafío:

 ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
 | 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 |
     └───┴───┴───┴───┴───┴───┴───┘

Recuerda: este es codegolf, ¡así que gana la respuesta más corta!


¿Podemos suponer que la entrada consiste solo en letras? ¿Podemos suponer que todos se dan en un solo caso?
Martin Ender

2
Estoy confundido por esto: "Dos teclas adyacentes pueden tener como máximo 1.5 * el espacio de una tecla entre ellas". ¿Seguramente las teclas adyacentes son realmente adyacentes, es decir, no tienen espacio entre ellas, como en el rompecabezas vinculado?
Lucas

¿Cómo tomar una discusión? STDIN? ¿Una función?
theonlygusti

Respuestas:


9

Pyth, 66

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

Pruébalo aquí.

Me sorprendió saber que Pyth no tiene una función de hipotenusa, por lo que probablemente sea superado por un idioma diferente. Propondré una función de hipotenusa a Pyth, para que esta atrocidad no suceda en el futuro.

Explicación

Transforme el teclado en esto:

┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
| 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 luego codifico como "qwertyuiopasdfghjkl*zxcvbnm". Luego usé divmod con módulo 9.5 para descubrir las coordenadas 2D de cada tecla. Luego calculo las distancias entre teclas consecutivas y verifico si la distancia al cuadrado <2.


3

CJam, 83 75 74 bytes

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

Pruébalo en línea.

Explicación

El enfoque general es producir una gran cadena de adyacencia que contenga cada par de caracteres de teclado adyacentes y luego verificar que cada par de caracteres de entrada adyacentes esté contenido en esa cadena.

Estoy bastante contento con la forma en que logré construir la cadena de adyacencia, que utiliza una lógica muy simple y compacta.

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.";

Eso es todo, estoy aprendiendo CJam.
Soham Chowdhury

@octatoan Parece que ambos estaríamos mejor aprendiendo Pyth, sin embargo. : P
Corredor112

Jaja, tal vez en este caso, sí.
Soham Chowdhury

2

J, 77 bytes

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

Uso:

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

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

Método:

Para cada letra de entrada que genero es su coordenada 2D (similar a la imagen en la pregunta) en función de su índice en la cadena 'qazwsxedcrfvtgbyhnujmikXolX'. Por cada par de letras en la entrada, verifico si sus coordenadas 'Manhattan-distance es menor que 2. Si todas son, salgo Yes, de lo Nocontrario (abusando del operador').

Pruébelo en línea aquí.


Olvidaste la carta p.
mbomb007

@ mbomb007 Para los caracteres no encontrados, el i.operador devuelve el index of the last element + 1para que pueda guardar 1 byte al no escribir py aún así obtener su índice correcto.
randomra

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.