Вдохновленный вызовом Google Code :
Латинский алфавит содержит 26 символов, а телефоны имеют только десять цифр на клавиатуре. Мы хотели бы упростить написание сообщения вашему другу, используя последовательность нажатий клавиш для обозначения нужных символов. Буквы отображаются на цифры, как показано ниже. Например, чтобы вставить символ B, программа нажимает 22. Чтобы последовательно вставить два символа с одной и той же клавиши, пользователь должен сделать паузу, прежде чем нажать клавишу еще раз. Пробел '' должен быть напечатан для обозначения паузы. Например, 2 2 обозначает AA, а 22 обозначает B.
Каждое сообщение будет состоять только из строчных букв az и пробелов ''. Нажатие ноль испускает пробел.
Ваша задача состоит в том, чтобы написать наименьшую функцию, которая принимает входную строку и возвращает последовательность нажатий клавиш, необходимую для создания ввода в виде строки или вывода его на стандартный вывод. Функция, которая является наименьшим количеством байтов, побеждает.
Пример ввода / вывода
phone("hi")
44 444
phone("hello world")
4433555 555666096667775553
Другие уточнения
- Паузы должны добавляться только при необходимости и должны быть пробелом ''.
- Каждое сообщение будет состоять только из строчных букв az и пробелов ''. Печать
0
для обозначения пробелов. - Нет внешних библиотек.
- Только входная строка может быть передана вашей функции.
- Чтобы сделать другие языки конкурентоспособными, объявление основной функции не учитывается, равно как и импорт других стандартных библиотек.
#include
S,import
S иusing
S не в счет. Все остальное делает. Это включает в себя#define
s и вспомогательные функции. См. Правило 2 в этом вопросе, если вы не уверены. - Несколько пробелов могут быть обозначены как
00
или0 0
так как вам действительно не нужно делать паузу между пробелами
{}
частью сигнатуры функции? Например, если мой кодfunction f(){alert('hi');}
, я должен считать символыalert('hi');
или{alert('hi');}
?t9
работает по-разному: вы должны нажать каждую клавишу один раз, чтобы получить слово.Ответы:
Рубин,
129122115111108107105Сделано с гольфом ...
Ой, совсем забыл удалить ненужные пробелы - исправлено ...
Сохранено 2 символа благодаря Питеру Тейлору.
Онлайн версия
Объяснение:
пробел переводится в символ с порядковым номером 96
символы сначала отображаются в серии чисел: - от a до 2 - от b до 22 - от d до 3222 - от h до 444333222
выражение регулярного выражения тогда соответствует первой группе равных цифр
массив объединен
все пробелы в вхождениях "цифр пробела Different_digit" удаляются
источник
6666
6 не нужно нажимать 4 раза подряд.\2
в этом последнем регулярном выражении? Конечно, вторая группа является утверждением нулевой ширины?REBEL -
154110103Эта «функция» принимает входные данные от стандартного ввода и отправляет результаты в стандартный вывод.
Тестовые прогоны (так что вам не нужно устанавливать переводчик):
источник
JavaScript (124)
Запустите в Firefox.
источник
GolfScript, 46 символов
Как обычно, читает ввод из stdin, печатает в stdout. Смотрите онлайн демо (с консервированным вводом).
Обратите внимание, что этот код основан на очень строгой интерпретации спецификации ввода (только строчные буквы и пробелы): в частности, любые переводы строки во вводе приведут к сбою! Эта проблема может быть исправлена за счет двух дополнительных символов путем добавления
n-
кода для фильтрации любых новых строк.источник
C ++ - 365 символов без
int main(){}
Использует те же рассуждения, мой ответ здесь , только с помощью
for
петли для вывода каждой буквы соответствующее число раз.источник
s[i]==32
вместоs[i]==' '
. ASCII-значение пространства равно 32.Perl - 107
110Вот мое предыдущее решение в 120
128 130 155:тесты:
источник
VBA
220253/258/219Не считая
Function
строк здесь:С
String
, 253 :С
For
петлей 258 :Добавлены исправления для ключа 7/9 (спасибо, Дэнни), в котором добавлено много символов.
Используя
Choose
219 :Я не хочу работать с этим, так как это более простой по функциональности, но это является более короткий код ...
источник
yes
должно быть999337777
. Я10338
использую твою функцию.C
165 163 153 149138 символовМоя первая попытка игры в гольф, любые предложения приветствуются.
источник
С ++ -
170168160Golfed:
Ungolfed
источник
C: 136 символов
И немного не вежливый (да, вот как это было написано):
Я мог бы немного сократить его, применяя некоторую рекурсию, черную магию и достаточное количество порошка чили.
источник
Ява - 243
Довольно наивное решение Java. Спасибо комментаторам за предложения.
Исправлена ошибка, которая иногда вставляла ненужные пробелы, например, для ввода «hello worlds sup».
источник
java
. Можете ли вы указать это в своем заголовке, как это делают другие ответы?t.length
на10
i
он используется только для итерацииString
, удалите его и выполните цикл foreach:for(char c:s.toCharArray())
if(c==' '){o+='0';continue;}
вif(c==' ')o+='0';else{
и добавить соответствующее условие}
.CoffeeScript - 202 (210 - 8)
источник
APL, 77 символов
объяснение
2+⌊y←7.99,⍨.315×⍳25
или, не разглаживая,y←(0.315×⍳25),7.99 ◇ 2+⌊y
отбирает подходящую наклонную линию (y = 0,315 x) в точках от 1 до 25; линия наклонена таким образом, что пол этих значений y следует повторяющейся схеме 000111 ... 777, за исключением шестой группы цифр 5555; число добавляется в конце, чтобы получить четвертый 7, так что конечный массив плюс 2 равен 22233344455566677778889999;⌈3.1×y-⌊y
усиливает разницу между этими значениями y и их минимальными значениями, так что предельные значения различий дают шаблон 123123 ... с 4 на последних цифрах двух групп по 4 цифры;'0',⍨( ... )/¨⍕¨ ...
или(( ... ) /¨ ⍕¨ ...),'0'
использует последний результат для дублирования цифр из первого, так что на выходе получается массив строк "2", 22 "" 222 "" 3 "" 33 "" 333 "... с правильными" 7777 "и" 9999 "на месте, и" 0 "добавлен в конец;⍵⍳⍨⎕UCS 96+⍳26
или(⎕UCS 96+⍳26)⍳⍵
вычисляет индекс каждого входного символа, где «a» равно 1, «z» равно 26, а пробел (и любой другой символ) равен 27;{ ... }/( ... )[ ... ]
принимает последний результат, индекс для каждого входного символа, чтобы преобразовать каждый символ в соответствующую строку цифр, затем объединяет строки, используя функцию в фигурных скобках;{⍵,⍨⍺,''↑⍨=/↑¨⍺⍵}
или{(⍺,(=/↑¨⍺,⍵)↑''),⍵}
добавляет каждую новую строку ⍺ к аккумулятору ⍵, вставляя один пробел, только если оба аргумента начинаются с одного и того же символа.Примеры
источник
Python
155150Я хотел бы быть лучше в этом XD. Определение функции не учитывается. Первый уровень отступа - это пробел, второй - вкладка, а третьи - 2 вкладки.
источник
JavaScript 234
for(l=-1,r="",I=0,y=(s=prompt()).length;I<y;I++){c=s[I];n="";d=c.charCodeAt(0)-96;if(0>d)n=0;else for(k=J=0;J<8;k=++J){v="33333434"[k];if(d<=v){for(x=K=0;0<=d?K<d:K>d;x=0<=d?++K:--K)n+=k+2;break}d-=v}r+=n[0]==l[0]?" "+n:n;l=n}alert(r)
источник
R 224
Я уверен, что есть лучший способ сделать это, поэтому я буду продолжать работать над этим.
источник