Hãy xem xét một ngữ pháp qua bảng chữ cái { 0
, 1
, ?
, :
} xác định bởi các quy tắc sản xuất
s →
0
┃1
┃0
?
s:
s ┃1
?
s:
s
Đưa ra một chuỗi được tạo từ s , phân tích nó như là một biểu thức trong đó ?:
là liên kết đúng (ví dụ: a?B?X:Y:c?d:e?f:g
phương tiện a?(B?X:Y):(c?d:(e?f:g))
) và đánh giá nó với các ngữ nghĩa sau:
eval(0) = 0
eval(1) = 1
eval(0?a:b) = eval(b)
eval(1?a:b) = eval(a)
Nếu kết quả là 0 , xuất một số giá trị cố định; nếu đầu ra là 1 , xuất ra một giá trị cố định khác nhau. Chỉ định các giá trị đầu ra bạn đã chọn (ví dụ 0
/ 1
, hoặc False
/ True
) trong câu trả lời của bạn.
Các trường hợp thử nghiệm
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
Quy tắc
- Bạn không được sử dụng các ngôn ngữ dựng sẵn diễn giải các chuỗi dưới dạng mã trong một số ngôn ngữ lập trình và chạy nó (chẳng hạn như JavaScript / Perl / Ruby / Python
eval
). - Điều đó nói rằng, mã của bạn không thực sự phải phân tích cú pháp và sau đó đánh giá chuỗi đầu vào. Bạn có thể thực hiện bất kỳ phương pháp nào để đạt được kết quả tương đương và không vi phạm quy tắc trước đó.
- Chương trình của bạn sẽ được kiểm tra chống lại
perl -le 'print eval<>'
. - Mã ngắn nhất (tính bằng byte) sẽ thắng.
S → T | T ? S : S
, T → 0 | 1
, loại bỏ sự cần thiết phải nói về associativity?