Utwórz program, który rozwiązuje wyrażenie matematyczne, używając elementów z naprzemiennych stron wyrażenia. Robi się to tak, że zamiast czytać od lewej do prawej, czytasz pierwszy znak, potem ostatni, potem drugi, potem od drugiego do ostatniego itd. To da ci nowe wyrażenie, które musisz ocenić i wygenerować.
a*b/c+d-e
135798642 <-- Order you read the expression in
ae*-bd/+c <-- Order of operation.
Przykład:
1*3/2+4-5
15*-34/+2 = -255
Jeśli wyrażenie nie «działa», 1
należy wstawić a w niezbędne pozycje, aby działało.
Kilka przykładów prawdopodobnie lepiej to zilustruje:
Input: 1+1+1+1+1
Result: 23 // Because 1+1+1+1+1 -> 11++11++1 -> 23
Input: 1+2-3+12-5
Result: -19 // Because 1+2-3+12-5 -> 15+-22-13+ -> 15+-22-13+1 -> -19
// |
// Not valid expression
Input: 2*2*2*2*2
Result: 968 // Because 2*2*2*2*2 -> 22**22**2 -> 22*1*22*1*2 -> 968
// || ||
// Not valid, 1 must be inserted
Input: 17/2
Output: 127 // Because 17/2 = 127/ -> 127/1 -> 127
Obsługiwani są operatorzy + - * /
. Nie będzie nawiasów. Stosowane są normalne reguły matematyczne i „składnia”, więc na przykład **
nie oznacza to potęgowania. a++++1
jest równoważne a+1
(tj. styl MATLAB, a nie C ++).
W razie wątpliwości niektóre prawidłowe operacje to:
-a
+a
a++b
a+-b
a*-b
a*+b
a*++b
a/b
a/-b
a/+b
-a/--b
Chociaż wszystkie poniższe elementy są nieprawidłowe. Pokazano, co należy zastąpić:
a+ | a+1
a- | a-1
a++++ | a++++1 (This is equivalent to a+1)
a*+++ | a*+++1 (This is equivalent to a*1)
a**b | a*1*b
a*/b | a*1/b
a/*b | a/1*b
a* | a*1
*a | 1*a
***a | 1*1*1*a
Zasady:
- Kod może być funkcją lub pełnym programem
- Danymi wejściowymi może być STDIN lub argument funkcji
- Dane wejściowe muszą być prawidłowym wyrażeniem matematycznym bez cudzysłowów
''
lub""
. - Wynik powinien być odpowiedzią na nowe wyrażenie, jako liczbę całkowitą, dziesiętną lub ułamek uproszczony.
- Muszą być obsługiwane co najmniej trzy cyfry po przecinku. Więc
1/3 = 0.333
nie0.33
.0.333333333
jest akceptowane. ans = ...
jest akceptowane.- Wiodące i końcowe znaki nowej linii i spacje są akceptowane.
- Dane wejściowe będą tylko liczbami całkowitymi
- Dzielenie przez zero może skutkować błędem, NaN, Inf itp. Podanie liczby nie jest akceptowane.
Jak zawsze wygrywa najkrótszy kod w bajtach. Zwycięzca zostanie wybrany tydzień po opublikowaniu wyzwania. Odpowiedzi zamieszczone później mogą nadal wygrywać, jeśli są krótsze niż aktualny lider.
źródło
2^64
, czy powinienem ją zawinąć lub zawinąć, jeśli przejdziesz?0/0
jeśli wyrażenie zmienia się na dzielenie całkowite lub modulo przez zero?x/0
jest to poprawny wynik. Dopóki nie wyświetli niepoprawnej odpowiedzi, jest OK. Błąd i „Brak liczby” jest z definicji poprawny, a nieskończoność jest „wystarczająco poprawna”,Odpowiedzi:
Perl,
108100 bajtówKod ma 96 bajtów plus 4 dla argumentu wiersza poleceń
-pF//
, gdzie-p
wkładkiwhile (<>) { .. } continue { print }
i-F//
dzieli wejście i wstawia je@F
.Zauważ, że wejście nie powinno mieć końcowego nowego wiersza, więc użyj
/bin/echo -n 'formula' | perl ...
Mniej golfa:
Testowanie
Umieść powyższe w pliku o nazwie
114.pl
, a poniższy skrypt testowy w pliku obok:Uruchomienie go powoduje:
Zauważ, że
1/0
powoduje błąd dzielenia przez zero:eval
wyjściaundef
, które są reprezentowane przez pusty ciąg.źródło
JavaScript ES6, 105
106Edytuj Zapisany 1 bajt thx @ Kenney
Testowy fragment kodu
źródło
p < '0' ? ( c=='/' | c<'+' || ' ' )+c : c ;
.