Czy słowo można pisać za pomocą klawiszy sąsiadujących ze sobą?


13

Przed przeczytaniem proponuję przeczytać tę małą łamigłówkę: /puzzling/11408/longest-word-with-adjacent-letters-on-a-keyboard

Chcę, abyś utworzył program, który pobiera jeden argument, słowo (tylko małe litery) i wyświetla „Tak”, jeśli słowo można wpisać za pomocą sąsiednich klawiszy na klawiaturze (patrz artykuł) i „Nie”, jeśli słowo może nie będą pisane przylegającymi literami.

Oto układ klawiatury zastosowany w tym wyzwaniu:

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

Pamiętaj: to kodegolf, więc wygrywa najkrótsza odpowiedź!


Czy możemy założyć, że dane wejściowe składają się tylko z liter? Czy możemy założyć, że wszystkie podane są w jednym przypadku?
Martin Ender

2
Jestem zmieszany tym: „Dwa sąsiednie klucze mogą mieć maksymalnie 1,5 * odstępu między nimi”. Z pewnością sąsiednie klucze są w rzeczywistości sąsiadujące, to znaczy, że nie ma między nimi wolnej przestrzeni, jak w połączonej układance?
Łukasz

Jak wziąć argument? STDIN? Funkcja?
theonlygusti

Odpowiedzi:


9

Pyth, 66

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

Wypróbuj tutaj.

Zaskoczyło mnie, że Pyth nie ma funkcji przeciwprostokątnej, więc prawdopodobnie zostanie pokonany przez inny język. Zaproponuję Pythowi funkcję przeciwprostokątną, więc to okrucieństwo nie nastąpi w przyszłości.

Wyjaśnienie

Przekształcam klawiaturę w to:

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

Które następnie koduję jako "qwertyuiopasdfghjkl*zxcvbnm". Następnie użyłem divmod z modułem 9.5, aby obliczyć współrzędne 2D każdego klawisza. Następnie obliczam odległości między kolejnymi klawiszami i sprawdzam, czy kwadratowa odległość <2.


3

CJam, 83 75 74 bajty

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

Wypróbuj online.

Wyjaśnienie

Ogólne podejście polega na utworzeniu dużego ciągu sąsiedniego zawierającego każdą parę sąsiednich znaków klawiatury, a następnie sprawdzenie, czy każda para sąsiednich znaków wejściowych jest zawarta w tym ciągu.

Jestem całkiem zadowolony z tego, jak udało mi się zbudować ciąg sąsiedztwa, który wykorzystuje bardzo prostą i zwartą logikę.

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

To wszystko, uczę się CJam.
Soham Chowdhury

@octatoan Wygląda na to, że oboje lepiej byłoby uczyć się języka Pyth. : P
Runer112

Haha, może w tym przypadku tak.
Soham Chowdhury,

2

J, 77 bajtów

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

Stosowanie:

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

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

Metoda:

Dla każdej litery wejściowej generuję jej współrzędną 2D (podobną do obrazu w pytaniu) na podstawie jej indeksu w ciągu 'qazwsxedcrfvtgbyhnujmikXolX'. Dla każdej pary liter na wejściu sprawdzam, czy odległość ich współrzędnych na Manhattanie jest mniejsza niż 2. Jeśli wszystkie są, wyprowadzam dane Yes, w Noprzeciwnym razie (nadużywając operatora `).

Wypróbuj online tutaj.


Zapomniałeś listu p.
mbomb007

@ mbomb007 W przypadku nieznalezionych znaków i.operator zwraca wartość, index of the last element + 1dzięki czemu mogę zapisać 1 bajt, nie zapisując go pi nadal uzyskując poprawny indeks.
randomra

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.