カメヲラボ

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

執念…だよ☆

POJ1003 Hangover再び

3年半近く前、最短コード88Bなどとエラそうにほざいておりました。どうもすみません。ショートコーディング本が出てからも、「まあ1003番は終わった問題だしー」とか勝手に思って、Statusを一度も確認せずにおりました。ところがつい先日何気なくStatusを見てみると、『ちょwww81Bてwwwwwwwwwww』てな感じですよ(;´д`)

それから半日悩み続けました。とにかく最短コードを目指して頑張りましたよ。で、やりました!!

まさかここまで縮むとは夢にも思いませんでした。詳しい説明はまた後日、ということでひとまず報告します。

追記:
あとで説明しようと思ったら、コメント欄に大体書いてあるかんじになってしまったので、簡単にまとめておきます。やねさんのコメントの通り、exp関数を使った近似式で短縮が可能です。入力データが0.01〜5.20までなので、てっきり520通りすべてのケースで正しく計算できなければダメだと思っていたのですが、そうでもないみたいで多少精度が落ちても通ります。最初にできた77Bのコードは以下のものです。

main(float x){for(;scanf("%f",&x),x;)printf("%.f card(s)\n",1.526*exp(x)-1);}

誤差もかなり小さくて、見た目もなかなか良いのでこれが最短かなーと思っておりました。"1."の1を消したいと思って、

main(float x){for(;scanf("%f",&x),x;)printf("%.f card(s)\n",exp(x)/.655-1);}

のようにすると通らなかったので、微妙な誤差なのかナァと思っていましたが、やねさんのコメントを参考に、

main(float x){for(;scanf("%f",&x),x;)printf("%.f card(s)\n",exp(.422+x)-1);}

としてみると通りました。これで76B。本当は.423の方が誤差が小さいと思うのですが、まあ通ったから良し。


そして現在は72Bまで縮んでいるみたいです。凄すぎですね(*´д`)

追記:2009.05.26
やねさんとこにある通り、結局63Bまで縮みました。…が、超絶テクニックを駆使しているとは言え完全なインチキコードになってしまいました(´ω`)これ以上縮めようとすると、危険すぎて私のアカウント寿命が縮むと思いますのでこれで終わりにしておきます…。