A palavra pode ser digitada com teclas adjacentes uma à outra?

13

Antes de ler isso, sugiro ler este pequeno quebra-cabeça: /puzzling/11408/longest-word-with-adjacent-letters-on-a-keyboard

Quero que você crie um programa que aceite um argumento, uma palavra (apenas letras minúsculas) e emita "Sim" se a palavra puder ser digitada com as teclas adjacentes do teclado (consulte o artigo) e "Não" se a palavra puder seja digitado com letras adjacentes.

Aqui está o layout do teclado usado neste desafio:

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

Lembre-se: este é um codegolf, então a resposta mais curta ganha!

Loovjo
fonte
Podemos assumir que a entrada consiste apenas em letras? Podemos assumir que todos eles são dados em um único caso?
27615 Martin Ender
2
Estou confuso com isso: "Duas teclas adjacentes podem ter no máximo 1,5 * o espaço de uma chave entre elas". Certamente as teclas adjacentes são realmente adjacentes, ou seja, elas não têm espaço entre elas, como no quebra-cabeça vinculado?
Lucas
Como argumentar? STDIN? Uma função?
Theellygusti

Respostas:

9

Pyth, 66

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

Experimente aqui.

Fiquei surpreso ao saber que Pyth não tem uma função de hipotenusa, portanto isso provavelmente será superado por um idioma diferente. Vou propor uma função de hipotenusa a Pyth, para que essa atrocidade não aconteça no futuro.

Explicação

Eu transformei o teclado nisso:

┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐
| 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 eu codifico como "qwertyuiopasdfghjkl*zxcvbnm". Então eu usei o divmod com o módulo 9.5 para descobrir as coordenadas 2D de cada tecla. Depois, calculo as distâncias entre as teclas consecutivas e verifico se a distância ao quadrado <2.

orlp
fonte
3

CJam, 83 75 74 bytes

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

Experimente online.

Explicação

A abordagem geral é produzir uma grande sequência de adjacência contendo todos os pares de caracteres adjacentes do teclado e, em seguida, verificar se todos os pares de caracteres de entrada adjacentes estão contidos nessa sequência.

Estou muito feliz com o modo como consegui construir a cadeia de adjacência, que usa uma lógica muito simples e 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.";
Runer112
fonte
É isso, estou aprendendo CJam.
Soham Chowdhury
@octatoan Parece que é melhor nós dois aprendermos Pyth. : P
Runer112
Haha, talvez neste caso, sim.
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, eu gero a coordenada 2D (semelhante à imagem na pergunta) com base no índice da string 'qazwsxedcrfvtgbyhnujmikXolX'. Para cada par de cartas na entrada I verificar se as suas coordenadas Manhattan distância é menor do que 2. Se todos são, eu de saída Yes, Node outra forma (por abusar do `operador).

Experimente online aqui.

randomra
fonte
Você esqueceu a carta p.
mbomb007
@ mbomb007 Para caracteres não encontrados, o i.operador retorna o valor index of the last element + 1para que eu possa salvar 1 byte sem escrever pe ainda assim obter o índice correto.
Random3
1

CJam, 75

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

Experimente aqui ( Firefox aqui ).

Negligenciou a parte Sim / Não ... Corrigido.

jimmy23013
fonte