Подходит ли слово для ввода рядом с клавишами?

13

Прежде чем читать это, я предлагаю прочитать эту маленькую головоломку: /puzzling/11408/longest-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 |
     └───┴───┴───┴───┴───┴───┴───┘

Помните: это Codegolf, поэтому выигрывает самый короткий ответ!

Loovjo
источник
Можем ли мы предположить, что ввод состоит только из букв? Можем ли мы предположить, что все они даны в одном случае?
Мартин Эндер
2
Я смущен этим: «Два смежных ключа могут иметь максимум 1,5 * промежутка между ними». Наверняка смежные ключи на самом деле смежные, то есть между ними нет места, как в связанной загадке?
Лука
Как принять аргумент? STDIN? Функция?
theonlygusti

Ответы:

9

Пиф, 66

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

Попробуй это здесь.

Я был удивлен, узнав, что у 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.

orlp
источник
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.";
Runer112
источник
Вот и все, я учу CJam.
Сохам Чоудхури
@octatoan Похоже, нам обоим было бы лучше изучить Pyth. : P
Runer112
Хаха, может в этом случае да.
Сохам Чоудхури
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. Если все они есть, я вывожу Yes,No в противном случае (при злоупотреблении `оператора).

Попробуйте это онлайн здесь.

randomra
источник
Вы забыли письмо p.
mbomb007
@ mbomb007 Для не найденных символов i. оператор возвращает значение, index of the last element + 1поэтому я могу сохранить 1 байт, не выписывая pи сохраняя правильный индекс.
Рандомра