Моделювання машини реєстрації Мінських (II)


11

Це розширення моделювання машини реєстрації Мінського (I) . Я не збираюсь повторювати весь опис там, тому, будь ласка, прочитайте спочатку цей опис проблеми.

Граматика в частині (I) була максимально простою, але призводить до досить тривалих програм. Оскільки це веб-сайт з кодом для гольфу, ми вважаємо за краще граматику з гольфу, чи не так?

На високому рівні зміни від початкової граматики такі:

  • Мітка на першому рядку необов’язкова
  • Пробіл не є обов'язковим, за винятком випадків, коли потрібно розділити два сусідні ідентифікатори
  • Штати можна окреслити. Для забезпечення неоднозначного розбору, якщо перший стан операції декременту є вкладеним станом, він повинен бути включений в круглі дужки. Це означає, що будь-яку програму можна переграти в однолінійку.

Наприклад, у початкових тестових випадках ми мали:

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

У граматиці для гольфу це можна скоротити до:

init:t-init d
d:a-(b+t+d)a
a:t-(a+a)"Ok"
a=3 b=4

або навіть:

init:t-init d:a-(b+t+d)a:t-(a+a)"Ok"
a=3 b=4

Новий BNF для рядків "програми" (на відміну від кінцевого рядка, який є даними):

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

Ідентифікатори та повідомлення гнучкі, як і в попередньому виклику.


Усі тестові випадки з попереднього виклику досі застосовуються. Окрім того, наступне рішення гольфу Йосифа має більшу частину граматики:

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

Очікуваний вихід:

Ok
i=40 k=3 n=0 r=27 t=0

І я думаю, що це стосується решти випадків:

k+k-"nop""assert false"
k=3

Очікуваний вихід:

nop
k=3

Можна припустити, що всі програми матимуть розумну семантику. Зокрема, вони матимуть принаймні одну державу і не перероблятимуть її. Однак, як і раніше, стан може бути використаний до його визначення.

Рахунок є варіантом коду-гольфу. Ви можете написати автономну програму, і вона оцінюватиметься як довжина програми в байтах після кодування UTF-8. Крім того, оскільки повторне використання коду є доброю річчю, якщо ви реалізували частину (I) в n1байтах, ви можете написати програму, яка перетворює частину (II) програму в частину (I) програму, готову до переходу на оригінал. Ваш результат тоді буде тривалістю програми трансформації плюс ceil(n1 / 2).

Примітка: Якщо ви вибрали трансформацію, вам потрібно буде генерувати імена для анонімних станів таким чином, щоб ви гарантували, що вони не зіткнуться з названими станами.

Відповіді:


6

Haskell, 552 499 493 символів

import Control.Monad.RWS
import Data.Map
main=interact$z.lines
z x=let(s:_,w)=evalRWS(mapM(q.t)x)w[]in s.f.i.t$last x 
p=get>>=q
q(l:":":x)=x%do a<-p;tell$f[(l,a)];r a
q(v:"+":x)=x%fmap(.a v 1)p
q(v:"-":x)=x%liftM2(d v)p p
q(('"':s):x)=x%r(\w->unlines[init s,do(v,x)<-assocs w;v++'=':show x++" "])
q(n:x)|n<"*"=x%p|1<3=x%asks(!n)
d v p n w|member v w&&w!v>0=p$a v(-1)w|1<3=n w
t[]=[];t x=lex x>>= \(y,x)->y:t x
i(v:_:x:t)=(v,read x):i t;i[]=[]
x%m=put x>>m;r=return;a=insertWith(+);f=fromList

Зробив більш-менш повне перезапис. Замінили CPS монадою RWS, яка читає власний висновок, щоб шукати стани, які вона ще не розбирала (так, для лінь!), А також деякі інші настрої.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.