他人のソースの良い所取りで短くしよう

PKU1658番でid:Ozyさんが96byteを叩き出しました。
どんな方法かは不明ですが、少なくとも今のコードを、
より短く出来るというのが分かったのは非常に大きいです。


必ず短く出来るという根拠無しにコードを考えるのは大変ですが、
そうではないのですから。


以下ネタバレ注意



まず、Ozyさんがid:RiSK:20051211で示したコードを参考にしてみましょう。

main(n,i){int x[4];
for(;~scanf("%d",&x[i%4]);i--)n?n=0:
printf(i%4?"%d ":"%d %d\n",x[i%4],
2*x[1]-x[2]-*x?*x**x/x[1]:2**x-x[1]);}

1個ずつ読み取り、3状態を管理する方法を用いています。
このコードが長くなった理由は主に二つです。

  1. 配列を用いてる
    • 配列の宣言、配列の要素へのアクセスが原因でbyte数が増加。
  2. :i,nという状態管理の変数
    • 二つの変数の管理によるbyte数増加

しかし、現在、id:RiSKさんの示したコードは配列を用いていません。これを使えば、
前者の問題点は解決できます。


次は、状態を管理する変数の問題です。
i,nを統合できないでしょうか?

いえ、出来ます。
具体的には,
argc = 0 の時を状態1,
argc % 4 = 0(argc != 0) の時を状態2,
argc % 4 != 0の時を状態3とします。


コードにすると以下の様になります。

main(a,b,c,d){while(~scanf("%d",&b))--a
&&printf(a&3?"%d ":"%d %d\n",
c+=d=b-c,b-c-d?b/c*b:b+d);}

for文に突っ込む式が無かったので無意味にwhile文にしてみました.