Alfabe üzerinde dilbilgisi düşünün { 0
, 1
, ?
, :
} tarafından tanımlanan üretim kuralına
s →
0
┃1
┃0
?
ler:
ler ┃1
?
ler:
ler
S ' den üretilen bir dize göz önüne alındığında , onu ?:
doğru ilişkisel olan bir ifade olarak ayrıştırın (örneğin, a?B?X:Y:c?d:e?f:g
anlamına gelir a?(B?X:Y):(c?d:(e?f:g))
) ve aşağıdaki anlambilimsel ile değerlendirin:
eval(0) = 0
eval(1) = 1
eval(0?a:b) = eval(b)
eval(1?a:b) = eval(a)
Sonuç 0 ise , bir miktar sabit değer verir; çıktı 1 ise , farklı bir sabit değer çıktılayın. Cevabınız için seçtiğiniz çıktı değerlerini (örn. 0
/ 1
, Veya False
/ True
) belirtin .
Test durumları
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
kurallar
- Dizeleri bazı programlama dillerinde kod olarak yorumlayan ve bunu çalıştıran (örneğin, JavaScript / Perl / Ruby / Python's gibi
eval
) dil yerleşiklerini kullanamazsınız . - Bununla birlikte, kodunuzun aslında girdi dizesini ayrıştırması ve sonra değerlendirmesi gerekmez. Herhangi bir yaklaşıma eşdeğer sonuçlar elde edersiniz ve önceki kuralı ihlal etmez.
- Programınız karşı kontrol edilecek
perl -le 'print eval<>'
. - En kısa kod (bayt cinsinden) kazanır.
S → T | T ? S : S
, T → 0 | 1
, çağrışımsal bahsetmek ihtiyacını ortadan kaldırarak?