Ostatnio piszę nowy język , aby uniknąć konieczności porządkowania operacji , po prostu odpowiednio nawiasuję każde wyrażenie, aby całkowicie tego uniknąć.
Ponieważ nawiasy znajdują się w kodach znaków 40-41, kod będzie musiał być jak najkrótszy.
Przykłady
1+2*3
(1+(2*3))
2*(3+4)
(2*(3+4))
2*3/4+3
(((2*3)/4)+3)
342*32/8
((342*32)/8)
Zasady
Jedyne operacje, które musisz obsłużyć to: *
(mnożenie), /
(dzielenie), +
(dodawanie) i -
(odejmowanie).
- Kolejność operacji jest:
- Nawias
- Mnożenie, dzielenie
- Dodawanie, odejmowanie
- Powinieneś iść w lewo-prawo
- Liczby wejściowe zawsze będą dodatnimi liczbami całkowitymi (patrz bonusy)
Bonusy
-20%, jeśli poradzisz sobie z negacją:
3+-5
(3+(-5))
-5%, jeśli pozwalasz na umieszczenie spacji w danych wejściowych:
3 + 4
(3+4)
-10%, jeśli potrafisz obsłużyć ułamki dziesiętne w danych wejściowych:
1+.12
(1+.12)
1+0.21/3
(1+(0.21/3))
500 nagród: jeśli uda ci się napisać odpowiedź w Unnamed / Blocks
code-golf
arithmetic
balanced-string
Downgoat
źródło
źródło
1+2+3+4
(które niektóre rozwiązania mogą być w nawiasach jako((1+2)+(3+4))
)Odpowiedzi:
Python, 153 * 0,9 = 137,7 bajtów
Ten program obsługuje wprowadzanie dziesiętne.
Druga linia zaczyna się spacją, druga zaczyna się od tabulacji, trzecia od dwóch tabulatorów, a trzecia spacją. To oszczędzało jeden bajt. Oto zrzut heksadecymalny (
xxd
pp):Oto program, którego użyłem do testowania: (Zapisz program powyżej jako
paren.py
)Upewnij się, że twój terminal używa
\033[38;5;<COL>m
kodu ucieczki dla kolorów.źródło
prefer to go left-right
. Wypróbuj przypadek testowy 3 w OP, twój wynik jest nieprawidłowy. Może to być prawdziwy problem na przykład z arytmetyką liczb całkowitych((2*(3/4))+3)
(((2*3)/4)+3)
JavaScript (ES6) 179 (263-20% -5% -10%)
Ponieważ pozostałe dwie odpowiedzi są obecnie błędne, opublikuję moje. Jest to odmiana parsera wyrażeń, którego użyłem tu i tu i gdzie indziej. Poszukaj bardziej szczegółowych wyjaśnień algorytmu.
Jest dość nieporęczny, ale powinien działać.
Testowy fragment kodu
źródło
Python, 241 * 0,8 * 0,95 * 0,9 = 164,84 znaków
Korzystam z biblioteki ast (Abstract Syntax Trees) i dyktora zastępującego ciąg znaków homebrew. Wymiana łańcucha kosztuje dużo, ale premia pomaga utrzymać wynik na nieco niskim poziomie. Może (część zamienna) można dalej grać w golfa.
Zauważ, że to rozwiązanie dodaje dodatkowy zestaw nawiasów wokół każdej liczby, ale myślę, że jest to zgodne z duchem pytania
Zestaw testowy:
Dane wyjściowe zestawu testowego:
źródło
import ast
twojego kodu