Pracujesz dla firmy, która chce stworzyć przyjazny dla użytkownika kalkulator, dlatego też powierzono ci zadanie dodania możliwości używania przez użytkowników „skrótów numerycznych”, czyli liter reprezentujących wartości liczbowe, na przykład kdla 1000. Ponieważ Twoja firma chce zaoszczędzić pieniądze na przechowywaniu we wspomnianych kalkulatorach, musisz maksymalnie zminimalizować swój kod, aby zmniejszyć koszty przechowywania.
Twoje zadanie
Masz utworzyć funkcję, która albo odczytuje wyrażenie jako dane wejściowe z STDIN, albo przyjmuje je jako parametr i zwraca jego ocenę lub drukuje je do STDOUT.
Trochę wyjaśnienia
Pozwól mi zrobić kilka definicji. Po pierwsze, mamy dane wejściowe, które nazywam wyrażeniem. Może to być coś takiego:
x + y / z
W ramach tej wypowiedzi mamy trzy liczby: x, y, i z, oddzielone przez operatorów ( +i /). Liczby te niekoniecznie są dodatnimi liczbami całkowitymi (lub nawet liczbami całkowitymi). To, co komplikuje sytuację, to konieczność oceny skrótów zawartych w liczbach. Na przykład za pomocą
2k15
dla celów oceny, możemy podzielić to na trzy numery: 2, 1000(co jest k), i 15. Następnie, zgodnie z zasadami, łączymy je, aby uzyskać
2*1000 + 15 = 2015
Mamy nadzieję, że dzięki temu nieco łatwiej jest zrozumieć następujące zasady.
Zasady
NB O ile nie określono inaczej, można interpretować słowo „liczby” lub jego synonimy w celu uwzględnienia skrótów.
Poniższa stanowi numeryczne shorthands czynność musi być w stanie procesu:
k, m, b, t, and e.k, m, b, and todpowiadają1000, 1000000, 1000000000, and 1000000000000odpowiednio wartościom (tysiąc, jeden milion, jeden miliard i jeden bilion). Poeskrócie zawsze będzie następowała inna liczban, i reprezentuje10^n. Musisz pozwolić, aby stenografia numeryczna była obecnani obecna wcześnieje. Na przykładkekocenia na1000*10^1000.Dla uproszczenia, jeśli liczba zawiera skrót
e, zostanie użyta tylko raz.Dowolna liczba ( łącznie ze skrótami ) przed skrótem jest przez nią mnożona. np.
120kkzostanie oceniony jako120 * 1000 * 1000. Jeśli nie ma przed nim żadnej liczby, musisz założyć, że liczba wynosi 1 (podobnie jak w matematyce możesz traktować zmiennąxdomyślnie jako1x). np.e10ocenia na10^10. Kolejny przykład:2m2kocenia na2*1000000*2*1000(nic nie jest do niego dodawane).Dodaje się do niej dowolną liczbę (skróty nie mają zastosowania) po ostatnim skrócie w liczbie zawierającej skróty. np.
2k12zostanie oceniony jako2*1000 + 12. Wyjątkiem jest sytuacjae, w której stosuje się skrót , w którym to przypadku liczba (wraz ze skrótami )ebędzie traktowana jakoni oceniana jako10^n(patrz pierwsza reguła).Twoja funkcja musi być w stanie przetwarzać operatory,
+, -, *, and /które odpowiednio dodają, odejmują, mnożą i dzielą. Jeśli chcesz, może przetwarzać więcej.Operacje są oceniane zgodnie z kolejnością operacji.
Liczby w skrótach to nie tylko liczby całkowite.
3.5b1.2jest ważny i należy go oceniać jako3.5*1000000000 + 1.2 = 3500000001.2Wbudowane nie są dozwolone, jeśli istnieją dla tego rodzaju rzeczy. Wyjątkiem, który dodam, byłoby, gdyby Twój język automatycznie konwertuje duże liczby na notację naukową, w którym to przypadku jest to dopuszczalne dla twoich wyników.
Najkrótszy kod w bajtach wygrywa, obowiązują standardowe luki.
Wejście
Dane wejściowe będą wyrażeniem z każdą liczbą i operatorem oddzielonymi spacjami. Liczby mogą zawierać skrót lub nie. Przykład pokazano poniżej:
10 + 1b - 2k
Wynik
Twoja funkcja musi wyświetlać ocenę wyrażenia jako liczbę. Dopuszczalne jest stosowanie notacji naukowej, jeśli wynik byłby zbyt duży do wyświetlenia. Musisz mieć co najmniej trzy miejsca po przecinku, jeśli liczba nie jest liczbą całkowitą. Dopuszczalne jest zachowanie tych miejsc dziesiętnych, jeśli liczba jest liczbą całkowitą.
Przypadki testowe
Wejście
t
Wynik
1000000000000
Wejście
1 + 4b / 10k11
Wynik
399561.483
Wejście
e2 + k2ke-1 - b12
Wynik
-999799912
lub
-999799912.000
Wejście
142ek12
Wynik
142e1012
lub
142.000e1012
Wejście:
1.2m5.25
Wynik:
1200005.25
Uwagi końcowe
To jest moje pierwsze opublikowane wyzwanie (z pewną pomocą użytkowników w piaskownicy). Jeśli coś jest niejasne, daj mi znać, a ja postaram się wyjaśnić.
1000 + 2000 * 10 ^ -1, ale to dało ostateczną odpowiedź na -999998712. (Poza tym moja interpretacja nie wydaje się mieszać z „ ostatnią stenografią ” z reguły 4 , ale nie jestem pewien, jak inaczej zrozumieć sekwencję k2k.) Czy możesz wyjaśnić kroki w jej ocenie?
2m2kpowinna być dodana do dyskusji rządów 3. Ponadto, może być najlepiej użyć innego terminu - może „całkowitą” - dla dosłowne numery jak 123to nie są stenografiami. Słowo „liczba” ma w tej chwili około 3 różnych definicji.