POH6の結果発表と自分のコードと見比べて

paizaオンラインハッカソン6 女子高生プログラマーの大バトル!〜コボール文明の逆襲〜』も終了し、『【結果発表】誰と一緒に戦う?女子高生とともに世界を救えるコードとは』(paiza開発日誌)において結果発表とpythonで書いた場合のサンプルコードが掲載されている。その内容と当方がgithubに上げている回答例を見比べてみたときの個人的な感想諸々を述べてみたい。

ミッションと言語の選択状況

これはつくづく思っていたことだが、今回のPOHでは六村リオミッションを選んだ人が多数だった模様である。確かに(当方もそうだが)多くの人は左から選ぶと言う傾向にあったようである。

つばめミッションの選択率が低かったのは、難易度があまりにも低すぎたことが考えられる。POH4以降は難易度の低下が指摘されているが、今回は全体的に難易度が低かったが、つばめミッションは特に簡単だったことを考えると、自然なことのように考えている。

言語としてはやはりC++、C言語、Javaが多いが、『POH6+ 「え、妻が松江?」松江Ruby会議07協賛 回文作成プログラミングコンテスト』があったためか、Rubyの選択率も高かった模様である。

自分のコードとサンプルコードを見比べて

ここでは、自分がgithubで上げたコードと結果発表で書かれたコードを見比べて個人的な感想を述べてみたい。

つばめミッション

結果発表で掲載されているコード、および他者が書いたコードの多くは2桁であることが確実であることを前提に書いている傾向があった。例えば以下のいずれかのパターンである。

  1. 入力された文字列を数値に変換した値をiとし、それに10で割った商jとその剰余kを加算したパターン
  2. 入力された文字列strがあり、それを数値に変換してiとし、strの1文字目と2文字目を数値に変換したものをiに加算したパターン

テストケースでは数値が2桁であることが絶対条件のため、必ず通ることは承知の上である。ただ、それでは個人的には面白くないため、当方の場合は、「入力された文字列strがあり、それを数値に変換してiとし、strを1文字ずつforeachループあるいはforループで回して、それぞれの数値をiに加算させる」という方法を使った。こうすれば処理速度は若干犠牲になるが、2桁でないパターンでも応用させることができると考えたからそうした。

なお、スクリプト言語以外では2桁であることをチェックさせるため、あえて2桁でない数値が入力されたらエラーとするようにしている。

リオミッション

全体的には結果発表で掲載されているコードは簡潔さを重視、当方の場合はオブジェクト指向の考え方を重視しているという印象を持った。

当方のコードの場合、Coffeeというクラス1 を使用してコーヒー粉あるいは湯を加える、味見する、コーヒーの量を取得する、濃さを取得するという処理ベースで考えていたが、やはり長さは避けられなかった。

一方、結果発表で掲載されているコードはローカル変数で持たせることで計算しているので、かなり簡潔な印象を持った。

最近のプロジェクトではオブジェクト指向の考え方は当たり前のようになっているため、リオミッションではちょっと面倒でもいいから一度はクラスなどを使ったオブジェクト指向の書き方にチャレンジしてみてほしいなと考えている。

霧島京子ミッション

当方のコード、結果発表で掲載されたコードともに基本的にはシミュレーション方式だった2 。大きく違う点としては、実際に行ったことのあるマスを記録する方法であり、当方の場合は実際に行ったマスのインデックスを履歴に登録する方式、結果発表で掲載されたコードでは行ったことのないマスをfalseとし、移動したところをtrueに変更して記録するという方式である。

処理速度的には結果発表で掲載された方式のほうが若干だが速そうである。当方の方式だと移動履歴の判定でforループをかけなければならないのがネックになってしまうためである。

あとは、break文を極力避けるかどうかの違いもあった。

最後に

今回、個人的には本格的に参加、自分の回答例をはじめて掲載したが、やはり自分のコードと他者のコードを見比べてみると、同じことをするのにコードの書きかたや処理の組み立てかたで大きく変わってくるんだなということを感じさせられた。

同じ目的でも手段が変わってくることを考えると、目的と手段を混同してしまうとかなり危ういんじゃないかと考えるようになった。

また、機会があればチャレンジしたいものである。

ウェブマスター。本ブログでITを中心にいろいろな情報や意見などを提供しております。仕事依頼や相談などについては、Contact Formよりお願いいたします。
  1. C言語の場合は構造体と関数を併用した擬似的なクラス []
  2. 実際にマスを進めてゴールできるかどうかを判定する方式 []