Рассмотрим грамматику над алфавитом { 0
, 1
, ?
, :
} определяется правилом производства
s →
0
┃1
┃0
?
s:
s ┃1
?
s:
s
Получив строку, сгенерированную из s , проанализируйте ее как выражение, где ?:
ассоциативно справа (например, a?B?X:Y:c?d:e?f:g
означает a?(B?X:Y):(c?d:(e?f:g))
), и оцените ее с помощью следующей семантики:
eval(0) = 0
eval(1) = 1
eval(0?a:b) = eval(b)
eval(1?a:b) = eval(a)
Если результат равен 0 , выведите некоторое фиксированное значение; если вывод равен 1 , выведите другое фиксированное значение. Укажите выбранные выходные значения (например, 0
/ 1
или False
/ True
) в своем ответе.
Контрольные примеры
0 -> 0
1 -> 1
0?0:1 -> 1
0?1:0 -> 0
1?0:1 -> 0
1?1:0 -> 1
0?1?0:1:1 -> 1
1?0?1:1:1 -> 1
1?0:1?0:1?1:1 -> 0
1?1?1:0?1?0:0:0:0 -> 1
1?0:1?0?1:1?1:0:1?1?1:1:1?0:1 -> 0
1?1?1:0?0?1:1:0?1:0:1?1?0?0:0:1?1:0:0?1?0:1:1?0:1 -> 1
0?0?1?0?0:1:0?0:0:0?0?1:1:1?0:1:0?0?0?1:0:0?1:1:1?1?0:1:1 -> 0
правила
- Вы не можете использовать встроенные языковые модули, которые интерпретируют строки как код в каком-либо языке программирования и запускают его (например, JavaScript / Perl / Ruby / Python
eval
). - Тем не менее, ваш код на самом деле не должен анализировать и затем оценивать входную строку. Вы можете использовать любой подход, чтобы получить эквивалентные результаты и не нарушать предыдущее правило.
- Ваша программа будет проверена
perl -le 'print eval<>'
. - Самый короткий код (в байтах) выигрывает.
S → T | T ? S : S
, T → 0 | 1
, устраняя необходимость говорить о ассоциативности?