La parola è tipizzabile con i tasti vicini l'uno all'altro?


13

Prima di leggere questo consiglio di leggere questo piccolo puzzle: /puzzling/11408/longest-word-with-adjacent-letters-on-a-keyboard

Voglio che tu faccia un programma che accetta un argomento, una parola (solo lettere minuscole) e produca "Sì" se la parola può essere digitata con i tasti adiacenti sulla tastiera (vedi l'articolo) e "No" se la parola può non essere digitato con lettere adiacenti.

Ecco il layout di tastiera utilizzato in questa sfida:

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

Ricorda: questo è codegolf, quindi vince la risposta più breve!


Possiamo supporre che l'input sia composto solo da lettere? Possiamo presumere che siano tutti dati in un singolo caso?
Martin Ender,

2
Sono confuso da questo: "Due chiavi adiacenti possono avere al massimo 1,5 * lo spazio di una chiave tra di loro." Sicuramente le chiavi adiacenti sono in realtà adiacenti, cioè non hanno spazio tra loro, come nel puzzle collegato?
Luca,

Come discutere? STDIN? Una funzione?
theonlygusti,

Risposte:


9

Pyth, 66

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

Provalo qui.

Sono stato sorpreso di apprendere che Pyth non ha una funzione ipotenusa, quindi questo sarà probabilmente battuto da una lingua diversa. Proporrò una funzione ipotenusa a Pyth, quindi questa atrocità non accadrà in futuro.

Spiegazione

Trasformo la tastiera in questo:

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

Che poi codifico come "qwertyuiopasdfghjkl*zxcvbnm". Quindi ho usato divmod con modulo 9.5 per capire le coordinate 2D di ogni tasto. Quindi calcolo le distanze tra i tasti consecutivi e controllo se la distanza al quadrato <2.


3

CJam, 83 75 74 byte

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

Provalo online.

Spiegazione

L'approccio generale è quello di produrre una grande stringa di adiacenza contenente ogni coppia di caratteri di tastiera adiacenti e quindi verificare che ogni coppia di caratteri di input adiacenti sia contenuta in quella stringa.

Sono abbastanza contento di come sono riuscito a costruire la stringa di adiacenza, che utilizza una logica molto semplice e compatta.

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

Ecco, sto imparando CJam.
Soham Chowdhury,

@octatoan Sembra però che entrambi staremmo meglio imparando Pyth. : P
Runer112

Haha, forse in questo caso, sì.
Soham Chowdhury,

2

J, 77 byte

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

Metodo:

Per ogni lettera di input che genera la sua coordinata 2D (simile all'immagine nella domanda) in base al suo indice nella stringa 'qazwsxedcrfvtgbyhnujmikXolX'. Per ogni coppia di lettere nell'input, controllo se la distanza di Manhattan delle loro coordinate è inferiore a 2. Se tutto è, io output Yes,No contrario altrimenti (abusando dell'operatore).

Provalo online qui.


Hai dimenticato la lettera p.
mbomb007,

@ mbomb007 Per i caratteri non trovati l' i.operatore restituisce il carattere in index of the last element + 1modo che io possa salvare 1 byte non scrivendo pe ancora ottenere il suo indice corretto.
randomra,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.