Проблема:
Например, вы создаете новый телефон, в котором люди могут вводить специальные телефонные номера, 1-800-program
и они будут автоматически преобразованы в используемый телефонный номер, например 1-800-7764726
(в предыдущем примере).
Ваша программа получит строку любой длины с цифрами, буквами и тире, и преобразует все буквы в соответствующие им числа.
Вот клавиатура, для справки:
Правила:
- Ваша программа получит строку
- Это обработает это и возвратит / напечатает другую строку
- Любой язык принят
- Поскольку это код-гольф , выигрывает самый короткий код
Ответы:
GolfScript, 24 символа
Тестовый ввод:
Тестовый вывод:
Объяснение:
{ }%
применяет код в фигурных скобках к каждому символу ввода..96>{ }*
выполняет код между внутренними фигурными скобками, если и только если ASCII-код символа больше 96 (т. е. это строчная буква).Первый
,
превращает символ в список всех символов с более низкими кодами ASCII и91,'qx'+-
отфильтровывает все символы с кодами ASCII менее 91, а также буквыq
иx
из списка. Так, например, персонажa
превращается в список из 6 символов[\]^_`
, а персонаж - в списокz
из 29 символов[\]^_`abcdefghijklmnoprstuvwy
.Вторая
,
подсчитывает количество элементов, оставшихся в списке, и3/
делит это число на три (округление вниз). Наконец,`
превращает полученное число (в диапазоне 2 - 9) в строку.Таким образом, согласно спецификации, дефисы и цифры остаются без изменений, а строчные буквы отображаются в числа в соответствии со схемой клавиатуры. Код будет фактически проходить через все печатаемые символы ASCII, за исключением строчных букв (которые отображаются так, как описано) и символов
{
,|
и}
(которые отображаются в двухсимвольную строку10
). Не-ASCII 8-битный ввод будет производить всевозможные странные числовые результаты.После всего этого немного разочаровывает, что это тривиальное решение bash превосходит всего шесть символов.
источник
Баш, 30
Изменить: Спасибо Doorknob за устранение 3 символов
Пример:
источник
9
с?С
837877656362http://ideone.com/qMsIFQ
источник
~(c=getchar())
getch()
вместоgetchar()
?getch()
это не стандартный C, в результате я думаю, что он не связывается в ideone. Тем не менее, в любом случае я протестировал его в MSVC, и он, к сожалению, не работает - поскольку он напрямую потребляет ввод с клавиатуры, нет выхода из программы, хотя он переводит то, что вы печатаете на лету, что довольно аккуратно.Javascript - 103 символа
источник
charCodeAt(0)
на,charCodeAt()
и вы можете использовать функцию стрелки дляfunction(y)...
сохранения нескольких байтов, и~~(y/3)
вы можете использоватьy/3|0
Рубин, 75 символов
Использует устаревший
chars
с блоком, и печатает каждую букву индивидуально с$><<
. Мне тоже нравится[[*?a..?z].index(c)||-1]
; он захватывает символ, соответствующий этой букве алфавита, если это буква, и последний символ (который оказывается тестовым символом без изменений), если нет.Рубин, 43 (или 35) символов
Откровенно воровал у @ace;)
Побрей 8 символов, если я смогу работать в IRB с переменной
s
в качестве строки:источник
C ++ - 222 символа
Самое длинное решение на данный момент:
источник
Фринк, 92
Я знаю довольно многословный язык. Это проверяет 8 значений вместо 26 без необходимости вводить сравнения. Может ли какое-либо из приведенных выше решений "222333444 .." быть сокращено аналогичным образом?
Используя встроенные конструкции, 107
Используя пользовательскую рекурсивную функцию, 92
источник
Smalltalk,
7970ввод s:
вероятно, не является кандидатом на то, чтобы быть самым коротким - но может представлять интерес для старого трюка, чтобы избежать проверки для условия not-found (indexOf: возвращает 0 в этом случае). Таким образом, специальный тест для писем не требуется. Однако некоторые Smalltalks имеют неизменяемые строки, и нам нужно еще 4 символа («copy»).
О, лучшая версия, которая даже имеет дело с неизменяемыми строками в 70 символов:
источник
Mathematica 90
Это следует логике решения @ ace:
пример
источник
1
в#1
:)1
. Тем не менее 90 символов, но вырезать и вставить будет работать. Вы, конечно, понимаете мотивацию использовать одну стрелку символа.Perl, 50
Еще одна очевидная копия ответа Эйса
источник
-p
вместо этого воспользуемся параметром switch, который позволяет вам хорошо проходить каждую строку stdin. Пока мы на этом, диапазон в y /// не должен быть заключен в квадратные скобки. Мы также можем избавиться от трех 9, оставив только одну, и удалить последнюю точку с запятой: вот-p y/a-z/22233344455566677778889/
и все, 30 + 1 за-p
. Благодарим Вас за использование сервисов по поиску и оптимизации корпоративного китайского языка Perl и хорошего дня.R, очень долго, но весело
источник
к [32 символа]
использование
источник
JavaScript, 85
JavaScript никогда не победит в гольф-войнах, но мне это нравится, и я хотел сделать что-то другое, чем прыгнуть на фургон @ace.
источник
PHP, 141
Не самое короткое, но веселее
Более читабельно:
источник
strtolower
Python 2.7, 80
Я новичок в Python, так что я уверен, что должен быть способ играть в гольф еще дальше , это другой подход, надеюсь, вам, ребята, нравится, мой бог, Python довольно!
Пример запуска:
источник
T-SQL, 216 байт
За последние пару ночей я потратил довольно много времени на тщательное создание математической функции последовательности, которая бы правильно округлялась, чтобы генерировать правильные коды ASCII для чисел из алфавитных кодов ASCII. У него было смешное количество десятичных разрядов в коэффициентах, но это работало.
Тем не менее, рациональный подход mattnewport работает и в SQL, при гораздо меньших затратах в байтах, поэтому я бесстыдно отказываюсь от собственной математики в пользу его. Пойди проголосуй за него, это элегантное решение!
Вот мой:
При этом используется рекурсивный CTE для создания импровизированной стопки символов в телефонном номере и преобразования букв на лету, а затем немного хитрости SQL (SELECT @ p = @ p + columnValue) для перекомпоновки строки из CTE без необходимости другая рекурсивная конструкция.
Выход:
источник
Python 2.7,
6665Оригинал Анакаты
Дальше в гольф
У меня недостаточно репутации, чтобы комментировать ответ @ anakata, поэтому я сделал здесь отдельный пост. У меня была та же идея (принимая модуль 3 постановления), но я не мог понять, как напечатать правильные числа для s - z .
В любом случае, улучшения в гольф я сделал:
изменился
raw_input
наinput
удалены посторонние
'\b'
и скобки и одинарные кавычкиубрал
+2
смещение и поместил его в исходное вычитание (97 - (3 * 2) = 91)Протестировано с интерпретатором Python 2.7.6. Предполагается, согласно правилам, ввод строки.
источник
PHP, 87
источник
q [38 символов]
Вдохновленный решением @ ace
пример
источник
XQuery, 71
BaseX использовался в качестве процессора XQuery.
$i
это вход.Не самый короткий ответ, но довольно короткий и очень читаемый.
источник
Питон, очень безликий
Поскольку все копируют туз, я решил опубликовать код, который я придумал, прежде чем задавать вопрос:
источник
EcmaScript 6 (103 байта):
Ожидается,
i
чтобы содержать строку.Попробуйте это в любой последней версии Firefox. Я не пробовал Google Chrome.
источник
Питон 3, 121
источник
Haskell, 93C
использование
источник
C # 140
источник
питон
источник
ECMASCRIPT, 101 (с входом)
Новая строка добавлена для ясности. 85 символов, если вход находится в переменной.
источник
Perl, 54
Стреляй, @RobHoare все еще бьет меня на 4 символа. :)
источник
QBasic, 155
Ах, воспоминания ...
Это должно было быть короче, но я тестировал с repl.it , который не допускает однострочных
IF
операторов и ведет себя странно, если вы оставляете переменную выключеннойNEXT i
. Он также не распознаетASC
функцию, поэтому для запуска кода необходимо добавить этот обходной путь в начале:(Во второй раз, когда вы запустите его, переводчик будет жаловаться, если вы не удалите
DECLARE FUNCTION
строку, иди к рисунку.)источник
R 110
Пример:
источник