В день ваших бабушек и дедушек, набор номера телефона был сделан с помощью поворотного набора, как это:
Чтобы набрать каждую цифру, поместите палец в соответствующее отверстие, потяните его до упора и отпустите. Механизм заставит циферблат вращаться обратно в исходное положение, а телефон будет отключать и повторно подключать цепь указанное количество раз, делая слышимые щелчки.
Набор цифры N требует N таких «импульсов», за исключением N = 0, что составляет десять импульсов.
Поворотные телефоны обладают тем свойством, что для набора больших цифр (8, 9, 0) требуется больше времени, чем для маленьких цифр (1, 2, 3). Это было важным соображением при составлении ранних кодовых карт, и почему Нью-Йорк с его высокой плотностью населения (и телефонной линией) получил 212 (всего 5 импульсов), в то время как 907 (26 импульсов) отправились на малонаселенную Аляску. Конечно, все это стало неактуальным, когда стал популярным тональный набор.
Соревнование
Запишите, как можно меньше байт, программу или функцию, которая принимает в качестве входных данных строку (или последовательность символов), содержащую номер телефона, и выводит число импульсов вращающегося набора. Они должны учитываться следующим образом:
Digits
- Цифры 1-9 считаются как количество импульсов.
- Цифра 0 считается как 10 импульсов.
Письма
Обратите внимание, что цифры 2-9 на циферблате имеют связанные с ними буквы латинского алфавита. Первоначально они предназначались для именованных обменов , но позднее были переназначены для фоновых слов и для систем ввода текстовых сообщений.
Вы должны поддерживать наличие букв в своих телефонных номерах, используя назначение букв E.161 цифрам:
- А, В, С = 2
- D, E, F = 3
- G, H, I = 4
- J, K, L = 5
- М, Н, О = 6
- P, Q, R, S = 7
- T, U, V = 8
- W, X, Y, Z = 9
Вы можете предположить, что ввод уже был сложен в верхний или нижний регистр.
Другие персонажи
Вы должны разрешить произвольное использование символов ()+-./
и пробела в качестве разделителей форматирования. Для этой цели вы можете разрешить использовать любой не алфавитно-цифровой символ, если это проще реализовать.
Эти символы не влияют на количество импульсов.
Пример кода
Таблица поиска без функции гольфа и функция в Python:
PULSES = {
'1': 1,
'2': 2, 'A': 2, 'B': 2, 'C': 2,
'3': 3, 'D': 3, 'E': 3, 'F': 3,
'4': 4, 'G': 4, 'H': 4, 'I': 4,
'5': 5, 'J': 5, 'K': 5, 'L': 5,
'6': 6, 'M': 6, 'N': 6, 'O': 6,
'7': 7, 'P': 7, 'Q': 7, 'R': 7, 'S': 7,
'8': 8, 'T': 8, 'U': 8, 'V': 8,
'9': 9, 'W': 9, 'X': 9, 'Y': 9, 'Z': 9,
'0': 10
}
def pulse_count(phone_num):
return sum(PULSES.get(digit, 0) for digit in phone_num)
Пример ввода и вывода
911
→ 11867-5309
→ 48713 555 0123
→ 42+1 (212) PE6-5000
→ 571-800-FLOWERS
→ 69PUZZLES
→ 48
+- ()*#.
), точно так же, как буквы ограничены заглавными буквами. Поправьте меня если я ошибаюсь.*
и#
, которые имеют особое значение для телефонов с тональным набором и не набираются на поворотных устройствах.Ответы:
05AB1E ,
19181715 байтПопробуйте онлайн!
Это первый ответ, чтобы использовать π. Вы можете спросить, зачем использовать π? Ну, буквы связаны с 22233344455566677778889999, по порядку. Обратите внимание, как большинство цифр повторяется 3 раза, а 7 повторяется 4 раза. Можно сказать, что каждая цифра в среднем повторяется (3 + 1/7) раз. Интересно, есть ли число, которое приблизительно равно 3 + 1/7 и занимает меньше байтов, чем 22/7…
Это дает только 4 7 с, а не 4 9 с, поэтому нам все еще нужно обрабатывать Z как особый случай.
источник
"abcdefghijklmnopqrstuvwxyz"
, но не для"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. Я мог бы преобразовать алфавит в верхний регистр, а не преобразовывать ввод в нижний регистр, но это то же самое по количеству символов.C # (интерактивный компилятор Visual C #) , 51 байт
Сохранено 1 байт благодаря @recursive
Сохранено 10 байтов благодаря наблюдению @ ExpiredData, которое
() +-/.
будет только на входеПопробуйте онлайн!
источник
-10
есть~9
, который должен работать в контексте.APL (Dyalog Unicode) , 27 байтов SBCS
Функция анонимного молчаливого префикса.
Попробуйте онлайн!
(
…)∘⍳
Найти de ndex * каждого символа в следующей строке:* элементы, которые не найдены, получают индекс 1 + максимальный индекс, то есть 11
⎕D
цифр:"0123456789"
1⌽
циклически вращаться на один шаг влево;"1234567890"
11|
остаток от деления при делении на 11 ** это дает 0 для всех нецифровых чисел
...
+
добавьте это к следующему:'@ADGJMPTW'∘⍸
ɩ nterval ɩ NDEX * для каждого символа* Так [-∞, "@") дает 0, [ "@", "A") дает 1, [ "A", "D") дает 2 и т.д.
+/
сумма,источник
Python 2 , 74 байта
Попробуйте онлайн!
Делает некоторую арифметику по значению ASCII для каждого символа. Первый вариант проверяет наличие букв, а второй - проверку номеров. Разъяснение того, что все символы пунктуации, допускаемые на входе, являются символами со значениями ASCII менее 48, позвольте мне упростить логику, но теперь новый метод может быть лучше.
Python 2 , 84 байта
Попробуйте онлайн!
Используется жестко запрограммированная строка поиска, где каждый блок из 5 символов соответствует символам, дающим каждое значение, начинающееся с 1. Пробелы заполняются пробелом
x
, который не может быть на входе с заглавными буквами. Случайно, символы, не появляющиеся в строке, производят-1
для.find
которого слагаемое равно нулю.источник
JavaScript (Node.js) , ...
7669 байтПопробуйте онлайн!
-7 спасибо @ Arnauld!
объяснение
Все
[space]().+-/
они не захвачены/\w/g
, поэтому они не влияют на общее количество.источник
Perl 5
-p
,5251 байт@ Грими получает кредит за -1
Попробуйте онлайн!
источник
/\d/g
должен быть равен/./g
-1 (да, он по-прежнему правильно обрабатывает знаки препинания).J , 39 байт
Попробуйте онлайн!
Порт решения Адама APL
источник
Сетчатка 0.8.2 , 34 байта
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Объяснение:
Преобразуйте буквы
WTPMJGDA
в цифры9..0
.Перемешайте все оставшиеся буквы на 1 и повторяйте, пока все буквы не будут преобразованы в цифры.
Заменить
0
на55
поскольку они набирают одинаковое количество импульсов.Возьми цифровую сумму.
источник
K4 , 44 байта
Решение:
Примеры:
Объяснение:
Наивный подход, скорее всего, довольно пригодный для игры в гольф. Индекс поиска символа, оценка поиска, сумма.
источник
Perl 6 , 53 байта
Попробуйте онлайн!
Умножает код ASCII на 0,313 вместо 1/3 и использует побитовое ИЛИ, которое округляет до нуля, чтобы получить правильное смещение .
источник
C (gcc) ,
94898680 байтСпасибо потолку, Nwellnhof и Rogem за предложения.
Попробуйте онлайн!
источник
c<43U
вместоc-17<26U
Баш , 256 байт
Вы можете заменить
(( … ))
конструкцииlet
на одинаковое количество байтов. Может быть хороший алгоритм, чтобы уменьшить количество регистров, но он пока не найден. Немного переделав, вы также можете сделать это функцией (но не в тех же или меньших байтах, если не можете сбрасывать со счетовfunction fname { … }
верх и хвост).Попробуйте онлайн!
Лучшее решение, использующее технику символов карты, использует
tr
инструмент:[Bash с tr], 173 байта
Попробуйте онлайн!
источник
while((${#p}))
работает, сохраняя три байта.c=${p:0:1};case c in ([0-9]) ((d+=c?c:10));;
сохраняет еще 16. Сtr -dc 0-9
добавлением в конвейер tr вам вообще не нужен оператор case, и сложение можно сложить вwhile
условие с помощью&&
.read p;p=$(echo $p|tr A-Z 22233344455566677778889999|tr -dc [0-9]);while ((${#p}));do c=${p:0:1}&&((d+=c?c:10));p=${p#?};done;echo $d
p=$(head -1|tr A-Z 22233344455566677778889|tr -dc 0-9);while((${#p}));do((d+=(c=${p:0:1})?c:10));p=${p#?};done;echo $d
.. последние три 9 не нужны, потому что tr будет использовать последний символ замены, если второй аргумент слишком короткий.read p;while((${#p}>0));do case ${p:0:1} in ([1-9])((d+=${p:0:1}));;([0])((d+=10));;([ABC)((d+=2));;([P-S])((d+=7));;([W-Z])((d+=9));;([DEF])((d+=3));;([GHI])((d+=4));;([JKL])((d+=5));;([MNO])((d+=6));;(?)d=$d;esac;p=${p#?};done;echo $d
Желе ,
3324 байтаПопробуйте онлайн!
Монадическая ссылка, принимающая строку в качестве аргумента и возвращающая количество импульсов. Переписанный, вдохновленный ответом @ Grimy's 05AB1E, так что обязательно проголосуйте за них!
источник
PowerShell ,
10910287 байтПопробуйте онлайн!
РЕДАКТИРОВАТЬ: Использовал идею @ mazzy для переключателя регулярных выражений с некоторым форматированием строки, чтобы привести char -> int -> string и получить только первую «цифру»
Оригинал:
Я надеялся получить <100 байтов, поэтому я буду продолжать смотреть на это, чтобы увидеть, есть ли что-нибудь еще, что я могу сделать. Там, вероятно, есть способ удалить строку номера
Извините, если это сбивает с толку, поскольку я вложил массивы в логические операторы индексации, но -
Объяснение:
[char[]]"$args"|%{
читает входные данные, приведенные в виде строки, а затем разбивает их на массив символов и начинает цикл for-each с проверкой, введен()[$_-gt47]
ли какой-либо из них()+-./
(все имеют значения символов ascii <48).Примечание: Powershell принимает
$true
и$false
as1
и0
соответственно для индексов массиваТогда мы получим либо
48
для символов, либо:('22233344455566677778889999'[$_-65],(58,$_)[$_-ne48])[$_-lt64]
В
[$_-lt64]
проверяет номера или буквы (все предполагаемый капитал здесь). Если это буква,'22233344455566677778889999'[$_-65]
измените ее на 0-25, чтобы индексировать в массив и вывести значение импульса (в виде символа). Если символ является числом, мы вместо этого посмотрим:(58,$_)[$_-ne48]
проверка на0
и вывод58
или просто сам числовой символ.Вокруг всего
$a+= ... -=48
инициализируется числовая переменная $ a at,0
а затем добавляется вывод. На выходе получается значение типа ascii char, поэтому вычтите48
.Примечание: если вход был символом, мы получаем
$a+=48-48
, фактически игнорируя его. Если это было0
, мы получаем$a+=58-48
получаем +10И наконец,
;$a
просто выводит наше окончательное значение post для каждого циклаисточник
=
там, оставшиеся от моих предыдущих методов решения этой проблемы, спасибо за улов! Хотя я раньше не виделt*y
, не могли бы вы объяснить, почему это работает, чтобы взорвать строку в массив символов?-f
и[0]
.PowerShell ,
958579 байтвдохновленный ответом nwellnhof .
вдохновленный
[0]
от ответа синусоиды в .Попробуйте онлайн!
Развернутая версия:
источник
Stax , 21 байт
Запустите и отладьте его
источник
Котлин , 113 байт
Попробуйте онлайн!
источник
Python 3 ,
134123 байтаПопробуйте онлайн!
-11 байт благодаря @ dan04
источник
'ADGJMPTWBEHKNQUXCFILNRVYSZ'
, вы можете уменьшить строку цифр до'23456789'*3+'79'
.