このコードがすごい! 2010 小テク部門

inaniwaさんのブログに便乗してすごい小テクを使っているコードを選んでみました。


a prime number by 51b

main(n){for(;printf("%.d",83-n++););}

printf("%.d",0)が何も出力しないという仕様。
(inaniwaさんもほぼ同じコードを書いてますがこのテクニックは51bさんが先に気づいたそうなので51bさんのコードを載せています。)


sort numbers by msk

N['HxH'];main(i){for(;~scanf("%d",N)&i?N[*N]=*N:!N[++i]||printf("%d ",i)-8;);}

scanf("%d",N)で入力を読むアイディア。


Big Number by inaniwa

i=22;main(){for(;i<&i;i*=7/3.)printf("%d",i);}

&iの値を終了条件に使うという謎発想。


Factorization corrected by nai

main(b,c){for(;~scanf("%d %d\n",&b,&c);printf(""-6,b-c,c=sqrt(b*b/4-c)-~b/2));}

""-6でscanfの第一引数を再利用するテクニック。


Bigger power of two by nn

main(s){for(;gets(&s);printf("%d\n",2<<(atof()>>20)+1));}

何故か浮動小数点型をビットシフトできている謎コード。


すごいテクニックばっかりです。こんなのどこから出てくるんですかね・・・。
それでは、よいお年を。


おまけ
・選外
Collatz Problem by not

main(_,i){for(i=~i%40;i/printf("%d\n",i);)i=i%2?i*3+1:i/2;}

mainの第二引数は-16n-12になっているというのを使って通る確率を最大まで上げたコード。

366. Divide section

なかなかagliasさんに追いつくことができなくて苦しみました。
基本的な考え方は最初に思いついたとおりで、ループを一重化して細かいところを削って削って追いついた感じです。
これで最短かな?と思ったらまだ縮められました。
最近細かいところを縮めきるのが苦手になっているような気が・・・。

362. Christmas tree

いろんな解き方があった問題です。
僕は最初からputchar()を使う方法ばっかり考えていたので他の人もそうかなと思ったらまったく違いました。
僕のコードはもう縮まないと思ってたんですがt=・・・?t:・・・というのが盲点でした。
tにtを代入するというのは全く気がつかなかったです。

350. Bigger power of two

約3カ月ぶりに問題を作りました。
この問題の元ネタは「ハッカーのたのしみ」の3-2の「次の2の冪乗への切り上げ/切り下げ」です。
ハッカーのたのしみ」に上手いアルゴリズムが載っていなかったのでショートコーダーならどう書くかなと思って問題にしてみました。
アルゴリズムとしてはだいたいループかlogに落ち着いたみたいですが、nnさんの浮動小数点型の指数部を取ってくるというのは驚きました。
言われてみればそりゃそうだって感じですがなかなか気づけないもんですね・・・。

238. Negatenary

お久しぶりです。
最近忙しかったりあんまりコードが縮まなかったりであなごるに参加できてないです。
というわけで生存報告の代わりに過去の問題のコードを公開します。

続きを読む