Uproszczona wersja kalkulatora z cyframi angielskimi
Zadanie
Napisz program, który pobiera ciąg znaków jako dane wejściowe i wyprowadza wynik wyrażenia.
Zasady
Łańcuch wejściowy będzie sformułowany, a nie liczbowo.
Nie będzie nawiasów.
Kolejność obliczeń zostanie podzielona, pomnożona, odjęta, a następnie dodana.
W przypadku tych samych operacji obliczenia należy wykonać od lewej do prawej.
Wszystkie liczby wejściowe będą liczbami całkowitymi od -999 do 999 (obie włącznie)
Wyjście będzie liczbą całkowitą dowolnego zakresu.
Podział zawsze będzie doskonale podzielny, a zero nigdy nie będzie mianownikiem.
Ograniczenie wielkości liter do wprowadzenia jest opcjonalne. Nie musisz sprawdzać poprawności danych wejściowych.
Format liczbowy
0 to 20 -> zero,one,two...nineteen,twenty
21 to 99 -> twenty one,twenty two.....ninety eight,ninety nine
100 to 999 -> one hundred, one hundred one, one hundred two...one hundred ten....two hundred fifty....nine hundred ninety eight,nine hundred ninety nine
W przypadku liczb ujemnych: dodaj minus
do jego dodatniego odpowiednika
Format operacji
Addition: one plus two
Subtraction: one minus two
Multiplication: one time two #Note that for one on the left of multiplication, it is one time and not times.
two times one hundred
Division: forty divided by two
Przykłady:
o/p <- input
20 four times five
35 twenty plus fifteen
70 fifty plus five times four
-90 minus one time ninety
25 twenty one minus minus four
45 ninety divided by two
700 one time seven hundred
555 one hundred eleven times two plus three hundred thirty three
99 one hundred plus minus one
45 forty five plus two hundred times zero
4 four
-3 three minus three minus three
To jest golf golfowy, więc wygrywa najkrótszy kod
one times two
. Czy używasztime
normalnego?Odpowiedzi:
JavaScript (ES6),
257252249235 bajtówZaoszczędź 3 bajty dzięki @Shaggy
Wypróbuj online!
W jaki sposób?
Liczby
Operatorzy
Interpretacja
źródło
Perl 6 ,
170 139 129 128 124122 bajtów-13 bajtów dzięki nwellnhof!
Wypróbuj online!
unival
na ratunek ponownie! To (obecnie) nawet pokonanie języków gry w golfa05AB1E
!Wyjaśnienie:
źródło
Python 2 ,
333...284277275 bajtówWypróbuj online!
źródło
Wolfram Language
95 9482 bajtów#
reprezentuje dane wejściowe dla czystej funkcji.W razie potrzeby
StringReplace
zastępuje "czas" z czasów " "Plus minus" z ""(poprzez minus"me "->"mes "
,"plus m"->"m
", odpowiednio). Skrócone formularze zastępcze, sugerowane przezlirtosiast
, zapisały 12 bajtów.Interpreter["SemanticExpression"]
robi całą resztę.źródło
"time "->"times "
na"me"->"mes"
i"plus minus"->"minus"
na"plus m"->"m"
?05AB1E ,
166147141139 139135 bajtówO wiele za długo .. Spróbuję stąd zagrać w golfa.
-4 bajty dzięki @Emigna .
-2 bajty dzięki @JoKing .
Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
Zobacz ten 05AB1E końcówki kopalni (sekcje Jak korzystać ze słownika? , Jak kompresować strun nie jest częścią słownika? I Jak skompresować dużych liczb całkowitych? ) , Aby zrozumieć jak
“¡×€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š—¿áÓÁÏ“
,'…§
,'°¡
,.•4º»Ÿć'Rþн•
,Ž9o
, i“‰´Øè„Æ€ººß“
pracy.Przykład krok po kroku:
two hundred twenty two divided by two times minus fifty seven plus three hundred eighteen minus minus ten
two hundred twenty two divided two times minus fifty seven plus three hundred eighteen minus minus ten
2 hundred twenty 2 divided 2 times minus fifty 7 plus 3 hundred 8een minus minus 10
2 hundred weny 2 divided 2 imes minus fify 7 plus 3 hundred 8een minus minus 10
2 hundred weny 2 divided 2 imes minus fify 7 plus 3 hundred 8+10 minus minus 10
2 *100 weny 2 divided 2 imes minus fify 7 plus 3 *100 8+10 minus minus 10
2 *100 2y 2 divided 2 imes minus 5y 7 plus 3 *100 8+10 minus minus 10
2 *100 2 *10 2 divided 2 imes minus 5 *10 7 plus 3 *100 8+10 minus minus 10
["2 *100 2 *10 2 "," 2 "," "," 5 *10 7 "," 3 *100 8+10 "," "," 10"]
[["2","","*100","2","*10","2",""],["","","2",""],["",""],["","5","*10","7",""],["","3","","*100","8+10",""],["",""],["","10"]]
[["2","*100","2","*10","2"],["2"],[],["5","*10","7"],["3","*100","8+10"],[],["10"]]
[["2*100","2*10","2"],["2"],"",["5*10","7"],["3*100","8+10"],"",["10"]]
eval
każdy:[[200,20,2],[2],"",[50,7],[300,18],"",[10]]
[222,2,"",57,318,"",10]
dividedimesminusplusminusminus
[" /"," *"," -"," +"," -"," -"]
222 /2 * -57 +318 - -10
eval
ciąg i dane wyjściowe niejawnie:-5999.0
źródło
sfk ,
572449423 bajtówMoże to być jedna linia, ale do jej odczytu użyłem znaku nowej linii zamiast spacji.
Wypróbuj online!
źródło