今日も今日とてゴルフ
気が付いたらGoogle Code Jamの予選が終わってた。
問題解けなさそうだけど物は試しで参加してみたかったなあ・・・
参加できなかった分anarchy golfを頑張ることに。
delete blank lines
Segmentation faultで通らないかと思ったらあっさり通ってしまった。40B。
うーん、通らないコードとどこが違うんだろう。
アセンブリコードとか読めるようにならないとわかりそうにないなあ。勉強しなきゃ。
それにしても36B辺りからごっそり短くなってるのはどうなってるんだろう。system関数?
main(i) { for(; gets(&i);) i & 63 ? puts(&i) : 0; }
Hamming Numbers
前回のコードに少し手を入れて短縮したのが126B。
ループが2個ある場合はループ用の値を再設定するより使い捨てる方が短くなるみたい。
ループが2個ある時点でゴルフ的にはまずいんだろうけど・・・
もっと短くなったけど記念にループ2個のも残しておく。
j,k,h['zz']; main(i) { scanf("%d", &j); for(h[i] = 1; i < 999; i++) h[i] ? h[i*2] = h[i*3] = h[i*5] = 1 : 0; for(; j; k++) h[k] ? printf("%d\n", k), j-- : 0; }
ループを1個にまとめて短縮したのが119B。
あまり短くなる気はしなかったけど、どうせならと思ってやってみたら意外と縮んでびっくりした。
このやり方だとこの辺りが短縮できる限界な気がする。
次からはやり方を変えてみよう。
j,k,h['zz']; main(i) { scanf("%d", &j); for(h[i] = 1; j; i++) i < 999 ? h[i] ? h[i*2] = h[i*3] = h[i*5] = 1 : 0 : h[++k] ? printf("%d\n", k), j-- : 0; }
追記
id:ichirin2501さんからまだ7B縮むとご指摘いただいたので縮めてみた。これで112B。
教えて貰ってばかりでありがたいやら申し訳ないやら。
j,k,h['zz']; main(i) { for(h[i] = scanf("%d",&j); j;) i < 999 ? h[i*2] = h[i*3] = h[i*5] = h[i++] : h[++k] ? printf("%d\n", k), j-- : 0; }
合ってる・・・よね・・・?
追記の追記
違ったよ!
三項演算子を論理ANDで置き換えて更に縮めることができたみたい。下ので111B。
しかし限界かと思ったところから随分縮んだものだなあ。
j,k,h['zz']; main(i) { for(h[i] = scanf("%d",&j); j;) i < 999 ? h[i*2] = h[i*3] = h[i*5] = h[i++] : h[++k] && printf("%d\n", k) & j--; }