Główny układ jest pamięciowy urządzenia do przekształcania numerów słowami, więc mogą być zapamiętane łatwiej.
Opiera się na tym, jak słowa brzmią fonetycznie, ale aby uprościć sprawę, zajmiemy się tylko pisownią słów. Oznacza to, że będą jakieś nieprawidłowe konwersje, ale to w porządku.
Aby przekonwertować liczbę na słowo za pomocą naszego uproszczonego systemu głównego:
- Wymień każdy
0
zs
lubz
. (Niektóre mogą być,s
a niektóre mogąz
. To samo idzie poniżej.)- Zamień
1
je nat
lubd
lubth
.- Wymień każdy
2
zn
.- Wymień każdy
3
zm
.- Wymień każdy
4
zr
.- Wymień każdy
5
zl
.- Zamień
6
je naj
lubsh
lubch
.- Zamień
7
je nak
lubc
lubg
lubq
.- Wymień każdy
8
zf
lubv
.- Wymień każdy
9
zp
lubb
.- Dodaj litery w
aehiouwxy
dowolnym miejscu w dowolnych ilościach, aby, jeśli to możliwe, stworzyć prawdziwe angielskie słowo .
Jedynym wyjątkiem jest to, żeh
nie można wstawić pos
lubc
.Liczba może być w rzeczywistości dowolnym ciągiem cyfr od 0 do 9 (brak miejsc po przecinku, przecinki lub znaki).
Słowo może zawierać tylko małe litery az.
Przykłady
Liczbę 32
należy przekonwertować jako ?m?n?
, gdzie ?
reprezentuje dowolny skończony ciąg wykonany z liter aehiouwxy
(ciąg z wolnej monoidy, jeśli wolisz). Istnieje wiele sposobów, to może być wykonane do prawdziwego angielskiego słowa: mane
, moon
, yeoman
, itd.
Liczba 05
może być przekonwertowana jako ?s?l?
lub ?z?l?
. Niektóre możliwości są easily
, hassle
i hazel
. Słowo shawl
jest niedozwolone, ponieważ h
nie może zostać umieszczone po s
; byłby błędnie odczytany jako 65
.
Wyzwanie
Napisz program lub funkcję, która pobiera ciąg cyfr 0–9 i znajdzie wszystkie słowa, na które można by je przekonwertować, używając uproszczonego głównego systemu mnemonicznego.
Twój program ma dostęp do pliku tekstowego z listą słów, który określa, jakie są wszystkie „prawdziwe” angielskie słowa. W każdym wierszu tego pliku znajduje się jedno małe słowo az, a opcjonalnie można założyć, że ma on końcowy znak nowej linii. Oto lista prawdziwych słów, których możesz użyć do testowania. Możesz założyć, że ten plik listy słów nazywa się f
(lub coś dłuższego) i znajduje się w dowolnym wygodnym katalogu.
W przypadku kary 35 bajtów (dodaj 35 do wyniku) możesz założyć, że lista słów jest już załadowana do zmiennej jako lista ciągów znaków. Dotyczy to głównie języków, które nie potrafią odczytać plików, ale każde przesłanie może z nich skorzystać.
Twój program musi wypisać wszystkie słowa z listy słów, na które można przekonwertować numer wejściowy. Powinny być drukowane na standardowym (lub podobnym), po jednym w wierszu (z opcjonalnym końcowym znakiem nowej linii), lub mogą zostać zwrócone jako lista ciągów, jeśli zdecydujesz się napisać funkcję. Lista słów nie musi być alfabetycznie, a wynik nie musi być.
Jeśli nie ma możliwych słów, wynik (lub lista) będzie pusty. Dane wyjściowe są również puste, jeśli wprowadzono pusty ciąg.
Weź dane wejściowe za pomocą stdin, wiersza poleceń lub jako argument ciągu funkcji. Lista słów lub nazwa pliku nie powinny być częścią wejścia, a jedynie ciąg cyfr.
Pasujesz tylko pojedyncze słowa na liście słów, a nie sekwencje słów. Słowo noon
prawdopodobnie będzie jednym z wyników 22
, ale sekwencja słów no one
nie.
Przypadki testowe
Załóżmy, że jest to lista słów:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
zdnmrlshchvb
sthnmrlchgvb
shthnmrlchgvb
bob
pop
bop
bopy
boppy
Wejście 0123456789
powinno dać wszystkie z wyjątkiem długich słów zdnmrlshchvb
i shthnmrlchgvb
:
stnmrljkfp
zthnmrlshqfb
asatanamaralajakafapa
aizxydwwwnhimouooraleshhhcavabe
zdnmrlshcvb
sthnmrlchgvb
Dane wejściowe 99
powinny dać:
bob
pop
bop
bopy
(Słowa wyjściowe mogą być w dowolnej kolejności.)
Punktacja
Najkrótsze przesłanie w bajtach wygrywa. Tiebreaker przechodzi do przesłanego posta jako pierwszego.
Powiązana strona: numzi.com .
Odpowiedzi:
Perl,
8784Pobiera dane wejściowe jako parametr wiersza poleceń:
Może być nieco krótszy, jeśli lista słów byłaby dozwolona na standardowym wejściu:
źródło
A
oznacza wopen A,f
?<A>
).Python 2,
215208 bajtówTo rozwiązanie Pythona tworzy wyrażenie regularne z części indeksowanych argumentem wiersza poleceń, a następnie testuje każde słowo za pomocą tego (raczej dużego) wyrażenia regularnego.
Oryginalne źródło przed minifikatorem:
Na przykład wyrażenie regularne testu
99
to:Ten
(?<![sc])h
bit jest komponentem „patrz za asercją negatywną”, który zapewnia, że ah
nie następuje pos
lubc
w ogólnych części wypełniacza.Dzięki Calvin. To wyzwanie zmotywowało mnie do odświeżenia moich zardzewiałych umiejętności wyrażania regularnego.
źródło
b=c='((?<![sc])h|[aeiouwxy])*'
zapisze dwa bajty.t|th -> th?
zapisuje bajtPython 3, 170
Wersja do odczytu:
Kod korzysta z faktu, że
th
jest zbędny (ponieważ odwzorowuje na ten sam numer cot
ih
jest znakiem dopełniającym).Funkcja statyczna
maketrans
tworzy tabelę odwzorowującą znaki pierwszego argumentu na znaki drugiego argumentu oraz znaki trzeciego argumentu naNone
(co spowoduje usunięcie tych znaków).Ostateczny kod może zostać skrócony o kilka bajtów, tworząc tabelę jako bezpośredni argument
translate
.źródło
input()
można z nich skorzystać, ponieważ nazywa się je w pętli. Ponadto sugerowana regex ma taką samą długość jak ta, której już używam (5 bajtów).sed, pasta, grep, cut - 109
Pobiera plik „w”, konwertuje każde słowo na jego numer, wkleja z powrotem do oryginału, grep dla liczby i zwraca pasujące słowo. Zauważ, że biały znak po cytacie po grep jest tabulatorem, domyślnym ogranicznikiem wklejania.
Wiem, że Perl jest daleko przed nami, chciałem na przykład lepszej wersji powłoki.
O tak, część 1 $ oznacza, że należy go uruchamiać ze skryptu powłoki (większość powłok powinna działać), więc wymaga argumentu wiersza poleceń.
źródło
sed
aby uniknąć otwartego i@ARGV
narzutu Perla , ale brak zakresów i funkcji kasowaniay///
to psuje. Zaskakujące jest jednak to, że mimo braku zmiennych można bezpośrednio wyrazić logikęsed
. Oto moje 92 rozwiązanie:sed -e'h;s/[sc]h/6/g;y/sztdnmrljkcqgfvpb/00112345677778899/;s/[^0-9]*//g;T;s/^$1$//;x;t;d' f
Bash + coreutils, 216
w
sed
zastępuje cyfry ich możliwymi zamiennikamieval printf
zastosowania powłoki nawiasy rozszerzyć na wszystkie możliwe substytucjesed
w pierwszym wierszu usuwaaeiouwxy
ih
(jeśli nie jest poprzedzony[sc]
) z listy słówaeiouwxy
ih
z listy słów, ostatnised
zamienia wyniki grep (numery wierszy każdego dopasowania) na innesed
wyrażenie, które jest przetwarzane przez najbardziej zewnętrzne,sed
aby odsłonić wszystkie możliwe słowa z listy słów.Wynik:
Plik listy słów jest określony jako arg wiersza polecenia, po którym następuje liczba mnemoniczna:
źródło
tr, sed, grep, xargs, sh, 77
Oczekuje liczby w stdin, a lista słów powinna być zapisana w pliku
f
.Nie używa wszystkich zamienników (1 zawsze będzie z, 7 zawsze będzie k), więc można go nazwać leniwym rozwiązaniem, ale znajduje co najmniej jeden mnemonik dla 95 liczb w [1-100].
źródło
1
zawsze będzieszz
albo7
zawszek
. To jest nieprawidłowe.