Considere uma gramática sobre o alfabeto { 0
, 1
, ?
, :
} definido pela regra de produção
s →
0
┃1
┃0
?
s:
s ┃1
?
s:
s
Dada uma sequência gerada a partir de s , analise-a como uma expressão ?:
associativa à direita (por exemplo, a?B?X:Y:c?d:e?f:g
significa a?(B?X:Y):(c?d:(e?f:g))
) e avalie-a com a seguinte semântica:
eval(0) = 0
eval(1) = 1
eval(0?a:b) = eval(b)
eval(1?a:b) = eval(a)
Se o resultado for 0 , produza algum valor fixo; se a saída for 1 , produza um valor fixo diferente. Especifique seus valores de saída escolhidos (por exemplo, 0
/ 1
ou False
/ True
) em sua resposta.
Casos de teste
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
Regras
- Você não pode usar built-ins de linguagem que interpretam seqüências de caracteres como código em alguma linguagem de programação e as executam (como JavaScript / Perl / Ruby / Python
eval
). - Dito isto, seu código não realmente têm para analisar e, em seguida, avaliar a cadeia de entrada. Você pode adotar qualquer abordagem que alcance resultados equivalentes e não viole a regra anterior.
- Seu programa será verificado
perl -le 'print eval<>'
. - O código mais curto (em bytes) vence.
S → T | T ? S : S
, T → 0 | 1
, eliminando a necessidade de falar sobre associatividade?