Ваша задача сегодня - реализовать функциональность, подобную t9 .
Вы реализуете функцию, которая будет иметь только 2 параметра.
Вы получите 1 номер телефона в строке и содержимое текстового файла со списком слов (не используйте конкретный стиль перевода строки).
Вы можете использовать ссылку https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt, чтобы проверить функциональность, или использовать /usr/share/dict/words
(проверьте текстовый файл со списком слов [закрыто], чтобы узнать больше Информация).
Вы можете предположить, что вы всегда получите как минимум 2 номера.
Учитывая число, вы будете читать из списка слов и возвращать слова, начинающиеся с букв, сопоставляемых с этими словами. Это означает, что ввод должен состоять только из цифр от 2 до 9.
Вы можете делать все, что захотите, если получите неверный ввод.
Если совпадение не найдено, вы можете вернуть пустой список, null
/ nil
или 0
.
Помните, что клавиши мобильного телефона сопоставлены с их эквивалентными символами:
- 0 и 1 недействительны
- 2 матча [abc]
- 3 совпало [def]
- 4 матча [гхи]
- 5 матчей [jkl]
- 6 матчей [мно]
- 7 матчей [pqrs]
- 8 матчей [tuv]
- и 9 совпадений [wxyz]
Примеры:
f('52726')
//returns ["Japan","japan","Japanee","Japanese","Japanesque"...,"larbowlines"]
f('552')
//returns ["Kjeldahl","kjeldahlization","kjeldahlize"...,"Lleu","Llew"]
f('1234')
//makes demons fly out your nose or divide by 0
f('9999')
//returns ["Zyzzogeton"]
f('999999')
//returns [] or null/nil or 0
После того, как вы запустите свою функцию, вы можете распечатать ее любым удобным вам способом.
Правила:
- Стандартные лазейки НЕВЕРНЫ
- Вы должны что-то вернуть, даже если это
null
/nil
Javascript будет возвращать,undefined
если вы что-то не возвращаете, поэтому это правило. - Вы не можете использовать или повторно реализовывать ответы других или копировать мою реализацию.
- Для Javascript вы можете предположить, что браузер будет уже открыт и что
innerText
/textContent
из автоматического элемента будет передан в качестве второго параметра - Для скомпилированных языков вы не можете передавать специальные аргументы компилятору
- Вы можете получить имя файла через аргументы компилятора
- Переменные, макросы, глобальные переменные, константы, нестандартные классы и все виды, передающие другие значения внутри функции, будут считаться недействительными.
- В Javascript переменные без ключевого слова
var
делают ваш код недействительным - Ваша функция будет названа
f
- Вы можете только и только иметь 2 аргумента в вашей функции
- Постарайтесь, чтобы ваш код работал менее 500 секунд.
- Вам не нужно беспокоиться о пробелах
- Вы должны использовать только печатные символы ASCII .
Исключением являются языки, которые используют только непечатаемые символы (2 примера - APL и пробелы).
Подсчет очков:
- Наименьшее количество выигранных байтов
- Наличие в вашем ответе недопустимых печатных символов ASCII будет засчитываться как кодировка ответа в UTF-32
. Исключение из кодировки заставит ваш ответ быть посчитанным символами . - Подсчитывает только тело функции, не считайте ничего, что вы делаете вне ее
- Бонус -30%, если вы делаете систему прогнозирования на основе соседства или наиболее распространенных слов
- Бонус -20% в размере, если вы возвращаете только первые 5 совпадений для каждой буквы, соответствующей первому числу (например: 245 вернет 5 слов, начинающихся с «a», 5, начинающихся с «b», и 5, начинающихся с «c» ).
Вот пример реализации, использующей Javascript:
function f(phone, words)
{
var keypad=['','','abc','def','ghi','jkl','mno','pqrs','tuv','wxyz'];
var regex='';
for(var i=0,l=phone.length;i<l;i++)
{
regex+='['+keypad[phone[i]]+']';
}
var regexp=new RegExp('\\s('+regex+'[a-z]*)\\s','gi');
return words.match(regexp);
}
Чтобы запустить его, откройте ссылку списка и запустите, например:
f('9999',document.getElementsByTagName('pre')[0].innerText);
//returns [" Zyzzogeton "]
Этот пример был протестирован и работает под 64-битной версией Opera 12.17 на 64-битной Windows 7 Home Edition.
Ответы:
CJam, 28 байт
Принимает вход в виде
"<number>" [<list of words>]
Пример:
Вывод:
Пока не собираюсь ни за какой бонус.
Попробуйте код здесь, но для измерения реального времени запустите его на компиляторе Java.
Обратите внимание, что CJam представляет пустые списки, такие как
""
Чтобы преобразовать необработанный список слов в список CJam, используйте следующий код со списком слов в качестве входных данных:
источник
Ява: 395
Это формирует шаблон регулярного выражения на основе букв, которые разрешены для каждого числа, а затем в конце ставится на. *, Чтобы соответствовать любым следующим символам.
Вот версия для гольфа:
А вот версия для одаренных
источник
f
».([W-Zw-z)]
) это должно быть([W-Zw-z])
. И в Code-golf вам не нужно беспокоиться о стилях программирования и хороших методах: ваш код должен просто выполнять свою работу с необходимыми параметрами. Если вы отметите мой ответ, вы увидите следующую строку:$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];
. Это ужасное «преступление» в PHP. В основном я заставляю PHP преобразовывать несуществующие константы в строки. Это вполне приемлемо. Вы также увидите, что я даже не устанавливаю переменную$t
в массив, прежде чем использовать ее как таковуюC # .NET 4.5 235
Это должно работать:
источник
foreach
. Если вы ожидаете, что это уже будетIEnumerable
, включите код, используемый снаружиa
переменной.a
переменной. Но я действительно вижу заметные улучшения! Продолжайте хорошую работу.Python 2 (155 байт)
Также должен работать в Python 3 с соответствующими заменами (
string
->bytes
,b
префикс на строки и т. Д.).Я не был уверен, что
maketrans
вызов вне функции считается "честным"; если нет, функция составляет 134 байта с перемещением внутрь.РЕДАКТИРОВАТЬ: Отбросил один байт из-за глупого недосмотра.
С подготовленными
maketrans
67 байтами:С
maketrans
в теле, 134 байта:С
import
иmaketrans
в теле, 155 байтов:Тестовый звонок:
источник
maketrans
Является частью тела функции. Вы должны переместить это. Я не знаю, возможно ли это вообще, но вы можете попробовать напрямую использоватьimport
. Я думаю, что где-то видел ... Но ваш код действительно хорош!t=(from stirng import maketrans)([...])
. Я понятия не имею, возможно ли это вообще. Но, может быть, вы можете использовать то,from string import as x t=x([...])
что я не уверен, если это тоже возможно: /__import__('string').maketran
.PHP 5.4+ (
171186-20% = 148,8 байта):Ну, это довольно огромный ответ, но хорошо.
Я надеюсь, что это заставит больше людей отвечать.
Эта функция ожидает чтения необработанного содержимого.
Вот код:
Это работает, проверяя, что письмо находится в списке разрешенных писем.
Пример: ввод
36
будет сделан, чтобы проверить,1abc
имеет ли первая буква слова, и которая1def
имеет 2-ю букву.Я добавляю,
1
чтобы он не проверял, находится ли буква в 1-й позиции (которая вернется0
и будет оцененаfalse
).if(!strpos(1..$s[$c],$v[$i]))
илиif(!strpos($c.$s[$c],$v[$i]))
будет иметь тот же эффект, но 1-е смущает больше, и мне это нравится.В противном случае будет удалено слово.
Если не осталось слов, он возвращает пустой массив.
Чтобы проверить это онлайн, перейдите на http://writecodeonline.com/php/ и создайте простую переменную со словом для строки.
Тестируемый пример:
Это должно вывести:
Для работы на старых версиях php замените
$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];
на$s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz);
Для бонуса 20%:
Чтобы уменьшить код, я просто добавил
||$t[$v[0]]++>4
, который проверяет, сколько раз использовалась первая буква.В php
$t
указывать не нужно, что помогает уменьшить большой кусок в 37,2 байта.Чтобы увидеть этот эффект, используйте следующую переменную в качестве второго аргумента:
источник