もっと!もっと短く!
SRM448に間に合わなかったのでanarchy golf。
それなりに短くなってきてるから頑張り甲斐があるというもの。
tennis
2位集団が遂に射程圏内に入った。4B縮んで157B。後2Bだ!
三項演算子の真の場合の値(第二オペランドって書いた方がいいのかな?)を省略すると、より左の値を取って来るのを利用した。
gcc3.x系しか使えなかったような気がするけど、手元の環境もサーバー側もgcc3.x系だったので使えたみたい。よかった。
気のせいだった。サーバー側のgccは4.1.2のようだけど普通に使えた。
gcc3.x系とか関係なく使えるみたいだ。うわー、恥ずかしいー
自分で書いておいて若干意味不明な感じだから、手っ取り早く思い出せるよう簡単な計算の結果を残しておく。こんな感じ。
puts("hoge" ? : "piyo"); //hogeを出力 printf("%d", 100 ? : 10); //100を出力
滅多に使う機会もないと思うけど・・・
後は2の剰余を求めるだけで入力の値が1か2かを判別できることに気が付いた。
o, t; main(i) { for(; gets(&i); printf(o - t ? "Player%d %s %d - %d\n" : "Set is tied at %d\n", o - t ? o > t ? : 2 : o, o > 6 | t > 6 ? "wins the set" : "leads", o > t ? o : t, o < t ? o : t) ) i % 2 ? o++ : t++; }
delete blank lines
早速三項演算子を論理ANDに置き換えて短縮した。1B縮んで39B。
main(i) { for(; gets(&i);) i & 63 && puts(&i); }
Dancing Kids
メモリ破壊して4B縮んだ。102B。
後はreadで律儀に全部読み込まなくても、入力がrightじゃなければ先頭の文字がlかrかを気にしてるだけなので9文字だけ読むように。
トップまで後7Bだ。こちらもいよいよ最短に近づいてきた感じ。
main(i) { puts(read(0, &i, 9) - 5 ? i & 2 ? "\\('-')/\n |_|" : " ('-')/\n /|_|" : "\\('-')\n |_|\\"); puts(" | |"); }