Jest to rozszerzenie Simulate a Minsky Register Machine (I) . Nie zamierzam powtarzać tam całego opisu, więc proszę najpierw przeczytaj opis problemu.
Gramatyka w części (I) była tak prosta, jak to możliwe, ale skutkuje dość długimi programami. Ponieważ jest to strona z kodem do golfa, wolelibyśmy gramatykę golfową, prawda?
Na wysokim poziomie zmiany w stosunku do oryginalnej gramatyki są następujące:
- Etykieta w pierwszym wierszu jest opcjonalna
- Biała spacja jest opcjonalna, z wyjątkiem przypadków, gdy wymagane jest oddzielenie dwóch sąsiadujących identyfikatorów
- Stany można wstawić. Aby zapewnić jednoznaczną analizę, jeśli pierwszym stanem operacji dekrementacji jest stan wbudowany, musi być ujęty w nawiasy. Oznacza to, że każdy program może być rozgrywany w jedną linię.
Na przykład w oryginalnych przypadkach testowych mieliśmy:
b + = a, t = 0
init : t - init d0
d0 : a - d1 a0
d1 : b + d2
d2 : t + d0
a0 : t - a1 "Ok"
a1 : a + a0
a=3 b=4
W gramatyce golfowej można to skrócić do:
init:t-init d
d:a-(b+t+d)a
a:t-(a+a)"Ok"
a=3 b=4
lub nawet:
init:t-init d:a-(b+t+d)a:t-(a+a)"Ok"
a=3 b=4
Nowy BNF dla linii „programowych” (w przeciwieństwie do ostatniej linii, którą są dane) to:
program ::= first_line (newline line)*
first_line ::= cmd
line ::= named_cmd
state ::= state_name
| cmd
| '"' message '"'
delim_state::= '(' cmd ')'
| '"' message '"'
cmd ::= raw_cmd
| named_cmd
named_cmd ::= state_name ' '* ':' ' '* raw_cmd
raw_cmd ::= inc_cmd
| dec_cmd
inc_cmd ::= reg_name ' '* '+' ' '* state
dec_cmd ::= reg_name ' '* '-' ' '* delim_state ' '* state
| reg_name ' '* '-' ' '* state_name ' '* delim_state
| reg_name ' '* '-' ' '* state_name ' '+ state
state_name ::= identifier
reg_name ::= identifier
Identyfikatory i komunikaty są elastyczne, jak w poprzednim wyzwaniu.
Wszystkie przypadki testowe z poprzedniego wyzwania nadal obowiązują. Ponadto następujące rozwiązanie Josepha Golfa z golfem powinno ćwiczyć większość gramatyki:
in:k-(r+t+in)in2:t-(k+in2)r-(i+n-0"ERROR n is 0")"ERROR k is 0"
0:n-(i+2:k-(r+t+2)5:t-(k+5)7:i-(r-(t+7)c:t-(i+r+c)i+0)a:t-(i+a)7)"Ok"
n=40 k=3
Oczekiwany wynik:
Ok
i=40 k=3 n=0 r=27 t=0
I myślę, że dotyczy to pozostałej sprawy:
k+k-"nop""assert false"
k=3
Oczekiwany wynik:
nop
k=3
Możesz założyć, że wszystkie programy będą miały sensowną semantykę. W szczególności będą miały co najmniej jeden stan i nie zdefiniują go ponownie. Jednak, jak poprzednio, stan może być użyty przed jego zdefiniowaniem.
Punktacja jest wariantem golfa kodowego. Możesz napisać samodzielny program, który uzyska wynik jako długość programu w bajtach po kodowaniu UTF-8. Alternatywnie, ponieważ ponowne użycie kodu jest Dobrą Rzeczą, jeśli zaimplementowałeś część (I) w n1
bajtach, możesz napisać program, który zamienia program części (II) w program części (I), gotowy do potokowania do oryginału. Twój wynik będzie wtedy równy długości twojego programu transformacji plus ceil(n1 / 2)
.
Uwaga: Jeśli zdecydujesz się na transformację, będziesz musiał wygenerować nazwy stanów anonimowych w taki sposób, aby zagwarantować, że nie będą one kolidować z nazwanymi stanami.