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

ふるつき

記事と内容がないです

部内でプロコンを開いた

 部内でプロコンを開いたので振り返りも兼ねてまとめておく。

開いたのは、 JMC (Joken Marathonc Contest) で、86時間のマラソンマッチ。開こうと思った経緯から準備・開催中までを書く。

動機

 いままでも、Jokenがもっと高度な部活になればいいなと思って活動してきた。目標はKMCだったけど、まあそんなに高望みしないので、せめて、全員 FizzBuzz かける、それでもってなにか自分の好きなこと、得意なことをもっているみたいな組織があればなと思っていた。

 それでまあ Joken LT とか銘打って LT 大会をやったりしたし、 師匠が Joken CTF とか Joken Programming Contest とか開いてくれていた。これは三年生(ぼくら)がメインで参加していたけど、二年生とか、一年生も顔を出してくれた。まあつまり、こういう催事をなんどかやってきて、それなりの素地はあった(と思いたい)ということ(Joken LT は後輩へ引き継ぎたい=運営したくないって言って投げたけど、そのあとうまく開催されない)。

 それで今度は何やろうかと思ったときに、 Supercomputing Contest のことを思い出したというわけ。長い時間かけてやるコンテストは、”答え”がないので適当に組んでもそれなりに頑張った感じになるので好きだったり、SuperConで3位入賞したのでちょっと楽しい記憶があった。師匠にこれこれこういうコンテストやりたいかも、と喋ったのが去年の 10 月頃で、そのときはまあ問題を考えたりしてはゴミ箱に放り込んでた。予定では年末にやるとか師匠に宣言してたけど、実現はしなかった。

 年が明けた頃に、結局やらないの? と師匠に失望まじりに言われたので、これはやらねば、とおもって、今まで考えた問題の中で一番マトモなやつを引っ張り出してきて考えた。その問題は、 kosen14s でこんなの問題になりますか? と訊ねてうぃんじーくんに欠点を指摘してもらっていたので、そこを直した。

できたもの

 それで、作ったのが https://theoldmoon0602.tk/jmc のような問題(公開しておくので遊んでみてください。攻撃したいひとは事前にコンタクトしてください)。テスト期間を利用してつくったので、1週間くらいかかったとおもう。生PHPと、sqliteで問題サーバをつくって、スコアの算出は go で書いたバイナリに任せた。

 問題自体は、要するに n2-1パズルとかスライドパズルと言われるようなパズルで、魔方陣を作ろうぜ、という感じのパズル。各行各列と対角線でsumをとって、その分散を0に近づけたい(魔方陣なら0になるはず)、というもの。

 これを組み上げて、とりあえず kosen14s に投げた。Jokenでいきなりやってコケるのは怖かったので、遊んでくれませんんか、と。運悪く、久留米がそのタイミングでテストで、つよい競技プログラマに回答を提出してもらうとかはできなかったけど、みどりんごくんが遊んでくれて、「CSRF対策すれば」と言ってくれたのでしたりしました。

 それで、まあ、Jokenでもアナウンスして、レジだけならそこそこの人数(10人くらい)になりました。

開催

 師匠と、D氏(かれも三年生で、SuperConで一緒だったしつよい)が最初に遊んでくれました。僕はSlackの通知のためにURLを設定するのを忘れていて、慌ててURLを追加したりしました。

 事前に問題文だけ公開していたので、師匠はソルバを書いてたらしく、いくらか提出をしてきました。なんか師匠の試算したスコアとサーバの弾き出すスコアが違ったっぽいのですが、とりあえずぼくが間違えていたわけじゃなかったのでそれは安心。

 今回の問題では、最小は 10 * 10 のパズルで、100*100 とか 1000*1000 でやったんですが、 100 * 100 でも十二分に大きくなってしまったのでまあ 1000 * 1000 はいらなかったかなという感じでした。

 その後、師匠がいろいろ頑張って値を改善する時間が続きました。Joken唯一の四年生が、手で挑戦したりしてくれました。残念なことに、それ以外の人々がまったくといってよいほど参加してくれませんでした。その晩、三年生の kyumina が取り組もうとしてましたが、結局挫折したみたいでした。    前日の反省を受けて、翌日は、スコア計算プログラム(C++版)を Slack に流したり、10*10より小さいケースを幾つか追加したりしました。これはそれなりに人気で、最小のケースでは師匠がおよそ最適解と思われる解も叩き出してくれて一時だけ盛り上がりました。

 その日は、お昼過ぎにD氏がめっちゃ頑張って師匠を抜きました。僕も楽しくなってきて自分のソルバを試しましたが、D氏とどっこいくらいでした。その晩は、 kyumina 向けに、「乱択アルゴリズムを使うと楽ですよ」とかきました(僕の実装が乱択やきなましもどきだったので)。僕もビームサーチもどきに初挑戦しましたが、全然だめだったりしました。

 で、次の日は、もう殆ど安定してしまって、師匠がいくらか提出をしただけでした。さらに次の日、この日が最終日でしたが、このひもほとんど提出がなく、D氏が値を少しかいぜんして終わりました。

 その晩、 mi_24v という三年生が、終了一時間前になってコードを書き始めましたが、さすがに間に合わず、提出はありませんでした。

 それでおわり。結果はこんな感じでした。

f:id:Furutsuki:20170222112826p:plain

感想 反省

 レジるだけで参加してくれないひとが多かったので残念だなーと思いました。ハイスコアを狙うなら別ですが、ちょっと自分でソルバを書くだけならそんなに難しい問題ではないとおもったので(何しろ選択肢が殆ど無いので)、三年生でもソルバを書けたのが二人しかいないというのには失望しました。

 こちらとしても、もっとヒントをだしてもよかったな(例えば私のソルバを投げるなど)とか、もっと小さい入力でもよかったなとか、86時間は長いみたいだし24時間とかでもよかったなとか、いろいろ考えさせられました。経験としてはいいものになりましたが、楽しい記憶にはちょっと遠いかなという感じです。

今後、またこういうコンテストを開くかどうかわかりませんが、もうちょっと考えようなーとおもいました。