2012/10/04(Thr)makeplex salon:あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定 に挑む。

はてブ数 2012/10/06 0:29 計算機な日記::プロコン つーさ

ネットだらだらしてたら辿り着いたのでやってみた、系。

makeplex salon:あなたのスキルで飯は食えるか? 史上最大のコーディングスキル判定
http://www.itmedia.co.jp/enterprise/articles/1004/03/news002.html

モニター最速40分だと、競技プログラマーの血がさわぐぜー!

というわけで、回答した。

http://ideone.com/90N1t ← のが見やすいかも。sample input に対する出力もこっちみてくれ

問題読み始めからここまで55分くらいだった(コメント書き足し含まず)
ちょっとテストしてみて「よし、書けた!」と思ったのが35分くらいで、
後からリファクタリングしつつもっとテストしつつの段階で、
条件漏れに気づいたんで、SRMだったらxになってるパターンですけどX(

問題を5分くらいで読んでその後サンプルを弄って3分くらいで理解して、
メンツ抜けるだけ抜いてみればいいんじゃね? まぁ、バックトラックだよねと。
とりあえずメンツ抜いて残りを返す関数は要るだろとTryExtractを3秒で(否1分くらいで)さくっと書く。
あとは、どういうときに待ちになってるかと、どういう3枚ならメンツとして認められるかだけど、
うーん、関数で定義すんのめんどくせーな。配列に列挙するか、だーっと書く。
さて、問題は雀頭の処理だなー。これだけ2枚1組だし。2組出てきちゃいけないし。
13枚の入力のうち、単騎にならない時はすでに雀頭がただ1つあるはずだから、先に抜いちゃうか。
んじゃ、残る待ちの形としては2枚か1枚で、2枚の時は待ちになってればおk、1枚の時は単騎で確定か?
後は再帰の過程で、抜けなかったやつをもう一度抜こうとしないこと?
したら、たぶん無駄な探索とか重複列挙とかなくなるよね。うん、どこまで試したかindexもっとこ。
おkおk。そうしよう。がりがりがり。でーきた。(ここで35分くらいだった)

なんかおかしいね。うん、配列につっこんである面子の列挙漏れだね、しんでこい!(ここで55分だった)

わたしには、コーディングスキルがなさすぎた……!

35分の時点でoになってれば良かったんですが、
もうちょっとバグ出さないコーディングしないとダメだと思う。

振り返ってみて、
待ちの形を文字列配列で書き出したからバグったわけで、
しかも見た目シンプルになってるからめんどくさがらずに、条件式で判定すべきだったなーとか。
予想外にメモリ食ってるしremains, nextにあたる変数は、
最初からListにしときゃよかったなーとか。

探索関数とかを上に書いちゃうのはC言語使ってた頃の癖だなー。
C#とかC++の場合、Mainを上に書いた方が読む方は楽だと思う。