カメヲラボ

主にプログラミングとお勉強全般について書いてます

Gleaming the Cubes

立方体の重なり部分の体積を計算する問題。これはletterさん(http://d.hatena.ne.jp/letter/20060707#1152252215)の記事が元になっています。


①x,y,z座標の最大値
②各座標+一辺の長さの最小値
を調べて、②-①が負にならなければ体積を計算。負になれば0を出力というコードを書けばよい。

実はこの問題のコードが一番インチキ臭い。②-①は、x,y,z成分すべてを調べなければならないのかと思ってその部分を消してみると、x成分だけで通ることが判明。さらに、「その値はもしかしたらちょうど0なんじゃないの?」と思ったところ失敗。しかしもう少し調べると0と-1だけということがわかったのでこれで相当縮んだ。

次に最大値、最小値を調べる部分。x,y,zの3成分を書くところで、なんとかまとめられないかと色々試してみた。例えば「x成分で②の最小値が見つかった場合は、y成分も最小値かも」というかんじで。
そうすると、y,z成分で通ったのでさらに短縮化。この時点でほぼ黒のコードに成り下がった。ちゅうわけでダークなコードを晒しておきます。

main(n,a,b,c,d,u,v,w,x,y,z){
  for(;scanf(x=y=z="%d",&n),u=v=w=-n;
   x-=u,printf("%d\n",~x?x*(y-v)*(z-w):0))
    for(;n--;a>u?u=a:u,b>v?v=b,w=c:v,x=a+d>x?x:a+d,b+d<y?y=b+d,z=c+d:y)
      scanf("%d%d%d%d",&a,&b,&c,&d);
}

あ、そだそだ。u-v-w=-nの部分も超インチキだw
どうしようもないなこりゃ。