Considérons une grammaire sur l'alphabet { 0
, 1
, ?
, :
} défini par la règle de production
s →
0
┃1
┃0
?
s:
s ┃1
?
s:
s
Étant donné une chaîne générée à partir de s , analysez-la comme une expression où ?:
est associative à droite (par exemple, a?B?X:Y:c?d:e?f:g
signifie a?(B?X:Y):(c?d:(e?f:g))
) et évaluez-la avec la sémantique suivante:
eval(0) = 0
eval(1) = 1
eval(0?a:b) = eval(b)
eval(1?a:b) = eval(a)
Si le résultat est 0 , sortez une valeur fixe; si la sortie est 1 , émettez une valeur fixe différente. Spécifiez les valeurs de sortie que vous avez choisies (par exemple 0
/ 1
, ou False
/ True
) dans votre réponse.
Cas de 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
Règles
- Vous ne pouvez pas utiliser de langage intégré qui interprète les chaînes comme du code dans certains langages de programmation et les exécute (comme JavaScript / Perl / Ruby / Python
eval
). - Cela dit, votre code ne fait avoir à analyser et évaluer la chaîne d'entrée. Vous pouvez adopter n'importe quelle approche pour obtenir des résultats équivalents et ne pas enfreindre la règle précédente.
- Votre programme sera vérifié
perl -le 'print eval<>'
. - Le code le plus court (en octets) gagne.
S → T | T ? S : S
, T → 0 | 1
, en supprimant la nécessité de parler associativité?