Это расширение Simulate Minsky Register Machine (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)
.
NB. Если вы выберете преобразование, вам нужно будет генерировать имена для анонимных состояний таким образом, чтобы гарантировать, что они не конфликтуют с именованными состояниями.
источник