Мы все привыкли к старой школьной телефонной клавиатуре, верно? Для справки вот как это выглядит:
Если задана строка, состоящая только из строчных букв ASCII и одинарных пробелов , ваша задача состоит в том, чтобы вернуть количество нажатий, которое нужно сделать, чтобы набрать полную строку с телефонной клавиатуры, как показано выше.
Для тех, кто не знаком с этим, вот как это работает:
2
Например, на ключе с цифрой такжеabc
записана строка . Для того, чтобы набратьa
, вы должны нажать эту клавишу один раз, потому чтоb
вы должны нажать дважды, иc
вы должны нажать трижды.Для последовательных букв, которые находятся на одной и той же клавише, вы должны подождать 1 секунду, прежде чем нажимать снова. Итак, если вы хотите печатать
cb
, вы должны нажать 3 разаc
, подождать секунду, а затем дважды нажатьb
, так что еще 5 нажатий.То же самое относится ко всем остальным клавишам, за исключением одного пробела, который требует только одного нажатия. Также обратите внимание, что ключи
7
и9
имеют четыре буквы на них. Применяется тот же алгоритм, единственное отличие состоит в количестве букв. Строки, соответствующие каждой клавише, можно найти на изображении выше (но в нижнем регистре) или в следующем списке, который содержит все символы, которые вы можете получить:"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz", " "
Тестовые случаи
Вход -> Выход (Пояснение) "" -> 0 (ничего не должно касаться) «вода» -> 8 («w, a, t» для каждого требуется 1 нажатие (на клавиши 9, 2 и 8), для «e» требуется 2 нажатия (для клавиши 3), для «r» требуется 3 нажатия (для клавиши 7). ), 1 + 1 + 1 + 2 + 3 = 8) «мыло» -> 9 (4 + 3 + 1 + 1) "кандела" -> 13 (3 + 1 + 2 + 1 + 2 + 3 + 1) «код гольф» -> 20 (3 + 3 + 1 + 2 + 1 (для места) + 1 + 3 + 3 + 3) «Царь горы» -> 33 (2 + 3 + 2 + 1 + 1 + 3 + 3 + 1 + 1 + 2 + 2 + 1 + 2 + 3 + 3 + 3)
Спекуляции
Применяются стандартные правила ввода / вывода и стандартные лазейки.
Вы можете принимать данные только в родном типе String вашего языка. Вывод может быть целым числом или строковым представлением этого целого числа.
Это код-гольф , выигрывает самый короткий ответ на любом языке .
Ответы:
JavaScript (ES6)
77666460 байт(Сохранено несколько байтов благодаря @Johan Karlsson и @Arnauld).
Показать фрагмент кода
источник
(s,t=0)=>[...s].map(l=>t+=(1+'behknquxcfilorvysz'.indexOf(l)/8|0)+1)&&t
для 71 байтаf=s=>[...s].map(c=>t+=((c=parseInt(0+c,36))>23?c+3:c&&~-c%3)%7%4+1,t=0)|t
.05AB1E ,
292625 байтПопробуйте онлайн!
объяснение
источник
Python 2 , 56 байт
Использует тот же алгоритм, что и решение Javascript @ RickHitchcock
Попробуйте онлайн!
источник
'...'.find(c)
возвращается-1
. Добавляя 2, мы получаем одно нажатие клавиши.-1
, но не осознавал, что у вас есть+2
после этого шаблон ... Во всяком случае, самое короткое решение Python на сегодняшний день.Python 3 ,
69676564 байта1 байт благодаря мистеру Xcoder.
1 байт благодаря Фелипе Нарди Батиста.
Попробуйте онлайн!
источник
i==" "
сi<"a"
, потому что вы получите только буквы и пробелыДьялог АПЛ, 37 байт
Попробуйте онлайн!
Как?
Получить
⍳
NDEX каждого полукокса входа в строке'adgjmptw behknqux~cfilorvy~'
(s
и поz
умолчанию будет 28), делим на 9, сгонять и сумму.источник
'adgjmptw ' 'behknqux' 'cfilorvy' 'sz'
чтобы сохранить некоторые байтыf←
так что это 47 байтJavaScript (ES6), 71 байт
Смотри без буквенных таблиц! Я не совсем понял формулу @ LeakyNun, поэтому придумал свою.
источник
s=>[...s]
делать, почему не простоs=>s.map()...
s
- это строка, поэтому вы не можетеmap
напрямую это сделать....s
повторяетсяs
, в то время[...s]
как итерация преобразуется в массив, эффективно разделяясьs
на массив символов.C,
211196 байтПервое представление здесь ... выглядит довольно длинным, и я вижу, что это не эффективный подход, но, по крайней мере, он работает :)
Безголовая версия:
источник
*(k+i)
может бытьk[i]
.*
(напримерchar*n
) и добавить свои декларации в ваш пустойfor
оператор (вместо тогоint s=0,j=0;(for(;
, чтобы иметь егоfor(int s=0,k=0;
) и вместоi==0
использования!i
s
в цикл for, потому что я использую его позже, но я собралint
объявления и использовал assignemts там, где они мне были нужны.Haskell -
747162 байтаРедактировать: удалил 3 байта, используя понимание списка вместо фильтра
Изменить: Сохранить 9 байтов благодаря Сиракузы, Лайкони и Згарб!
использование
Попробуйте онлайн!
источник
f
вf=length.(=<<)(\x->x:[y|y<-l,y==x])
, где(=<<)
находитсяconcatMap
здесь.filter
:f=length.(=<<)(\x->x:filter(==x)l)
l
только один раз, он может быть встроен.Желе , 25 байт
Попробуйте онлайн!
источник
Clojure,
8276 байтО, это проще всего
filter
иcount
чем использоватьfrequencies
. Оригинал:Строка кодирует во сколько раз больше, чем один раз, когда вам нужно нажать клавишу для данного символа :)
источник
Python 3 , 91 байт
Попробуйте онлайн!
источник
Python 3 , 60 байт
Вероятно, неоптимальный, так как это мой первый гольф в Python.
Попробуйте онлайн!
источник
Сетчатка ,
4636 байтСпасибо CalculatorFeline за сохранение 6 байтов.
Попробуйте онлайн!
источник
Ява,
9573 байтаСпасибо Кевину Круйссену за то, что он сделал функцию лямбда-выражением (где
a
имеет типString
). 95 байтов стало 73 байта!Лямбда-выражение суммирует количество нажатий каждого символа, используя
map()
.map()
преобразует каждый символ (ASCII в диапазоне строчного является 97-122) в потоке до соответствующего значения (выглядит как простая пила волна, но , принимая во внимание как 4 цикла напрягает) , используя эту математику:1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)
. Вот график desmos этой модели.источник
interface Z{static void main(String a){System.out.print(a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum());}}
a->{return a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum();}
это разрешено. И так как это единственное возвращаемое утверждение,a->a.chars().map(b->1+(b<64?0:b+(Math.abs(b-115)<4?4:5))%(3+b/112)).sum()
( 73 байта ) будет вашим ответом. Кроме того, вот ссылка TryItOnline вашего ответа, которую вы, возможно, захотите добавить в свой ответ. Еще раз: добро пожаловать и хороший ответ. +1 от меня.f=
ни ведущую точку с запятой;
. И вам также не нужно добавлять тип параметра, если вы упоминаете, что это за тип (поэтому вместо того,(String a)->
чтобы использоватьa->
и указать, что входные данныеa
естьString
в вашем ответе). О, и « Советы по игре в гольф на Java» и « Советы по игре в гольф на <все языки>» могут быть интересными, если вы еще этого не сделали.Mathematica, 83 байта
источник
a
пропущенные в начале"bc1..."
?)QBIC , 94 байта
объяснение
источник
удар ,
6968 байтПопробуйте онлайн!
Складывает по одному символу в строке, транслитерирует каждую новую строку,
+
каждый пробел1
и каждую букву с соответствующим количеством нажатий. БК делает сумму.источник
bc <(fold -1|tr "\n "adgjmptwbehknquxcfilorvysz +[1*9][2*8][3*8]44;echo 0)
C
9288 байтовисточник
s=n
чтобы заменитьreturn n
, и объединитьs++;
сc=*s
. Это может быть на 9 байт короче.s=n
не будет работать, такs
как это местный. И*s=n
не будет работать, так как есть толькоCHAR_BIT
биты*s
, которых было бы недостаточно для некоторых сообщений. Но ты прав насчетs++
. Спасибо.APL (Dyalog) , 36 байт
Попробуйте онлайн!
Находят моды-3 индексов в алфавите без S и Z . Поскольку пробел, S и Z не найдены, они имеют «индекс» 25 (на один больше, чем индекс max), что хорошо для пробела. Тогда нам просто нужно добавить 3 для каждого S или Z .
{
Функция анонимная , где аргумент представлен ⍵ :⎕A~'SZ'
в верхнем регистре lphabet, за исключением S и Z819⌶
в нижнем регистре⍵⍳⍨
в ɩ ndices аргумента в том , что¯1+
добавить отрицательный3|
мод-31+
добавить один (это преобразует все 0-моды в 3)(
…),
Prepend:⍵∊'sz'
Boolean, где аргумент является либо s, либо z3×
умножить на 3+/
суммаисточник
C (gcc) , 75
77байтовНепечатная строка
""
представляет собой таблицу04 01 02 03 01 02 03 04
.Попробуйте онлайн!
источник
Пип ,
10090 байтПроверьте каждый символ ввода на совпадение в каждом элементе b. Индекс этого совпадения плюс 1 добавляется к итогу.
Попробуйте онлайн!
источник