Ist das Wort mit nebeneinander liegenden Tasten tippbar?

13

Bevor ich dies lese, empfehle ich, dieses kleine Rätsel zu lesen: /puzzling/11408/längstes-Wort-mit-benachbarten- Buchstaben-auf-einer- Tastatur

Ich möchte, dass Sie ein Programm erstellen, das ein Argument, ein Wort (nur Kleinbuchstaben), und "Ja" ausgibt, wenn das Wort mit benachbarten Tasten auf der Tastatur eingegeben werden kann (siehe Artikel), und "Nein", wenn das Wort kann nicht mit nebenstehenden Buchstaben geschrieben werden.

Hier ist das Tastaturlayout für diese Herausforderung:

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

Denken Sie daran: Dies ist Codegolf, also gewinnt die kürzeste Antwort!

Loovjo
quelle
Können wir annehmen, dass die Eingabe nur aus Buchstaben besteht? Können wir davon ausgehen, dass sie alle in einem einzigen Fall gegeben sind?
Martin Ender
2
Das verwirrt mich: "Zwei benachbarte Schlüssel können maximal 1,5 * den Abstand eines Schlüssels zwischen sich haben." Sicherlich sind benachbarte Tasten tatsächlich benachbart, dh sie haben keinen Abstand zwischen ihnen, wie im verknüpften Puzzle?
Luke
Wie streitet man? STDIN? Eine Funktion?
Theonlygusti

Antworten:

9

Pyth, 66

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

Probieren Sie es hier aus.

Ich war überrascht zu erfahren, dass Pyth keine Hypotenuse-Funktion hat, daher wird dies wahrscheinlich von einer anderen Sprache geschlagen. Ich werde Pyth eine Hypotenuse-Funktion vorschlagen, damit diese Gräueltat in Zukunft nicht mehr vorkommt.

Erläuterung

Ich verwandle die Tastatur in diese:

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

Was ich dann als codiere "qwertyuiopasdfghjkl*zxcvbnm". Dann benutzte ich divmod mit modulo 9.5, um die 2D-Koordinaten jeder Taste herauszufinden. Dann berechne ich die Abstände zwischen aufeinanderfolgenden Schlüsseln und überprüfe, ob der Quadratabstand <2 ist.

orlp
quelle
3

CJam, 83 75 74 Bytes

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

Probieren Sie es online aus.

Erläuterung

Der allgemeine Ansatz besteht darin, eine große Adjazenzzeichenfolge zu erzeugen, die jedes Paar benachbarter Tastaturzeichen enthält, und dann zu überprüfen, ob jedes Paar benachbarter Eingabezeichen in dieser Zeichenfolge enthalten ist.

Ich bin ziemlich zufrieden damit, wie ich es geschafft habe, die Adjazenzzeichenfolge zu erstellen, die eine sehr einfache und kompakte Logik verwendet.

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
quelle
Das war's, ich lerne CJam.
Soham Chowdhury
@octatoan Sieht so aus, als ob wir beide besser dran wären, Pyth zu lernen. : P
Runer112
Haha, vielleicht in diesem Fall ja.
Soham Chowdhury
2

J, 77 Bytes

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

Verwendung:

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

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

Methode:

Für jeden eingegebenen Buchstaben wird eine 2D-Koordinate (ähnlich dem Bild in der Frage) basierend auf dem Index in der Zeichenfolge generiert 'qazwsxedcrfvtgbyhnujmikXolX'. Für jedes Buchstabenpaar in der Eingabe überprüfe ich, ob die Manhattan-Entfernung ihrer Koordinaten kleiner als 2 ist. Wenn alle sind, gebe ich sie aus Yes, Noandernfalls (durch Missbrauch des Operators).

Probieren Sie es hier online aus.

randomra
quelle
Du hast den Brief vergessen p.
mbomb007
@ mbomb007 Für nicht gefundene Zeichen gibt der i.Operator das zurück, index of the last element + 1damit ich 1 Byte sparen kann, indem ich nicht ausschreibe pund trotzdem den korrekten Index erhalte.
Randomra
1

CJam, 75

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

Probieren Sie es hier aus ( Firefox hier ).

Übersehen den Ja / Nein-Teil ... Behoben.

jimmy23013
quelle