Номер комнаты Локатор
Я столкнулся с интересной техникой решения проблем на своей работе, когда мне дали номер комнаты коллеги для встречи. Время от времени, по пути на встречу, член моей команды будет отправлять мне неправильный номер комнаты, как правило, потому что они торопятся за своим столом и толстым пальцем ошибаются ключом.
Интересно, что по прибытии в ту комнату, я обычно могу догадаться, какую комнату они действительно имели в виду, представляя цифровую клавиатуру :
и угадав соседний номер они хотели нажать.
Вызов
Ваша задача состоит в том, чтобы написать функцию, которая берет номер офисного здания (000-999) и выводит возможные решения по опечаткам, предполагая , что ваш коллега опечаток вводит только одну цифру.
В следующей таблице показано, какие числа соседствуют друг с другом на цифровой клавиатуре:
0 -> 1,2
1 -> 0,2,4
2 -> 0,1,3,5
3 -> 2,6
4 -> 1,5,7
5 -> 2,4,6,8
6 -> 3,5,9
7 -> 4,8
8 -> 5,7,9
9 -> 6,8
вход
Трехзначное число: 000-999
. Предположим, ввод точно 3 цифры. Если число меньше 100 или меньше 10, вы получите ведущие нули. (т.е. 004 и 028).
Выход
Список возможных номеров. Это может быть любая форма, если вы хотите, если между номерами есть разделитель. (т. е. пробел, запятая, новая строка и т. д.). Если число меньше 100 или меньше 10, вы можете или не можете иметь начальные нули в качестве выходных данных, это ваше дело. (т.е. 004 может быть 004 04 4
, а 028 может быть 028 28
)
Тестовые случаи (начальные нули необязательны):
008 -> 108, 208, 018, 028, 005, 007, 009
123 -> 023, 223, 423, 103, 113, 133, 153, 122, 126
585 -> 285, 485, 685, 885, 555, 575, 595, 582, 584, 586, 588
777 -> 477, 877, 747, 787, 774, 778
963 -> 663, 863, 933, 953, 993, 962, 966
555 -> 255, 455, 655, 855, 525, 545, 565, 585, 552, 554, 556, 558
Это код-гольф , поэтому выигрывает самый короткий код в байтах для каждого языка.
933
поэтому я исправил это.Ответы:
Wolfram Language (Mathematica) ,
112106 байтПризнавая, что цифровая клавиатура - это в основном 3x3
GridGraph
с ребрами, добавленными для 0, мы получаем соседние цифры для каждой входной цифры с помощьюAdjacencyList
.Это можно увидеть ниже:
EdgeAdd[GridGraph[{3,3},VertexLabels->"Name",GraphLayout->"SpringEmbedding"],{0<->1,0<->2}]
выходы:Затем я использую,
Tuples
чтобы выяснить все возможные ошибки и выбрать те, которые имеют ровно одну ошибку сSelect
иEditDistance
. Кстати, это будет работать для длинных номеров, и вы также можете увеличитьEditDistance
параметр, чтобы учесть более одной ошибки. Может быть, удастся сыграть в эту игру немного дальше, но хотел показать мой подход.Чуть более гольф-версия жестко запрограммирована на длину 3 номера комнаты (106 байт). Это выведет как список ранга 3, соответствующий каждой цифре:
Попробуйте онлайн!
источник
DamerauLevenshteinDistance
вместоEditDistance
которых также будут включены ошибки транспонирования.Python 2 , 89 байт
Попробуйте онлайн!
1- й и 5- й символы могут не отображаться здесь (зависит от браузера), но полная строка эквивалентна
[21, 204, 1035, 62, 157, 2468, 359, 48, 579, 68]
источник
05AB1E , 29 байт
Попробуйте онлайн!
источник
R 190 байт
Попробуйте онлайн!
Моя вторая попытка на CodeGolf! Довольно длинный, 190 байтов, но лучшее, что я мог бы сделать с R. Любопытно посмотреть, есть ли у других отзывы или они могут сделать лучше!
источник
:
over*/+-
может сбрить несколько байтов в первой строке, избавиться от нихdo.call
, трактовать ихa
как amatrix
и транспонировать - это сэкономит всего около 39 байтов: попробуйте онлайн!JavaScript (Firefox 30-57),
115109 байтРедактировать: благодаря @ edc65 сохранено 6 байт (хотя предлагаемые
0
s теперь появляются после других предложений). Версия ES6,118112 байт:источник
[...[12,240,1350,26,157,2468,359,48,579,78][c]+'']
[for(...)]
был одним из нескольких предложений синтаксиса понимания массива, который никогда не включался в ECMAscript. Это позволило вам зацикливаться на итераторе и кратко фильтровать и / или отображать результаты. (Я нашел это особенно полезным при выполнении двойной итерации.)Java,
205177 байтЯ знаю, что это долго по сравнению с другими ответами. Мое оправдание: это на Java.
Oracle следует переименовать
toCharArray
в нечто подобноеgetCrs
.кредиты
-28 персонажей Кевина Круйссена
источник
(String b)->
может быть простоb->
, и вы можете удалить трейлинг;
. Что касается реальных вещей в гольф: вы используете толькоa
один раз, так что вы можете удалитьString[]a=...;
и использовать"12,024,0135,26,157,2468,359,48,579,68".split(",")[...]
напрямую. ТакжеByte.parseByte
может бытьnew Byte
. Всего: 177 байтов .Ruby 97 байт
Попробуйте онлайн!
Кроме того, 94 символа, но 100 байтов
Попробуйте онлайн!
источник
C (gcc) , 136 или 114 байтов
ASCII версия 136 байт
Попробуйте онлайн!
Unicode
114108 байтов (TiO, кажется, странно для этого)Спасибо @ceilingcat за эту версию.
Попробуйте онлайн!
источник
Perl 5 ,
12085 + 2 (-F
) = 87 байтПопробуйте онлайн!
Сохранено 35 байтов, заимствуя идею из рубинового ответа @ AsoneTuhid.
источник
Python 2 , 103 байта
спасибо @Lynn за -4 байта.
Попробуйте онлайн!
источник
in`0x134cd9a07d1e58feab643f7db24102`[int(v)::10]
(Яint('…',36)
тоже пытался, но это на один байт длиннее.)Юлия 0,6 , 93 байта
Попробуйте онлайн!
0x502A044228550A21102B05406
это бит,UInt128
в котором установлен1+10j
бит, если онi
находится рядом сj
цифровой клавиатурой.big(1)
являетсяBigInt
. Он используется для предотвращения переполнения и использует меньше символов, чемInt128(1)
илиUInt128(1)
.источник
SQL (SQLite), 533 байта
Ungolfed
объяснение
Ввод представляет собой одну строку текста в таблице
t
со столбцомs
. Насколько я понимаю, согласно этому мета-ответу это приемлемая форма ввода. Ввод может быть создан, как показано ниже.Аннотированное решение
источник
Котлин , 117 байт
украшенный
Тест
TIO
TryItOnline
источник
Желе , 35 байт
Попробуйте онлайн!
-1 спасибо Джонатану Аллану .
Объяснение обновляется ...
источник
Wẋ3
->ḷþ
T-SQL , 322 байта
Входные данные взяты из столбца
s
таблицы из одной строки с именемt
:Ungolfed:
SQLFiddle
источник