明けましておめでとうございます。
今年もよろしくお願いします。
今年のゴルフの目標は
1.たまに単独トップを取る
2.重い問題にも挑戦する
3.ゴルフの解説サイトを作る
の3つです。
去年は一時期あまり参加できていなかったので今年はもっと参加したいです。
このコードがすごい! 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を代入するというのは全く気がつかなかったです。
356. partition by parity
終了間際にドタ参して1位取ってすいません。ちょっと最近忙しかったので・・・。
ループカウンタの動かし方がいろいろあって面白かったです。