CodeIQのホリエモンからの挑戦状に挑戦中です。
もう悩みました!悩んで悩んで悩みまくりました。Twitterなんかで情報収集していると、プログラマーの方々は簡単簡単という声が聞こえてくる。
しかしプログラマー歴がまだ浅い私には難しい。処理時間の問題ではありません。
正解が出ないんです
2問あるんですが、1問目すらクリアできない。築き上げた不正解の山。でも諦めませんでした。
これをクリアできなければ、私のプログラマーとしての未来はない。
そんな気持ちで挑みました。そしてようやく、一問目だけクリアできました。
もうね、嬉しいったりゃありゃしない。「正解」の二文字を見た瞬間は涙がちょちょぎれそうでした。
まだ二問目はクリアしてないんですが(これをクリアするのがこの問題の本質なのですが……)とりあえず、ここまで悩んだことをアウトプットしておこうとキーボードを叩いている次第です。
Contents
まずね、問題が理解できないんですよ。でもね、それでも理解しようとします。というか、自分で勝手に解釈します。
この問題にはサンプルがあるんですが、私はまずそれを変数に当てはめればいいんだと解釈しました。
この数字で配列を作って、あとはループで回して足していくだけ。
なんだ、簡単じゃねぇかよ
ちなみに私、whileループより、forループのほうが好きです。なんでかっていうと、whileはね、よく無限ループに陥るんですよ……。
それでPCがフリーズしたりね。whileおそるべしです。
んでまぁ、ちゃちゃっとプログラムを組んで、サイトに通します。
はい不正解
そりゃそうだよね。サンプルの数字通したんだから。もう答え出てるしね。
ここでどうやら、サンプルを通すんじゃないらしいぞと私は気付きました。そして問題をもう一度よく読み直します。
そして目に付いた言葉が標準入力。標準入力てなんやねん。
まず目についたのが、標準入力のサンプル。このサイトcodeIQが標準入力のサンプルを用意してくれてるんですね。
それを見てまず、私は言語をjavascriptからphpに切り替えました。最初はjavascriptでやってました。標準入力のサンプルを見ると、phpのほうが簡単そうだったからですね。
さらに、ググって調べます。でもね、調べてもわかんないんですよね。ストリームがなんちゃら、STDINがなんちゃら。
言葉を調べるとわからない言葉が出てきて、その言葉を調べるとまたわからない言葉が出てくるという無限ループに陥ります。
さんざん悩んだ挙句わからなかったので、質問サイトで質問してみることにしました。
「ほりえもんの挑戦状にチャレンジしているのですが、標準入力を教えてくださいがなんちゃらかんちゃら」
だめと言われました
終わったら解答が出るだろうから、それまで待ちましょうと。そりゃそうだと物凄く納得しました。私は問題を解きたい一心ですが、一応賞金も出てるしね。
解答者がこのかたでよかったです。
終わるまで待つか、という考えも過りました。でも待てねぇよ!いや、最初から待つ気などない!
なので悪あがきします。これでもかこれでもかと、サイトにコードを通しました。築きあげる不正解の山。一体わたしの正解率は何%なのだろう?
一問も解いていないのだから、0%には間違いないが。
そうこうしているうちに、自身が数字をひとつも出力していないのに、解答欄に数字が出力されるようになりました。むむっ、と思いました。
私は数字など書いてないのになぜ?と。そうそれが標準入力だったのですね。
わかってしまえば、なんのことはなかったです。標準入力、説明すれば難しい言葉が並ぶのでしょうが、この場合に限っていうなら、
サイトが用意したデータ(数字)を受け取ること
これで十分です。なんでも難しく考えるのはよくないですね。
ようやく数字を手に入れた私。数字さえ手に入れば、あとはプログラムを書くだけよう。
そして意気揚々とプログラムを書き始めるのですが、まだ私は問題を理解していなかった。
つなぎ合わせたときの長さLと、N個(1≦N≦5000)の棒の長さが標準入力から与えられるとき、N個の棒の中から3つをつなぎ合わせて長さがLになる組み合わせの総数を求めるプログラムを書いてください。
Lはね一個なわけですよ。でもなぜか、私はLが複数あると勘違いしてしまった。たくさんある答えLを必死で求めようとする私。
もうねループしまくり。Lがたくさんあるんだからループするしかないんです。私の頭もループしまくりでした。
そしてようやく、完成しました。ループしまくりのプログラムが。処理時間で通らないことなんてわかってるんです。でもそれでもいい。私は見たい。
「正解」の二文字を。
やっとその時が来たと思いました。
ねぇなんで? なんでなのよ。
もう一度、問題を読みます。どこか勘違いしているのだと。もうね。web画面に穴を穿つくらい問題読みました。
そして私は気付くのです。
まさかLはひとつなのか。ひとつなのかと。
そしてまたソースコードを書き直します。
さんざん書いたループ処理を大量に消します。
そして私は、ようやくスタートラインに立つのです。
この問題は、ここからが本質です。数字をループさせて求めるなら、プログラマーなら出来て当然なのでしょう。
でもね、正解の文字を見た時は本当に嬉しかった。
さぁ残り数日、二問目も解くぞ!