To wyzwanie jest podobne do tego drugiego , jednak wprowadziłem ograniczenie (patrz pogrubiony tekst poniżej), które moim zdaniem uczyniłoby to znacznie trudniejszym i (mam nadzieję) dobrą zabawę.
Wyzwanie
Napisz program lub funkcję w dowolnym języku programowania, który przyjmuje jako dane wejściowe angielską nazwę dodatniej liczby całkowitej n
nieprzekraczającej 100
i zwraca n
jako liczbę całkowitą.
Standardowe luki są zabronione i nie można używać żadnych wbudowanych funkcji, narzędzi zewnętrznych ani bibliotek, które już wykonują to zadanie .
Najkrótszy kod źródłowy w bajtach wygrywa.
Test
Tutaj wszystkie input->output
przypadki:
one -> 1
two -> 2
three -> 3
four -> 4
five -> 5
six -> 6
seven -> 7
eight -> 8
nine -> 9
ten -> 10
eleven -> 11
twelve -> 12
thirteen -> 13
fourteen -> 14
fifteen -> 15
sixteen -> 16
seventeen -> 17
eighteen -> 18
nineteen -> 19
twenty -> 20
twenty-one -> 21
twenty-two -> 22
twenty-three -> 23
twenty-four -> 24
twenty-five -> 25
twenty-six -> 26
twenty-seven -> 27
twenty-eight -> 28
twenty-nine -> 29
thirty -> 30
thirty-one -> 31
thirty-two -> 32
thirty-three -> 33
thirty-four -> 34
thirty-five -> 35
thirty-six -> 36
thirty-seven -> 37
thirty-eight -> 38
thirty-nine -> 39
forty -> 40
forty-one -> 41
forty-two -> 42
forty-three -> 43
forty-four -> 44
forty-five -> 45
forty-six -> 46
forty-seven -> 47
forty-eight -> 48
forty-nine -> 49
fifty -> 50
fifty-one -> 51
fifty-two -> 52
fifty-three -> 53
fifty-four -> 54
fifty-five -> 55
fifty-six -> 56
fifty-seven -> 57
fifty-eight -> 58
fifty-nine -> 59
sixty -> 60
sixty-one -> 61
sixty-two -> 62
sixty-three -> 63
sixty-four -> 64
sixty-five -> 65
sixty-six -> 66
sixty-seven -> 67
sixty-eight -> 68
sixty-nine -> 69
seventy -> 70
seventy-one -> 71
seventy-two -> 72
seventy-three -> 73
seventy-four -> 74
seventy-five -> 75
seventy-six -> 76
seventy-seven -> 77
seventy-eight -> 78
seventy-nine -> 79
eighty -> 80
eighty-one -> 81
eighty-two -> 82
eighty-three -> 83
eighty-four -> 84
eighty-five -> 85
eighty-six -> 86
eighty-seven -> 87
eighty-eight -> 88
eighty-nine -> 89
ninety -> 90
ninety-one -> 91
ninety-two -> 92
ninety-three -> 93
ninety-four -> 94
ninety-five -> 95
ninety-six -> 96
ninety-seven -> 97
ninety-eight -> 98
ninety-nine -> 99
one hundred -> 100
Odpowiedzi:
C, 160 bajtów
Sprawdź to
Jak to działa
Po kilku próbach, znalazłem funkcję, która odwzorowuje "wyjątkowe" numery
one
,two
,three
,four
,five
,six
,seven
,eight
,nine
,ten
,eleven
,twelve
,thirteen
,fourteen
,fifteen
,sixteen
,seventeen
,eighteen
,nineteen
,twenty
,thirty
,forty
,fifty
,sixty
,seventy
,eighty
,ninety
,one hundred
, do znaków ASCIIk
,.
,[
,<
,*
,,
c
,K
,w
,y
,e
,(
,S
,_
,-
,C
,)
,7
,=
,4
,&
,o
,]
,s
,Y
,g
,m
,N
, Odpowiednio.Ta funkcja to:
Program w golfa oblicza
hash
funkcję wejścia, dopóki nie osiągnie końca łańcucha lub znaku-
. Następnie przeszukuje skrót w ciąguk.[<* cKwye(S_-C)7=4&o]sYgmN
i określa odpowiednią liczbę. Jeśli osiągnięto koniec ciągu wejściowego, zwracana jest liczba, jeśli zamiast tego-
osiągnięto a, to zwracana jest liczba plus wynik programu gry w golfa zastosowanego do reszty ciągu wejściowego.źródło
JavaScript (ES6),
175166163156153147 bajtówZaoszczędź 7 bajtów dzięki @Neil
Sprawdź to tutaj:
Pokaż fragment kodu
Jak to działa
Podstawową ideą jest podzielenie każdej liczby na słowa cyfrowe, a następnie odwzorowanie każdego słowa na odpowiednią cyfrę. Prawie wszystkie słowa są ustawione tak, aby były odpowiednio dopasowane za pomocą prostego wyrażenia regularnego, ale istnieje kilka anomalii:
eleven
przeznineteen
: jeśli słowo zawierael
, lub ate
w środku (aby uniknąćten
), dodajemyon-
na początku znak , zmieniając je na „on-eleven
przez”on-nineteen
.twenty
,thirty
Itp .: zastąpienie końcowego znakuy
ze-d
zmiany tetwent-d
,thirt-d
itdTeraz dzielimy się na łączniki, spacje i
dr
s. Dzieli to wszystko od 11 do 99 na odpowiadające im słowa cyfrowe i"one hundred"
na[one,hun,ed]
. Następnie mapujemy każde z tych słów za pomocą tablicy wyrażeń regularnych i zachowujemy indeks tego, który pasuje jako pierwszy.Do tej pory każde wejście będzie tablicą odpowiednich cyfr. Wszystko, co musimy zrobić, to dołączyć do nich
join``
, przekonwertować na liczbę z jednostką+
, i gotowe.źródło
.findIndex(y=>x.match(y))
działa?replace
.sh + coreutils, 112 bajtów
Może być uruchamiany na wszystkich testach jednocześnie, po jednym na linię.
Wyjaśnienie
Backticked
awk
oceniased
skryptktóry przekształca części liczb w ich reprezentację numeryczną.
Dodatkowe wiersze skryptu sed
zająć się
-ty
s ione hundred
.Na koniec usuń wiodące
+
s i wszystko, co nie jest+
,*
lub cyfrę.Pozostają tylko wyrażenia matematyczne
i może być wpuszczony
bc
.źródło
Pyth,
79767568 bajtówDziękujemy @ETHproductions za 7 bajtów.
Zasadniczo najpierw sprawdza przypadek narożny 100, a następnie używa tablicy pierwszych dwóch liter liczb od 0 do 11, aby określić semantykę wejścia i zmodyfikować wartość zgodnie z sufiksem („-ty” i „-teen”; ” lv ”w 12 to kolejny przypadek narożny). Najpierw dzieli dane wejściowe na listę słów, a następnie mapuje każde z nich na wartość i sumuje je.
W pythonowym pseudokodzie:
Zestaw testowy
Python 3, 218 bajtów
Zasadniczo identyczny z odpowiedzią na Pyth.
Poza tematem:
Właśnie odkryłem sensowną wersję odpowiedzi na życie, wszechświat i wszystko: to spragnione herbaty gałązki. Wow, gałązki tęsknią za herbatą! Nie jestem pewien, ile innych odpowiedzi to robi, ale dla mojej odpowiedzi, jeśli wejście to „spragniony herbaty”, wynik to 42.
źródło
"ontwthfofisiseeiniteel"
tego programu.Python 3,
365361310303 znakówGrał w golfa
Nie golfił
źródło
n="one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thirteen,fourteen,fifteen,sixteen,seventeen,eighteen,nineteen,twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".split(",")
Ale jak widzę, powinien działać bez przypisywania go do zmiennej n, wystarczy wywołać.index()
bezpośrednio na niej."one,two,three,four,five,six,seven,eight,nine,ten,eleven,twelve,thir;four;fif;six;seven;eigh;nine;twenty,thirty,forty,fifty,sixty,seventy,eighty,ninety,one hundred".replace(";","teen,").split(",")
.Haskell,
252231 bajtówSpowoduje to utworzenie listy wszystkich angielskich nazw liczb od „jeden” do „dziewięćdziesiąt dziewięć”, a następnie przeglądanie indeksu danych wejściowych w górę. Jeśli nie istnieje, to w przypadku krawędzi sto „sto”, więc zwraca
100
, w przeciwnym razie zwróci indeks.Nie golfił
źródło
Python 2, 275 znaków
Po prostu buduje listę każdej liczby i znajduje indeks.
źródło
Japt, 82 bajty
Każda
¿
reprezentuje niezadrukowany znak. Przetestuj online!Na podstawie mojej odpowiedzi JS. Odejmij jeden bajt, jeśli wynik nie musi być liczbą całkowitą, ponieważ wyglądałby dokładnie tak samo jak łańcuch.
Jak to działa
źródło
JavaScript,
214199 bajtówJak zawsze: okazuje się, że jest to zbyt długo, aby konkurować, ale teraz, kiedy skończyłem, marnowanie czasu na publikowanie tego byłoby marnotrawstwem.
Być może istnieje oczywisty sposób na grę w golfa, który przeoczyłem?
JSFiddle dla przypadków testowych
źródło
f
sięf=s=>([t,u]=s.split('-'),~s.indexOf('le')?11:~s.indexOf('lv')?12:e(t)+(t.slice(-3)=='een')*10+''+(u?e(u):t.slice(-1)=='y'?0:''))
? Ponadto do funkcji takiej można przekazać argument o jednym łańcuchu:s.indexOf`lv`
Perl, 158 bajtów
Działa z wiersza poleceń.
one hundred
należy wprowadzić w taki sposób,"one hundred"
aby nie interpretować go jako dwóch danych wejściowych.źródło