AOJ 0257 - Railway Ticket

ブログを1ヶ月以上放置していたので、久しぶりに投稿してみます。問題はAOJ 0257です。

早速ですが、コードは以下のようになります。

a[];main(){read(0,a,5);*a=!puts(*a%3<1|a[1]&1?"Open":"Close");}

今回は、低レベルな入力関数であるreadにより入力を行うことにします。AOJの環境はリトルエンディアンのため、ASCIIコード表を参照すると、各入力に対する配列aの値は次の5通りとなります。ついでに、a[0]を3で割った余りも求めてみます。

入力 a[0] a[1] a[0]%3 出力
1 0 0 0x20302031 0x30 2 Close
0 1 0 0x20312030 0x30 2 Close
1 1 0 0x20312031 0x30 0 Open
0 0 1 0x20302030 0x31 1 Open
0 0 0 0x20302030 0x30 1 Close

表を見れば分かるように、a[0]%3が0であるか、あるいはa[1]が0x31(すなわち奇数)であればOpenを、さもなくばCloseを出力すれば良いことが分かります。
以上の考察により、コードは上記のようになることが直ちに分かります。