カメヲラボ

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

爆撃テスト

Ozy2005-12-05

※最初に書いておくが、無駄なWAは自分の評価を下げるだけなので、トータルのランキングを気にしている人は絶対やめた方がいい

基本

一番最初の問題1000番。はっきり言って、このコードは普通に書いた方が良さそうな超簡単問題だ。例に答えのコードが載ってるし^^;しかし、運に任せたコードを通してみたい!というわけで以下のコードを何回も送信してみたら、通った。


main(){putchar(getpid()%5+51);}
ここで注意しなければならない点は、
①INPUTの種類とそのデータを完璧に把握しておくこと
②自分のマシンで入念なテストをしておくこと


運にまかせるといっても、でたらめな乱数データを送れば通るというものではない。まず、この問題のテストケースを解析する。大した問題ではないので、http://d.hatena.ne.jp/yaneurao/20051129http://d.hatena.ne.jp/yaneurao/20051130の内容が理解できるくらいであれば容易に調べられるはずだ。

この問題のInputは3種類
1 2
1 3
3 3


前回までtime(0)がどうのこうの書いていたからといって、この問題にもつかえるわけではない。time関数は時間を返すわけだから、返り値を利用する場合はそれが連続的に変化するということを忘れてはならない。


3種類のInputに対して出力しなければならないのは2数の和―すなわち、3,4,6である。一番大きな解と一番小さな解の差は、6-3=3なので、ランダムで0〜3の値が欲しい。timeは3つ以上のInputに対応できないので、getpidを使う。


getpid()%4とすれば、getpidの剰余0〜3が得られるはずである。しかし、最初に述べたように、これを実行するには十分なテストが必要だ。ためしに、


main(){printf("%d",getpid()%4);}
というプログラムを数回実行してみよう。Win環境では、何度やっても0が表示されるはずである。getpidは常に(あるいは高確率で)4の倍数になるのである。


これを知らずに何度も送信しているのでは、無駄にサーバを攻撃しているだけだ。少々可能性を低くしても、確実に目的の値が返ってくるようにgetpid()%5と書いておこう。これで得られる値は0〜4の5通り。


最初に書いたコードの51は'3'のアスキーコードだから、一回目のテストでは0、2回目のテストは1、そして3回目では3が返ってきて欲しい。


その確率は


1÷5÷5÷5=1/125
で、100回ほど頑張れば通る。

追記:
なんとなーくPascalでもやってみたら最短記録が出た(笑)


begin randomize;write(random(7));end.
37byte。しかし総合ランキングは皆memoryが0kになっている。writeを呼んだだけで4kになってしまうのに、どうやって出力してるんやろか。Pascalに詳しい人おせーて!!!