うなすけとあれこれ

2013年10月15日

プロコン競技で惨敗したよ

予選で負け、1回戦で負け、敗者復活でも負けました。そんなプロコン旭川のことを振り返ります。 I love dice.

福井チームの戦略

まずは我が福井がどのような戦略で挑んだのか説明します。 重要なのは 速く そして 多くの 情報を伝えることです。

パケットを早く並べるために

サイコロの種類

試合で撮影された画像を見ていると、サイコロを斜めにしたり、3つのサイズを使い分けたりするチームが多く見られました。福井の画像は、パケット内に大サイコロが敷き詰められています。これにより、向きを考えずに済み、大きさを選ぶ時間もなく、配置する場所も調整する必要なく、とても速くサイコロを並べることができます。具体的には、1分30秒以内にはひとつのパケットを完成させ、配置のチェックもすることができます。また送信側には2人居るので、実質1分30秒以内に2パケット完成させることができます。

サイコロの配置の表示

問題文は、.txtファイルで渡され、ファイル名も事前にわかるようになっていました。そこで、USBメモリが挿入されると同時に、.txtファイルのオープン、問題文の読み込み、符号化そしてパケット例の表示を自動で行うプログラムも作成しました。競技の様子を見てもらえればわかると思いますが、試合開始とほぼ同時にサイコロを並べ始めることが可能になっています。 また2台のパソコンでLANを構成し、パケット例をそれぞれに表示させることで、2人が同時にパケットを作ることが可能になっています。

使用するサイコロの目

これは後述の多くの情報を伝えるための工夫と内容が被ってきます。 より速くサイコロを並べるために、使う目のことも考えました。 問題文は最短で1文字とFAQで公表されていました。つまり、問題文が「A」という可能性も十分ありました。そんな状態で圧縮やサイコロの目を気にしている時間はありません。そこで、1の目とそれ以外の2種類の値を使うプロトコル1から6の目の6種類の値を使うプロトコルの2種類のエンコード方式を実装し、問題文の長さにより使い分けるようにしました。前述の1分30秒というのは2種類の値のみ使う場合の時間です。

多くの情報を伝えるために

福井チームが使うサイコロは、パケット内に並べた場合一番数が少ない大サイコロです。そのために、情報の圧縮は不可欠でした。そこで、定型文、中学1年から3年までで習う英単語、アイヌ語の辞書化を行い、情報の圧縮を試みました。 ハフマン符号や、バイナリデータ圧縮を用いる方法もありますが、このような辞書化を行うことで、ある程度は目で見て並べ間違いのチェックができます。 前述したように、エンコード方式も2つ用意し、長い文章の場合はよりパケットが少なくなるようにしました。

パケットの読み取り

パケットの読み取りには、OpenCVを用いた画像処理を採用しました。しかし、人の目に勝る画像処理エンジンはありません。そこで、テンキー(持ち込みができないので、テンキー付きキーボードのノートパソコンを使用)による打ち込みもできるようにしました。一方で、調子のいい時には人の手を介さずに回答送信まで出来るようなシステムも開発しました。

そして挑んだプロコン本番 一体何が起こったのか

予行練習

予行練習、福井チームは「負けること」を想定していました。大事なのは撮影データを集めることであり、勝敗ではありませんでした。(大会側からのデータは信用できない病に感染している) 画像受信URLを間違え自チームの画像をダウンロードできずに試合終了 ヤッチマッタァ!! これでは1回戦までに画像処理のチェックができません。そこで急遽沖縄高専に予選での撮影画像を頂くことに。ありがとうございました沖縄高専!(絶対解読できないだろうからって言われたときはカッコイイって思った)

第1回戦

試行回数がイッちゃってるのは仕様です。さて、もともとは前述の通り、問題文の長さによってエンコード方式を変える予定でしたが、予行練習の結果を見るに10数文字送信できれば1回戦突破は確実。そこで、並べるのが速い方を使うことになりました。が…… 問題文長すぎてエンコードに失敗、予行練習の文字列を送信してしまう_ ナンテコッタァ!! ちなみにこの時は完璧に画像処理でデコードすることができていました。つまり正しい問題文をエンコードできていれば1回戦突破でした。悔しい。

敗者復活戦

エンコード部分のバグを直して挑んだ敗者復活戦。入念にチェックをし、試合に挑む。 照明のセッテイングミスにより画像認識できず ソンナバカナァ!! パケット内で極端に明暗の差が出てしまい、画像処理ができませんでした。

反省

問題文の長さだったり、照明の具合なんかは少し考えればわかったことです。競技では、サイコロを速く並べることばかり考えてて、そのことに全く気が付きませんでした。落ち着いて、柔軟に対応が出来ればよかったです。

負け惜しみ

送信側3人とか福井もできたしそもそもうまく行っていれば確実に順位つくレベルまでいけたし正解文字数3桁とか楽勝だったし……まじ……

感想

今回の作業で初めてC++を触って、MacPortsを使ってインストールしたOpenCVを触って、Macが壊れて、Boxenに手を出すついでにGitHubやHomebrewにも手を出して……と、新しいことにチャレンジすることが多かったです。大変だった反面、楽しくもありました。それらに手を出したばかりでっていうのも中途半端なので、ひとまずBoxenとGitからいろいろ勉強していきたいです。 Xcodeがすごく便利でした。Macが使い物にならなくなってからはWindowsのVisual C++で開発していたのですが補完などしてくれないことも多く使っていて辛かったです。C#のほうだとうまくやってくれるらしいですが。 開発中、僕が触るとなぜか動かなくなるという能力を本番で生かしきれなかったのも悔しいです。

できれば来年も競技に出場したいのですが、卒業研究、就職活動、成績など考えるとどうも難しい……留年すればそれらの問題はスパっと解決するのですがその選択もどうなんだ、と。なかなか難しいですね。

北海道から帰ったらHDDがお亡くなりになってました。

Tweet
2013年10月15日