読者です 読者をやめる 読者になる 読者になる

高専プロコン競技部門に参加した

どうも、Haskellの宣伝をしまくっていた@fumievalです。

全国高等専門学校 第24回プログラミングコンテスト競技部門に、@NKMR_YA@39moguraさんと一緒に茨城工業高等専門学校の代表チームとして出場しました。

f:id:fumiexcel:20131016123648p:plain

去年もそれを使った、ような…

競技の流れは以下の通りです。

  • 送信側m人と受信側n人(m + n = 3)に分かれる。
  • 送信側に文字列Sが配布される。
    • 木製の長方形の容器(パケット)と、 それぞれの面に1から6までの点が刻まれた立方体状の樹脂(サ イ コ ロが与えられるので、必要に応じてそれを使う。
    • 設置されたカメラにより、20秒間隔でパケットが撮影される。ただし、手などが写っていると魂を抜かれ失格。
  • 受信側は、何らかの文字列S'をサーバーに送信する。必要に応じて、送信側で撮影されたパケットの画像を利用することができる。
  • 制限時間が過ぎると終了。
    • SとS'を先頭から比較し、もっとも一致している文字数が多いチームが勝利。
    • 文字数が等しい場合、その文字列を提出するまでの秒数が少ないほうが勝利。
    • 秒数が等しい場合、いくつかのサイコロを振り、その合計が大きいほうが勝利。

それはとっても簡単だなって

去年の問題は、乱雑に置かれたサイコロの個数を数えるという高難易度…むしろ人間がやったほうが楽なものでしたが、今年の問題はある程度プログラミングを生かせると感じました。もう何も怖くない。

GUIも、CUIもあるんだよ

私がエンコーダ、デコーダを開発し、残りの二人が画像認識プログラムを作るという割り当てでした。配置を表示するプログラムも作ってしまったので、それを使うことになりました。

f:id:fumiexcel:20131016123335p:plain

写真のようにサイコロの1、2、5の目だけを使い、中央の色を調べることで画像認識を簡単にするという方針でした。

f:id:fumiexcel:20130926170951j:plain

工夫なんて、あるわけない

後述する事情により、1から6までの目を使うことになりました。エンコード方法は、サイコロ5つを2文字に割り当てるという至極単純なもの。暗号化も圧縮もありません。目の列は1行ごとに左から右に並べられます。

本番で与えられた文字列がこんな感じだったので、エントロピー符号くらいは使うべきでした…あたしって、ほんとバカ

こんなの絶対おかしいよ

本番はマウスも含め周辺機器が利用できません。これはちょっと厳しいです…本当のルールと向き合えますか?

もう誰にも頼らない

真上から撮影できるとは限らないことが判明したため、急遽私も画像認識のプログラムを開発することになりました。

10/9頃、ある程度サイコロの目を判別できるようになりました。幾度ものパラメータの調整を経て、百発百中の精度を得ました。

f:id:fumiexcel:20131016124840p:plain

アルゴリズムは、画像の中の黒い点をカウントするだけです。

この時点でシステムのすべてがHaskell製になりましたが、そこは…まあ。データ構造、線型代数、画像処理、並列化などの多少の勉強になりました。

わたしの、サイコロの友達

他の二方のおかげで、準優勝というよい結果を残すことができました。とても感謝しています。来年はその一つ上を目指すだけなので、気が楽です。来年はサイコロじゃないといいなあ。

最後に、ともに闘ってくれたチームのメンバー、本コンテストを開催した運営の方々、会場を用意していただいた旭川市民文化会館の方々、および財布を拾っていただいたホテルの方に、心より感謝を申し上げます。

リンク