Twoim dzisiejszym wyzwaniem jest wdrożenie funkcjonalności podobnej do T9 .
Zaimplementujesz funkcję, która będzie miała tylko 2 parametry.
Otrzymasz 1 numer telefonu w ciągu i zawartość pliku tekstowego z listą słów (nie zakładaj określonego stylu nowej linii).
Możesz użyć linku https://raw.githubusercontent.com/eneko/data-repository/master/data/words.txt, aby przetestować funkcjonalność, lub użyj /usr/share/dict/words
(zaznacz plik tekstowy z listą słów [zamknięty], aby uzyskać więcej Informacja).
Możesz założyć, że zawsze otrzymasz co najmniej 2 numery.
Biorąc pod uwagę liczbę, przeczytasz z listy słów i zwrócisz słowa zaczynające się od odwzorowania liter na te słowa. Oznacza to, że dane wejściowe powinny składać się tylko z liczb od 2 do 9.
Możesz zrobić co chcesz, jeśli otrzymasz nieprawidłowe dane wejściowe.
Jeśli nie zostanie znaleziony, można powrócić pustą listę, null
/ nil
albo 0
.
Pamiętaj, że klawisze telefonu są mapowane na odpowiadające im znaki:
- 0 i 1 są nieprawidłowe
- 2 mecze [abc]
- 3 dopasowane [def]
- 4 mecze [ghi]
- 5 dopasowania [jkl]
- 6 dopasowania [mno]
- 7 dopasowania [pqrs]
- 8 meczów [tuv]
- i 9 dopasowań [wxyz]
Przykłady:
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
Po uruchomieniu funkcji możesz wydrukować ją w dowolny sposób.
Zasady:
- Standardowe luki są NIEPRAWIDŁOWE
- Musisz coś zwrócić, nawet jeśli to
null
/nil
JavaScript zwróci,undefined
jeśli czegoś nie zwrócisz, dlatego ta reguła. - Nie możesz użyć lub ponownie zaimplementować odpowiedzi innych osób ani skopiować mojej implementacji.
- W przypadku Javascript można założyć, że przeglądarka zostanie już otwarta i że element
innerText
/textContent
elementu automatycznego zostanie przekazany jako drugi parametr - W przypadku języków skompilowanych nie można przekazywać kompilatorowi specjalnych argumentów
- Możesz otrzymać nazwę pliku zamiast argumentów kompilatora
- Zmienne, makra, zmienne globalne, stałe, niestandardowe klasy i wszystkie inne przekazywanie innych wartości wewnątrz funkcji zostaną uznane za nieprawidłowe.
- W JavaScript zmienne bez słowa kluczowego
var
powodują, że kod jest nieprawidłowy - Twoja funkcja zostanie nazwana
f
- Możesz mieć tylko i tylko 2 argumenty na swojej funkcji
- Staraj się, aby kod działał krócej niż 500 sekund.
- Nie musisz się martwić o białe znaki
- Musisz używać tylko znaków drukowalnych ASCII .
Wyjątkiem są języki, które używają tylko znaków niedrukowalnych (APL i białe znaki to 2 przykłady).
Punktacja:
- Najniższa liczba bajtów wygrywa
- Niepoprawne znaki drukowalne ASCII w odpowiedzi będą liczone jako odpowiedź kodowana w UTF-32
. Wyjątek od kodowania spowoduje, że odpowiedź będzie liczona według znaków . - Liczy się tylko ciało funkcji, nie licz niczego, co robisz poza nim
- Premia w wysokości -30%, jeśli stworzysz system przewidywania oparty na sąsiedztwie lub najczęściej używanych słowach
- Premia wielkości -20%, jeśli zwrócisz tylko 5 pierwszych dopasowań dla każdej litery odpowiadającej pierwszej cyfrze (np .: 245 zwróci 5 słów zaczynających się na „a”, 5 zaczynających się na „b” i 5 zaczynających się na „c” ).
Oto przykład implementacji przy użyciu 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);
}
Aby go uruchomić, otwórz link do listy i uruchom, na przykład:
f('9999',document.getElementsByTagName('pre')[0].innerText);
//returns [" Zyzzogeton "]
Ten przykład został przetestowany i działa pod kontrolą Opery 12.17 64bits w systemie Windows 7 Home Edition 64bits.
Odpowiedzi:
CJam, 28 bajtów
Pobiera dane wejściowe w postaci
"<number>" [<list of words>]
Przykład:
Wynik:
Na razie nie będzie żadnego bonusu.
Wypróbuj kod online tutaj, ale aby zmierzyć rzeczywisty czas, uruchom go na kompilatorze Java
Zauważ, że CJam reprezentuje puste listy, takie jak
""
Aby przekonwertować surową listę słów na listę CJam, użyj następującego kodu z listą słów jako danymi wejściowymi:
źródło
Java: 395
Tworzy to wzór wyrażenia regularnego na podstawie liter, które są dozwolone dla każdej liczby, a następnie wstawia znak „*” na końcu, aby dopasować dowolne następujące znaki.
Oto wersja golfowa:
A oto wersja dla golfistów bez umiejętności czytania
źródło
f
”.([W-Zw-z)]
) powinno być([W-Zw-z])
. A w Code-golf nie musisz się martwić stylami programowania i dobrymi praktykami: twój kod musi po prostu robić to z wymaganymi parametrami. Jeśli zaznaczysz moją odpowiedź, widać ten wiersz:$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];
. To jest okropne „przestępstwo” w PHP. Zasadniczo zmuszam PHP do konwersji nieistniejących stałych na ciągi. Jest to całkowicie do przyjęcia. Zobaczysz również, że nawet nie ustawiam zmiennej$t
na tablicę przed użyciem jej jako takiejC # .NET 4.5 235
To powinno działać:
źródło
foreach
w niej użyć znaku. Jeśli spodziewasz się, że tak już jestIEnumerable
, dołącz kod użyty na zewnątrza
var.a
var. Ale naprawdę widzę zauważalną poprawę! Tak trzymaj.Python 2 (155 bajtów)
Powinien także działać w Pythonie 3 z odpowiednimi zamiennikami (
string
->bytes
,b
przedrostek na ciągach znaków itp.).Nie byłem pewien, czy
maketrans
wywołanie poza funkcją jest uważane za „prawidłowe”; jeśli nie, funkcja ma 134 bajty i jest przeniesiona do środka.EDYCJA: Usunięto jeden bajt z głupiego niedopatrzenia.
Z przygotowanymi
maketrans
67 bajtami:W
maketrans
ciele 134 bajty:Z
import
imaketrans
w ciele, 155 bajtów:Połączenie testowe:
źródło
maketrans
Jest częścią ciała funkcji. Powinieneś to przenieść. Nie wiem, czy to w ogóle możliwe, ale możesz spróbować bezpośrednio użyćimport
. Myślę, że gdzieś to widziałem ... Ale twój kod jest naprawdę fajny!t=(from stirng import maketrans)([...])
. Nie mam pojęcia, czy to w ogóle możliwe. Ale może możesz użyć,from string import as x t=x([...])
którego nie jestem pewien, czy jest to również możliwe: /__import__('string').maketran
.PHP 5.4+ (
171186-20% = 148,8 bajtów):Cóż, to dość duża odpowiedź, ale dobrze.
Mam nadzieję, że dzięki temu więcej osób odpowie.
Ta funkcja oczekuje na odczytanie surowej zawartości.
Oto kod:
Działa to poprzez sprawdzenie, czy litera znajduje się na liście dozwolonych liter.
Przykład: dane wejściowe
36
sprawdziłyby, czy1abc
ma pierwszą literę słowa, a która1def
ma drugą literę.Dołączam,
1
aby nie sprawdzało, czy list znajduje się na 1. pozycji (która wróciłaby0
i to by się zmieniłofalse
).if(!strpos(1..$s[$c],$v[$i]))
lubif(!strpos($c.$s[$c],$v[$i]))
będzie miał ten sam efekt, ale 1. myli bardziej i podoba mi się to.W przeciwnym razie słowo zostanie usunięte.
Bez pozostawionych słów zwraca pustą tablicę.
Aby przetestować to online, przejdź na stronę http://writecodeonline.com/php/ i utwórz prostą zmienną ze słowem linia.
Testowalny przykład:
To powinno wygenerować:
Aby pracować na starszych wersjach php, zamień
$s=[2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz];
na$s=array(2=>abc,def,ghi,jkl,mno,pqrs,tuv,wxyz);
W przypadku premii 20%:
Aby zmniejszyć kod, po prostu dodałem
||$t[$v[0]]++>4
, który sprawdza, ile razy pierwsza litera została użyta.W php
$t
nie trzeba definiować, co pomaga zmniejszyć dużą porcję 37,2 bajtów.Aby zobaczyć ten efekt, użyj następującej zmiennej jako drugiego argumentu:
źródło