Wprowadzenie
W dzieciństwie przychodzi moment, kiedy myślisz, że opanowałeś dodawanie i mnożenie, a potem ktoś przychodzi i informuje cię, że:
a * b + c = (a * b) + c! = a * (b + c),
i że nie był to tak prosty lub liniowy proces, jak wcześniej nauczono. Dowiadujesz się, że istnieje coś o nazwie kolejność operacji . Jest to bardzo ważny sposób na zachowanie pewnego poziomu spójności i wyrażeń, bez nawiasów przeszkadzających we wszystkim.
Ogólna historia
Pewnego dnia budzisz się na tle paniki na ulicach. Ekstremistyczna grupa pod nazwą „ 2560 ” (skrót od „Organizacja przeciw porządkowi operacji”, z dziwnym zwrotem szesnastkowym) zastosowała swoje złe metody, aby przejąć kontrolę nad całą bronią nuklearną na świecie. Trzymają zakładników na całej planecie i mają proste żądanie: odwrócić przyjętą kolejność operacji lub wyeliminować twarz (nawiasy mają zachować swój priorytet). Nowy system nazywa się PSADME (nawiasy, odejmowanie / dodawanie, dzielenie / mnożenie, wykładniki), a wyrażenia oceniają od prawej do lewej:
a - b - c = a - (b - c) = a + c - b
Mijają dni i przejście jest w toku. Podczas gdy matematycy i fizycy są zajęci przepisywaniem swoich równań, informatycy stają przed zadaniem zmiany sposobu, w jaki wyrażenia matematyczne są interpretowane przez komputery. Należysz do tajnej grupy programistów rebeliantów, której celem jest spowodowanie tylu udręk dla nowych globalnych władców - i przypadkowo jesteś wybierany losowo przez The 2560 i ma za zadanie stworzyć program do obliczania testów porównawczych.
Twoja misja
Napisz program (lub funkcję), który pobiera (numeryczne) wyrażenie matematyczne jako dane wejściowe, oblicza wyrażenie za pomocą PSADME jako kolejności operacji i wyświetla wynik. Wyrażenia powinny oceniać od prawej do lewej, więc
Dla uproszczenia wszystkie podane liczby będą liczbami całkowitymi, a obliczenia dadzą wyniki całkowite.
Zasady i punktacja
- Program powinien akceptować wprowadzanie danych o długości do 128 znaków - jeśli Twój język / platforma ma mniejszą maksymalną długość wprowadzania, jest to dopuszczalna wymówka.
- Standardowe luki są zabronione.
- Zwycięski kod zostanie wybrany 18 listopada (4 tygodnie od tej daty ogłoszenia).
- Możesz wpisać kod pocztowy, który nie byłby warty gry w golfa. Chodzi o zabawę. Jeśli masz ciekawy sposób na zrobienie tego, ale nie możesz sam zagrać w golfa (lub z natury swojej metody), możesz mimo to opublikować.
Jak zwykle zwycięskim kodem jest ten, który ma najmniej bajtów, z pewnymi bonusami o wartości rozrywkowej:
- -5, aby uniknąć użycia znaków w podanym wyrażeniu: + , - , ( , ) , ^ , * , /
- -5 - wykonanie obliczeń zajmuje więcej niż 5 minut (ale nie więcej niż 10 minut), aby wykonać obliczenia na standardowym komputerze, przy czym metoda nie jest oczywista (przy użyciu zegara lub niepotrzebnych pętli); Celem jest przekonanie nowych władców, że nie próbujesz zakłócać obliczeń zagłady.
- - (5 + N) dla bezpośredniej ofensywnej wiadomości (o długości N, z wyłączeniem początkowych / końcowych białych znaków) na temat członków The 2560, które mają być napisane na pierwszy rzut oka w twoim kodzie, z niedorzecznym wyjaśnieniem, dlaczego musi to być tam. Jeśli zostanie usunięty, kod nie może działać poprawnie. Tak, darmowe punkty za wartość rozrywkową.
Przykłady i objaśnienia
[program] 2 - 2 - 2
2
2 - (2 - 2) = 2
[program] (2 + 2 * 3 + 3) / 3 + 3
4
(4 * 6) / (3 + 3) = 4
[program] 3 + 2 + 1 ^ 3
216
(3 + 2 + 1) ^ 3 = 216
[program] -5^2
25
(-5) ^ 2 = 25
[program] 32 / 8 * 3 - 1
2
32 / (8 * (3-1)) = 32/16 = 2
1 - 3 + 4 = 1 - 7
? Sugeruje to od prawej do lewej, ale w przeciwieństwie do PSADME oznacza to dodawanie dodatków przed odejmowaniem, prawda?P(SA)(DM)E
.Odpowiedzi:
Haskell, 134 bajty
Nowa definicja operatorów matematycznych dzięki nowym rozwiązaniom i priorytetom. Teraz:
źródło
perl -e'$_="import qualified Prelude as Pl 6^r 8+r 8-r 7*r 7/";s/(. \d(.))/\ninfix\1\n(\2)=(P.\2)/g;s~\./~.div~;print'>a.hs;ghci a.hs
Niestety, literówka spowodowała, że w wygenerowanym kodzie brakuje spacji między cyfrą a symbolem, ale nadal działa poprawnie. Oznacza to, że Twój kod może stracić 5 bajtów i bije moją „poprawę”.sed
do generowania i oceny kodu powłoki. Prawdopodobnie dobre pytanie meta.GNU sed -r z rozszerzeniem exec, 398
Niezbyt krótki, ale wykonuje pracę.
sed nadaje się do analizowania pierwszeństwa, ale nie wykonuje arytmetyki. Używamy więc rozszerzenia GNU sed exec do
s
polecenia, aby zlecić powłoce niezbędną arytmetykę.Na razie zakłada się, że wszyscy operatorzy, z wyjątkiem tego,
^
że mają dokładnie jedno miejsce z przodu i z tyłu.Wyjście testowe:
źródło
JavaScript (ES6) 287
300Naprawiono błąd edycji (tylko literówka, 6 powinno być 4) - Dodano pełne wyjaśnienie na końcu fragmentu
Edycja 2 Znaleziono usprawnienia w pracy nad kolejnym wyzwaniem
Kolejne przeniesienie tego samego parsera z minimalną różnicą. (porównaj z tym )
źródło