コードを短くするのって楽しいですよね?(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を通すのは至難の業だ。もう少し賢い方法はないものだろうか?(つづく)

*1:実際に、書いたのは id:Ozy:20051130 さんだ。

*2:場合によっては、time(0)よりclock()を使ったほうがacceptされやすいという話もある。