Rozważmy gramatykę nad alfabetem { 0
, 1
, ?
, :
} określone przez reguły produkcji
s →
0
┃1
┃0
?
s:
s ┃1
?
s:
s
Biorąc pod uwagę ciąg wygenerowany ze s , przeanalizuj go jako wyrażenie, w którym ?:
jest asocjacyjnie prawostronny (na przykład a?B?X:Y:c?d:e?f:g
oznacza a?(B?X:Y):(c?d:(e?f:g))
) i oceń go za pomocą następującej semantyki:
eval(0) = 0
eval(1) = 1
eval(0?a:b) = eval(b)
eval(1?a:b) = eval(a)
Jeśli wynikiem jest 0 , wypisz pewną stałą wartość; jeśli wyjście wynosi 1 , wypisz inną stałą wartość. Podaj w odpowiedzi wybrane wartości wyjściowe (np. 0
/ 1
Lub False
/ True
).
Przypadki testowe
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
Zasady
- Nie możesz używać wbudowanych języków, które interpretują ciągi znaków jako kod w niektórych językach programowania i uruchamiają je (np. JavaScript / Perl / Ruby / Python
eval
). - To powiedziawszy, twój kod w rzeczywistości nie musi analizować, a następnie oceniać łańcuch wejściowy. Możesz zastosować dowolne podejście, które osiąga równoważne wyniki i nie narusza poprzedniej zasady.
- Twój program zostanie porównany z
perl -le 'print eval<>'
. - Najkrótszy kod (w bajtach) wygrywa.
S → T | T ? S : S
, T → 0 | 1
usuwając potrzebę porozmawiania o skojarzeń?