Розглянемо граматику над алфавітом { 0
, 1
, ?
, :
} визначається правилом виробництва
s →
0
┃1
┃0
?
років:
з ┃1
?
и:
и
Давши рядок, згенерований з 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's
eval
). - При цьому ваш код насправді не повинен аналізувати, а потім оцінювати рядок введення. Ви можете скористатися будь-яким підходом, який досягає еквівалентних результатів і не порушує попереднє правило.
- Ваша програма буде перевірена
perl -le 'print eval<>'
. - Виграє найкоротший код (у байтах).
S → T | T ? S : S
, T → 0 | 1
, усуваючи необхідність говорити про асоціативності?