Це розширення моделювання машини реєстрації Мінського (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)
.
Примітка: Якщо ви вибрали трансформацію, вам потрібно буде генерувати імена для анонімних станів таким чином, щоб ви гарантували, що вони не зіткнуться з названими станами.