Excess3 & binary increment

Excess3

not さん作の問題。not さんは、いつもいい問題をつくるな。

C

C は 65B でトップを取れた。以下のコード。

i;main(c){for(;read(i%=4,&c,1);)putchar(c<11?c:c+3>>i--+3&1|48);}
i;main(c){for(;read(i%=4,&c,1);)putchar(c<11?c:c+3>>3-i++&1|48);}
i;main(c){for(;read(i&3,&c,1);)putchar(c<11?c:c+3>>--i%4u&1|48);}

read() に渡すファイルディスクリプタが、0, -1, -2, -3 を繰り返し、4 回に 1 回、0 の時だけ読めるというもの。今までも、何度か出てきた変態テクニックだ。ただ、このおかげで、上記 65B のコードは、妙にきれいで読みやすくなっている。2つめと3つめはバリエーション。もう 1B くらい行きそうでいろいろ試してみたがだめだった。

JavaScript

xulapp さん@67B。xulapp さんは、かなり強い。かなわない。

for(;;print(t))for(s=readline(t=i='');n=+s[i>>2]+3;)t+=n>>3-i++%4&1

この解も、s[i>>2] として、1 文字を 4 回ずつ処理しているところが絶妙。

7/26追記

s[i>>2] の部分は、文字列をすべて処理しきると、undefined となる。それに、+ をつけると、NaN になり、さらに、+3 しても、NaN なので for ループが終了するということか。このへんって、なかなか思いつけないな。すごい。

binary increment

C

だいぶ考えて、inaniwa さん@69B に追いつくことができた。この問題は、読み込んだ文字列の末尾から、順に最下位ビットを反転していき、最下位ビットが立ったら終了すればよい。しかしながら、この条件が短く書きにくい。

for(;!((*--p^=1)&1);)
for(;(*--p^=1)&1<1;)
for(;(*--p^=1)==48;)    // 48 は '0' の文字コード

などが考えられるが、ちょっと長い。しかも、問題の中にはいくつか、全すべての数字が 1 のものがあり、そのケースでは、buffer overrun (underrun) をおこしてしてしまうため、

for(;(*--p^=1)-49;)    // 49 は '1' の文字コード

と書くこともできない。結局、たどり着いた答えは、

for(;(*--p^=1)%7;)    // '1' の文字コード 49 が 7 の倍数のため

だ。ただ、これは、かなりきわどい動きだと思う。特に、buffer underrun が起こるケースでは、最下位ビットを反転した結果が 7 の倍数であるような数(バイト)が無いと for ループが止まらない。当初、私は、buffer を bss に取っていたので、underrun すると 0x00 しかなく、最下位ビットを反転しても 7 の倍数にならないため、うまくいかなかったが、buffer をスタックに取るように変えたら、最下位ビットを反転すると 7 の倍数になるバイトが適度にあり、うまくいった。スタックはアドレス値が入っている可能性が高いので、適当なバイトがたぶん 1/7 程度の確率で存在しているのだと思う。
しかし、こんなきわどいロジック、inaniwa さんよく思いつくなぁ、と思っていたが、解答が公開になってみたら、上位4人はみなこのロジックを使っていた。ある意味、おかしい(変態的)と思う。

sed

sed はあまり本気でやるつもりはないのだが、奥が深く面白い。以下、トップ narb さんの 33B 解だが(若干見やすく変えてある)、一番後尾に 'a' を付け加えて、0a なら、1 に、1a なら、a0 に置き換えることを繰り返している。

s/$/a/
:
s/0a/1/
s/1a/a0/
t
s/a//

例で見てみると、

10111a
1011a0
101a00
10a000
11000

となる。見事なアイデアだな。
〜〜〜〜〜
さて、問題を2つ作成した。Output SequenceIQ Test
IQ Test はちょっと難しすぎたかな。でも、すでに、xulapp さんが、JavaScript で 99B をたたき出している。この問題は、問題・解答を作るのも、それなりに手間がかかった。
Output Sequence は、not さんが、113B@C か。なかなか追いつけないな。JavaScript はもう少し縮むだろう。たぶん、95B はいくと思う。
〜〜〜〜〜
ところで、最近、wikipediaCode Golf が載ったようだ。そのうち、anarchy golf 場もリンクされるだろうか。