カメヲラボ

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

最短コード88B

http://acm.pku.edu.cn/JudgeOnline/showproblem?problem_id=1003
テーブルの上に、カードを少しずつずらして重ねていく。カードが崩れないようにするには、枚数が増えるごとにずらす長さを短くしなければならない。

一枚だけの場合は、カードの長さを1としたとき、1/2だけずらすことができる。



2枚になると、上は1/2、下は1/3で、合わせて1/2+1/3=5/6だけテーブルからカードが出ていることになる。



3枚だとこんなかんじ。


インプットは、出っ張りの長さだから、1/2, 1/3, 1/4...と引いていき、0より小さくなったところで終了というプログラムを書くだけだから超簡単。超簡単ということは最短コードもすぐに出来る。あまり面白くない問題。



main(a){
float b;
for(;a=scanf("%f",&b),b;printf("%d card(s)\n",--a))
for(;b>0;b-=1./++a);
}


普通に書くと89byteだが、scanfの戻り値が1ということを利用して1byte縮めることができる。