とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

PKU JudgeOnline 1658 (6)

Welcome To PKU JudgeOnline 1658 -- Eva's Problem
kurimuraさんのコードはシンプルで精錬されすぎています。Ozyさんのコードは最初の読み飛ばし,3つの数の読み込みおよび出力,4つ目の読み込みと4,5つ目の出力,の三つの状態を切り分ける必要があります。これでは分岐が多く長くなりがちです。では…。(ネタバレが嫌な方は続きを見ないでねん)

2つずつ読み込んではどうだろう。そして生まれたのがこのコード。

a,b,c;main(d){for(gets(&a);~scanf("%d%d",&a,&b);c=b-a)printf*1
1,2番目を読んだときにあらかじめc=b-aとすることで,3,4番目を読み込んだときにcを等差等比を分ける際に使えますし,等差だったときは4番目にcを足せば5番目を求められるという寸法です*2。これで112Bです。

*1:d=!d)?"%d %d %d\n":"%d %d ",a,b,b-a-c?b/a*b:b+c);} ループでの状態を2種類にするべく,kurimuraさんのgets作戦で1行目を読み捨てます。その後は(d=!d)で状態を切り替えます。dはいわゆるargcですので,通常実行では1が渡されているでしょう。それを利用します。((ですからdは0,1,0,1...と評価されます。さらに ?:(三項演算子) によって"%d %d ""%d %d %d\n"が交互に返されます。

*2:"%d %d "の時にもprintfの引数が4つあることになりますが,規格上問題ありません。引数の式が評価されるだけです。そのときにはまだ5番目の数を正しく求める必要がありませんので,無意味な計算だけをして値を捨てることになります。逆に引数が足りないときに未定義動作になることは覚えておきましょう。