Prendere in considerazione una grammatica sopra l'alfabeto { 0
, 1
, ?
, :
} definita dalla regola di produzione
s →
0
┃1
┃0
?
s:
s ┃1
?
s:
s
Data una stringa generata da s , analizzala come un'espressione in cui ?:
è associativo a destra (ad esempio, a?B?X:Y:c?d:e?f:g
significa a?(B?X:Y):(c?d:(e?f:g))
) e valutala con la seguente semantica:
eval(0) = 0
eval(1) = 1
eval(0?a:b) = eval(b)
eval(1?a:b) = eval(a)
Se il risultato è 0 , genera un valore fisso; se l'uscita è 1 , emette un valore fisso diverso. Specificare i valori di output scelti (ad es. 0
/ 1
, O False
/ True
) nella risposta.
Casi test
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
Regole
- Non è possibile utilizzare il linguaggio integrato che interpreta le stringhe come codice in alcuni linguaggi di programmazione ed eseguirlo (come JavaScript / Perl / Ruby / Python
eval
). - Detto questo, il codice non deve effettivamente analizzare e quindi valutare la stringa di input. Puoi seguire qualsiasi approccio per ottenere risultati equivalenti e non violare la regola precedente.
- Il tuo programma verrà verificato rispetto
perl -le 'print eval<>'
. - Vince il codice più breve (in byte).
S → T | T ? S : S
, T → 0 | 1
, eliminando la necessità di parlare di associatività?