Wprowadzenie
Forte to bardzo osobliwy ezoteryczny język oparty na koncepcji modyfikacji wartości liczb. W Forte liczby nie są stałymi, ale zmiennymi, możesz użyć LET
instrukcji, aby przypisać im nowe wartości.
Na przykład po wykonaniu LET 2=4-1
od teraz 2
przyjmuje wartość 3
, co oznacza, że ilekroć wartość 2
pojawia się w wyrażeniu, zamiast tego jest „zastępowana” przez 3
. Wyrażenie (1+1)*2
będzie teraz oceniać na 9
.
Ta instrukcja w Forte służy zarówno do przechowywania informacji, jak i do kontroli przepływu (linie są ponumerowane, a zmieniając wartość ich liczb można określić kolejność ich wykonywania). W tym wyzwaniu nie zajmiemy się tym drugim aspektem.
Wyzwanie
Musisz napisać interpreter dla uproszczonego podzbioru LET
wyrażeń Forte .
Otrzymasz jako dane wejściowe serię wierszy następujących po tej gramatyce:
<line>::= <number>=<expression>
<expression>::= <number>|<expression>+<number>
Uwaga: ta gramatyka jest nieprawidłowa, ponieważ nie ma w niej numerów linii, LET i nawiasów (które są zawsze obowiązkowe)
Oznacza to, że będziesz musiał poradzić sobie tylko z obliczaniem sum i przypisywaniem wartości liczbom. W nawiasach wejściowych nie będzie nawiasów i każde wyrażenie będzie musiało być oceniane od lewej do prawej: strzeż się, że na częściowe wyniki wpływają redefinicje!
Liczby zawsze będą liczbami całkowitymi nieujemnymi, aż do limitu rodzimych liczb całkowitych twojego języka (lub 2 ^ 32, w zależności od tego, która wartość jest wyższa).
Dla każdego wiersza powinieneś wypisać wynik wyrażenia i przypisać ten wynik (ewentualnie ponownie przypisanej) wartości pierwszej liczby, co wpłynie na sposób interpretacji kolejnych wierszy.
To jest code-golf , wygrywa najkrótszy kod (w bajtach)!
Inne zasady
- Format wejściowy jest elastyczny, możesz na przykład wziąć pojedynczy ciąg znaków z nowymi wierszami, listę ciągów, listę list liczb ... To samo dotyczy wyniku, o ile jest jasne, jaki jest wynik każdego wyrażenia w wejście.
- Możesz przesłać funkcję, pełny program lub rozwiązanie do uruchomienia w środowisku REPL, wywołując je raz dla każdej linii.
- Standardowe luki są zabronione, w szczególności nie można wywołać zewnętrznego interpretera Forte w kodzie.
Przykłady
Wszystkie są częścią tego samego wejścia. Po każdej linii wyświetlana jest oczekiwana wydajność w stosunku do tej linii, czasami z komentarzem wskazującym odpowiednie zmiany przypisania (nie jest częścią wymaganego wyniku).
5=4
4
6=5
4 # 5 -> 4
7=1+2+5
7
7=5+2+1
4 # Order of operations matters! 5+2 -> 4+2 -> 6 -> 4
18=5+6+7
12
5=3
3 # Remember: 5 -> 4
10=6+4
3 # 6 -> 4 -> 3, 3+3 = 6 -> 3
0
jest poprawny („Liczby zawsze będą nieujemnymi liczbami całkowitymi”)
0
jest poprawny numer?