コードを短くするのって楽しいですよね?(10)
―――そして伝説へ。
main(n){for(n=time(0)%2?'xxxx':120;n/=3;)puts(n&1?"no":"yes");}
xxxxの部分を確定させよう。送信できる文字コードには限りがある。その制約を守れるものをサーチするプログラムを書いた。*1
結果、'^Sn9,'が適切のようだった。^Sは制御文字で0x13だが、バイナリエディタでソースファイルを書き換え、テキストエディタで開いてフォームに貼り付けてcommitすればacceptされる。63byte。*2
しかし現在のtopは61byte。そう、まだここから2byte縮むのだ。
1つ目はwajさんのアイデア。time(0)の0を省略できるという事実だ。言語として「C」を選択すれば何故かランタイムエラーで落ちない。これは衝撃的な発見だった。
もう一つは、もっと“幸運”に頼るというもの。たとえば、id:shinichiro_h:20051201#1133432222さん
main(c){for(c=time(0)%8*'bgt'+80;c;c/=3)puts(c&2?"no":"yes");}
%8の剰余が7から0になるタイミングがあることを利用して、'xxxx'という部分を3文字に短縮。最後の&2というのも少々トリッキーだ。
ただし、これがacceptされるためには、2つのInputのうち、テストケースが17のほうが先にテストされていなければならない。これには、
if(getchar()&1)){
正解手順
} else {
for(i=0;i<1<<28;++i) ; // おおよそ2秒のwait
puts("あかんべー");
}
などとやって、WA(presentation error?)が発生するまでの時間を見れば良い。確かにテストケースが17のInputが先にテストされているようだった。
しかし、time()%2でも通す(acceptされる)のに50回ぐらいかかるのに、%8を通すのは至難の業だ。もう少し賢い方法はないものだろうか?(つづく)