Codeへの愛とCuriosity

CodeIQ への出題・解説解題・その周辺について、思いつくままに。

CodeIQ の出題者業のことを振り返ってみる

もともと yhpg( https://yhpg.doorkeeper.jp/ ) を 2012年7月からやっていて。
そのことがリクルートの人に見つかって。
CodeIQ に誘われて。
2013年 9月26日に、出題者となった。

yhpg に出している問題の焼き直しでいいと言われていたので、最初は「カードゲームの役を判定する」という問題で「ポーカー( https://qiita.com/Nabetani/items/cbc3af152ee3f50a822f ) 」の焼き直しにした。

それは、こんな問題だった:

■概要
6枚のカードを使って行うカードゲームがあります。その役を判定するプログラムを書いて下さい。

■役は下表のとおりです。

役名 記号 意味
アンサー An 同一ランクの4枚組と、同一ランクの2枚組 ♥2, ♠2, ♦2, ♣2, ♠A, ♥A
シンクダブルトリオ sDT 同一ランクの3枚組が、2組。各3枚組は、スートの組み合わせが同一。 ♠10, ♥10, ♦10, ♠Q, ♥Q, ♦Q
ダブルトリオ DT 同一ランクの3枚組が、2組。sDT ではない。 ♠10, ♣10, ♦10, ♠Q, ♥Q, ♦Q
シンクコントトリプルペア scTP 同一ランクの2枚組が、3組。各2枚組はスートの組み合わせが同一。3つのランクが連続している。 ♠9, ♥9, ♠10, ♥10, ♠J, ♥J
コントトリプルペア cTP 同一ランクの2枚組が、3組。3つのランクが連続している。scTP ではない。 ♠9, ♣9, ♠10, ♥10, ♦J, ♥J
シンクトリプルペア sTP 同一ランクの2枚組が、3組。各2枚組はスートの組み合わせが同一。scTP ではない。 ♠9, ♥9, ♠10, ♥10, ♠A, ♥A
トリプルペア TP 同一ランクの2枚組が、3組。scTP, sTP, cTP のいずれでもない。 ♠3, ♥3, ♦10, ♥10, ♠A, ♣A

■ランクの連続について

ランクは A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K, A のように並んでいると考えます。つまり、「A, 2, 3」や、「9, 10, J」、「J, Q, K」などは連続したランクですが、「2, 4, 6」、「7, 10, K」 などは連続したランクではありません。
なお、「K, A, 2」は連続したランクとはみなされません。通常のポーカーと同じです。

■入力について

入力は
HJ,D10,H2,H10,S2,CJ
のような形式をしています。見ての通り、各カードがコンマで区切られています。
各カードは HJ や D10 のような形式です。最初の文字がスートを表しています。スートは
S, H, D, C
のいずれかの文字で、それぞれ
♠, ♥, ♦, ♣
を表しています。
スートを除いた部分(つまり、 J や 10 )がランクを表しており、ランクは
A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K
のいずれかの文字列で、見た通りのものを表しています。

■補足

手札にあるカードの順序は役に影響しません。
一組のトランプで作れる六枚組しかありません。つまり、 ♥3 が二枚あったりはしません。
不正な入力に対処する必要はありません。

※しかし、なんで「アンサー」なんだろう。全然憶えていない。

で。
data.txt に1万件ぐらい入力があって、各役がそれぞれ何件あるのかを数えるということになっていた。

data.txt を用意したのは、ソースコードを見る前に間違っているかどうかを知りたかったから。

挑戦者数は 50名募集のところ 52名だった。満員御礼。

フィードバックは
http://nabetani.hatenablog.com/entry/2013/10/12/231311
の通り、わりと時間を要した。
CodeIQで印象に残った問題 - カードゲームの役を判定する (q476) の通り、ciel さんが非常に珍しく(当時はそんなことは知らなかったが)ミスっていて、そのミスの原因を追ったりするのが楽しかったのを覚えている。

二問目は http://nabetani.sakura.ne.jp/codeiq/tetromino_bingo/ だった。なぜかこれだけは拙サイトに問題を上げてある。何故なのかは憶えていない。
わりと面倒な問題だったと思う。

一番印象に残っている問題は なんといっても hello, world x 3 。( see http://nabetani.hatenablog.com/entry/codeiq_hwx3_q766 )。問題としてはやや難しいけど、大変楽しい問題だった。

コンテスト形式の問題もいくつか出した。

で全部かな。
もっと出したかったんだけど、アイディアが浮かばず。

いずれも金銀銅のメダルは上位3名ぐらいに入らないと取れないという厳しいレギュレーションだった。

この中なら、じゃんけんが一番面白いかな。またどこかでやりたいぐらい。
わりとヘビーなコードが優勝して驚いたことを覚えている。

じゃんけんに限っては手元で実行する必要があるのでセキュリティの問題とかが気になって、投稿される度にソースコードのチェックを人力で行っていた。他は実行くんで動かしたんだけど、実行くんは生きているのだろうか。

あと。割と気に行っている問題は、これも yhpg で出した問題の焼き直しだけど、バス料金。
問題の詳細は http://sw-logic.com/Portfolio/Programing/CodeIQ/1937.php にある。
バスの料金って実世界で適度に複雑になっていて面白いんだけど、それをほぼそのまま出した問題。
大人料金、子供料金、定期券、特別割引、幼児は大人一人につき何人かまで無料で残りは子供料金、とか。

バス料金で思い出したけど、浮動小数点を使うと負けやすい問題を何個か出したよね。
プログラマなら浮動小数点は使い所をわきまえないとひどい目にあうことを知ってないとと思い、啓蒙のつもりで出していた。実際、多くの方がそれで負けていた。私の気持ちは伝わっただろうか。

難し目の問題も出した。
「正方形の分割」( see http://sw-logic.com/Portfolio/Programing/CodeIQ/3283.php )とか「回文数の中央値」( see https://blog.goo.ne.jp/r-de-r/e/ec7c5b11dd4d9d4c0d7b78486f80ab97 )がわりと難しかったんじゃないかなぁ。よくおぼえていない。
人によっては「ぐるぐるペンタゴン」( see http://ange1.hateblo.jp/entry/2017/02/26/233339 )や「外周の折り目」(see http://sw-logic.com/Portfolio/Programing/CodeIQ/3064.php)が難しかったかもしれない。
どうですか?>読んでいる方

簡単な問題は、「周期表」「異世界のブラウザの判定」辺りかな。

そして。

「ぐるぐる曼荼羅」というそれなりの難しさで、まあまあきれい、それでいて面倒くさく、たぶんオリジナリティがある問題になってよかったと思う。
「ぐるぐる曼荼羅」の図はまだ http://nabetani.sakura.ne.jp/codeiq/3544/huge.html にある。消す予定は特にない。
ちなみに問題の方は

図のとおりに正の整数が全て並んでいます。
数をひとつ指定しますので、その数のマスの上下左右に隣接しているマスの数を、昇順にコンマ区切りで出力してください。
入力は、1以上 十兆以下です。

というものだった。
未挑戦なら是非。


というわけで、4年半に渡り CodeIQ の出題者をやった。
履歴書に書くべき項目が増えたり、Twitter のフォロワーが増えたり、オフラインリアルタイムどう書くに来てくださる人が増えたり、いいことがたくさんあったと思う。悪いことは特に思い当たらない。


終わってしまったのは本当に残念。


CodeIQ は終わってしまったけど、私は依然として オフラインリアルタイムどう書くで出題者をやっている。
次回は 5/26(土)。see https://yhpg.doorkeeper.jp/events/73080 。参加お待ちしています。