Чи слово друкується за допомогою клавіш, що примикають один до одного?


13

Перш ніж прочитати це, я пропоную прочитати цю маленьку головоломку: /puzzling/11408/longth-word-with-adjacent-letters-on-a-keyboard

Я хочу, щоб ви створили програму, яка бере один аргумент, слово (лише малі літери) та виводить "Так", якщо слово можна набрати за допомогою суміжних клавіш на клавіатурі (див. Статтю) та "Ні", якщо слово може не вводиться суміжними літерами.

Ось розкладка клавіатури, яка використовується в цьому виклику:

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

Пам'ятайте: це кодегольф, тому найкоротша відповідь виграє!


Чи можна вважати, що вхід складається лише з букв? Чи можна припустити, що всі вони даються в одному випадку?
Мартін Ендер

2
Мене це бентежить: "Дві сусідні клавіші можуть мати максимум 1,5 * пробіл ключа між ними." Напевно сусідні клавіші насправді є сусідніми, тобто між ними немає місця, як у зв’язаній головоломці?
Лука

Як брати аргументи? STDIN? Функція?
theonlygusti

Відповіді:


9

Піта, 66

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

Спробуйте тут.

Я був здивований, дізнавшись, що Pyth не має функції гіпотенузи, тому це, швидше за все, буде побито іншою мовою. Я запропоную Pyth функцію гіпотенузи, тож ця жорстокість не відбудеться в майбутньому.

Пояснення

Я перетворюю клавіатуру на це:

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

Який потім кодую як "qwertyuiopasdfghjkl*zxcvbnm". Тоді я використав divmod з модулем 9.5, щоб визначити 2D координати кожного ключа. Потім я обчислюю відстані між послідовними ключами і перевіряю, чи відстань у квадраті <2.


3

CJam, 83 75 74 байт

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

Спробуйте в Інтернеті.

Пояснення

Загальний підхід полягає в створенні великої рядки суміжності, що містить кожну пару сусідніх символів клавіатури, а потім перевірити, чи міститься кожна пара суміжних символів вводу в цій рядку.

Я цілком задоволений тим, як мені вдалося побудувати рядок суміжності, який використовує дуже просту і компактну логіку.

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

Це все, я вчу CJam.
Soham Chowdhury

@octatoan Схоже, нам обом було б краще вивчити Pyth. : P
Runer112

Ха-ха, може, в цьому випадку так.
Soham Chowdhury

2

J, 77 байт

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

Використання:

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

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

Спосіб:

Для кожного вхідного листа я генерую 2D координату (аналогічну зображенню у запитанні) на основі його індексу в рядку 'qazwsxedcrfvtgbyhnujmikXolX'. Для кожної пари букв на вході перевірити , якщо їх координати Манхеттен відстань менше , ніж 2. Якщо все є, вихід I Yes, в Noіншому випадку (при зловживанні `оператора).

Спробуйте його онлайн тут.


Ви забули лист p.
mbomb007

@ mbomb007 Для не знайдених символів i.оператор повертає, index of the last element + 1тому я можу зберегти 1 байт, не виписуючи pі все-таки отримати правильний індекс.
randomra

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.