Codegolf — Реализовать Функциональность, Подобную T9

  • Автор темы Oleco
  • Обновлено
  • 22, Oct 2024
  • #1

Ваша задача сегодня — реализовать функциональность, подобную t9.

Вы реализуете функцию, которая будет иметь только два параметра.
Вы получите 1 номер телефона в строке и содержимое текстового файла со списком слов (не предполагайте определенный стиль новой строки).
Вы можете использовать ссылку https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt для проверки функциональности или использования

 
 
 f('9999',document.getElementsByTagName('pre')[0].innerText);
//returns [" Zyzzogeton "]
 
(check Текстовый файл со списком слов [закрыт] для получения дополнительной информации).

Вы можете предположить, что вы всегда получите как минимум 2 номера.

Учитывая число, вы будете читать из списка слов и возвращать слова, начинающиеся с букв, соответствующих этим словам. Это значит, что на входе должны быть только цифры от 2 до 9.
Вы можете делать все, что захотите, если получили неверный ввод.

Если совпадение не найдено, вы можете вернуть пустой список, 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 или var .

Помните, что клавиши мобильного телефона сопоставлены с эквивалентными символами:

  • 0 и 1 недействительны
  • 2 совпадения [abc]
  • 3 совпадающих [определение]
  • 4 совпадения [ги]
  • 5 совпадений [jkl]
  • 6 совпадений [мно]
  • 7 совпадений [pqrs]
  • 8 матчей [тув]
  • и 9 совпадений [wxyz]

Примеры:

textContent

После запуска функции вы можете распечатать ее любым способом.

Правила:

  • Стандартные лазейки НЕДЕЙСТВИТЕЛЬНЫ
  • Вы должны что-то вернуть, даже если это innerText / undefined
    Javascript вернется nil if you don't return something, therefore this rule.
  • Вы не можете использовать или повторно реализовывать ответы других или копировать мою реализацию.
  • Для Javascript вы можете предположить, что браузер уже открыт и что null / 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 автоматического элемента будет передан в качестве второго параметра
  • Для компилируемых языков вы не можете передавать компилятору специальные аргументы.
  • Вы можете получить имя файла через аргументы компилятора.
  • Переменные, макросы, глобальные переменные, константы, нестандартные классы и все такое, передающее другие значения внутри функции, будут считаться недействительными.
  • В Javascript переменные без ключевого слова 0 render your code invalid
  • Ваша функция будет называться nil
  • У вашей функции может быть только 2 аргумента.
  • Старайтесь, чтобы время выполнения вашего кода не превышало 500 секунд.
  • Вам не нужно беспокоиться о пробелах
  • Вы должны использовать только ASCII печатные символы.
    Исключением являются языки, которые только используйте непечатаемые символы (2 примера — APL и пробелы).

Оценка:

  • Выигрывает наименьшее количество байтов
  • Имея недействительный ASCII печатные символы в вашем ответе будут считаться ответом, закодированным в UTF-32
    Исключение из кодировки приведет к тому, что ваш ответ будет засчитан персонажи.
  • Учитывается только тело функции, не учитывайте все, что вы делаете за его пределами.
  • Бонус -30%, если вы создадите систему прогнозирования на основе соседства или наиболее распространенных слов.
  • Бонус в размере -20% в размере, если вы возвращаете только первые 5 совпадений для каждой буквы, соответствующей первой цифре (например: 245 вернет 5 слов, начинающихся с «a», 5, начинающихся с «b», и 5, начинающихся с «c». ).

Вот пример реализации с использованием Javascript:

null

Для его запуска откройте ссылку списка и запустите, например:

/usr/share/dict/words

Этот пример был протестирован и работает в 64-разрядной версии Opera 12.17 в 64-разрядной версии Windows 7 Home Edition.

#код-гольф #номер #функция

Oleco


Рег
15 Mar, 2020

Тем
73

Постов
204

Баллов
629
  • 26, Oct 2024
  • #2

CJam, 28 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 $lines=<<<WORDS
one
two
three
four
five
six
seven
eight
nine
ten
twelve
time
tutor
test
truth
WORDS;
 

Принимает входные данные в виде $t

Пример:

||$t[$v[0]]++>4

Выход:

$s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz);

Никаких бонусов пока не собираюсь.

Попробуйте код онлайн здесь но для реальных измерений времени запустите его на Java-компилятор

Обратите внимание, что CJam представляет пустые списки, например $s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];

Чтобы преобразовать необработанный список слов в список CJam, используйте следующий код со списком слов в качестве входных данных:

array(1) { [3]=> string(4) "four" } ||answer||

Ява: 395

Это формирует шаблон регулярного выражения на основе букв, разрешенных для каждого числа, а затем добавляет .* в конце, чтобы соответствовать любым последующим символам.

Вот версия для гольфа:

function f($_,$a) { $s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz); $a=preg_split('@\r\n|\r|\n@',$a); for($i=0;$c=$_[$i];++$i) foreach($a as$k=>$v) if(!strpos(1..$s[$c],$v[$i]) || $t[$v[0]]++>4) unset($a[$k]); return$a; } $lines=<<<WORDS one two three four five six seven eight nine ten WORDS; var_dump(f('36',$lines));

А вот негольфированная версия для читабельности

if(!strpos($c.$s[$c],$v[$i])) ||answer||

С# .NET 4.5 235

Это должно работать:

if(!strpos(1..$s[$c],$v[$i])) ||answer||

Питон 2 (155 байт)

Также должно работать в Python 3 с соответствующими заменами ( false -> 0 , 1 prefix on strings, etc.).

Я не был уверен, что наличие 1def call outside the function is considered "fair"; if not, the function is 134 bytes with it moved inside.

РЕДАКТИРОВАТЬ: Из-за глупой оплошности выпал один байт.

С подготовленным 1abc , 67 bytes:

36

С function f($_,$a){$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];$a=preg_split('@\r\n|\r|\n@',$a);for($i=0;$c=$_[$i];++$i)foreach($a as$k=>$v)if(!strpos(1..$s[$c],$v[$i])||$t[$v[0]]++>4)unset($a[$k]);return$a;} in body, 134 bytes:

print f('9999',open('words.txt','rt').read())

С def f(n,w): return[x for x in w.split()if x.lower().translate(__import__('string').maketrans('abcdefghijklmnopqrstuvwxyz','22233344455566677778889999')).startswith(n)] and maketrans в теле, 155 байт:

import

Тестовый звонок:

from string import maketrans def f(n,w): return[x for x in w.split()if x.lower().translate(maketrans('abcdefghijklmnopqrstuvwxyz','22233344455566677778889999')).startswith(n)] ||answer||

PHP 5.4+ (171 186-20% = 148,8 байт):

Ну, это довольно большой ответ, но что ж.

Я надеюсь, что это поможет большему количеству людей ответить.

Эта функция ожидает сырой читаемый контент.

Вот код:

maketrans

Это работает путем проверки того, что буква находится в списке разрешенных букв.

Пример: ввод from string import maketrans t=maketrans('abcdefghijklmnopqrstuvwxyz','22233344455566677778889999') def f(n,w): return[x for x in w.split()if x.lower().translate(t).startswith(n)] would make to check if maketrans есть первая буква слова и это maketrans has the 2nd letter.

Я добавляю b so it doesn't check if the letter is in the 1st position (which would return bytes и это будет оцениваться как string ). IEnumerable<string>F(string n,string d){IEnumerable<string>w=d.Split(null).ToList();string[]a={"","","abc","def","ghi", "jkl","mno","pqrs","tuv","wxyz"};foreach(var i in n){w=w.Where(x=>x.IndexOfAny(a[i-'0'].ToArray())>0);}return w;} или public static ArrayList<String> f(String phoneNumber, ArrayList<String> dictionary) { String[] KEY_VALUES = {"", "", "([A-Ca-c])", "([D-Fd-f])", "([G-Ig-i])", "([J-Lj-l])", "([M-Om-o])", "([P-Sp-s])", "([T-Vt-v])", "([W-Zw-z])"}; String regex = ""; for (int i = 0; i < phoneNumber.length(); ++i) { regex += KEY_VALUES[phoneNumber.charAt(i) - '0']; } regex += ".*"; Pattern p = Pattern.compile(regex); ArrayList<String> answers = new ArrayList<String>(); for (String word : dictionary) { if (p.matcher(word).matches()) { answers.add(word); } } return answers; } will have the same effect, but the 1st confuses more and I like it.

В противном случае слово будет удалено.

Если слов не осталось, он возвращает пустой массив.

Чтобы проверить это онлайн, перейдите по ссылке http://writecodeonline.com/php/ и создайте простую переменную со словом для строки.

Тестируемый пример:

static ArrayList<String> f(String n,ArrayList<String> d){String[] k={"","","([A-Ca-c])","([D-Fd-f])","([G-Ig-i])","([J-Lj-l])","([M-Om-o])","([P-Sp-s])","([T-Vt-v])","([W-Zw-z])"};String r="";for(int i=0;i<n.length();++i)r+=k[n.charAt(i)-'0'];r += ".*";Pattern p=Pattern.compile(r);ArrayList<String> a=new ArrayList<String>();for(String w:dictionary)if(p.matcher(w).matches())a.add(w);return a;}

Это должно вывести:

qN/p

Для работы со старыми версиями PHP замените "" by ["Japan" "japan" "Japanee" "Japanese" "Japanesque" "larbowlines"]


Для бонуса 20%:

Чтобы уменьшить код, я просто добавил "52726" ["Japan" "japan" "Japanee" "Japanese" "Japanesque" "larbowlines" "ablution" "ablutionary" "abluvion" "ably" "abmho" "Abnaki" "abnegate"] , which checks how many times the first letter was used.

В PHP, "<number>" [<list of words>] doesn't need to be defined, helping to reduce a big chunk of 37.2 байты.

Чтобы увидеть этот эффект, используйте следующую переменную в качестве второго аргумента:

q~{el{'h-_9/-D+3/}%s1$#!},p;
 

Exceegodeloms3


Рег
25 Oct, 2024

Тем
70

Постов
216

Баллов
596
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно