今日も今日とてゴルフ

気が付いたら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--;
}