いや~、落ちました。DevQuiz。
スライドパズルは17.4点取ったんだけどねぇ。
嘘じゃないよ!ほら!
まさかのウォーミングアップ失敗だったのかな…?
だとしたら恥ずかしいことなのか…?
というわけで、ブログの更新もずっと止まってたし、せっかくだからDevQuizのスライドパズルで何考えたかをつらつらと書いておこうと思います。
1.【方針】
自分の場合、しょっぱなに致命的なミスをしてしまいまして、1問0.01点のところを0.1点だと勘違いしてしまったんですね~。なんでこの先はそういうつもりで見ていってください。
スライドパズルって実は自分ほとんど遊んだことすらなかったので、まずはちょっと調べてみました。すると、偶奇性の問題から解けないパターンが有るということが分かりました。
そして問題を飛ばすことが可能で全問とかなくても満点になる(←間違い)という事なので、解けない問題と難しい問題を飛ばしてやれば良いってことか!と判断しました。
この時点でphpベースで問題・状態を画面に表示するプログラムと偶奇性のチェックを行うプログラムをちゃちゃっと書いてすべての問題がとけることと、難しそうな問題が存在することがわかりました。
じゃあ簡単なところから、という事で「壁のない問題」をチョイスしてみたところ、軽く1000問を超えていたのでこれだけ解いちゃえば良いか!と完全に間違った大方針が決定しました(笑)
2.【考察・実装】
で、ロジックの設計に入りました。
まぁとりあえずどんなもんか知らないとダメなんで、ノート切って作りましたスライドパズル(笑)
鼻息で吹き飛んで大変だったんだな、これが。
でも超強力アイテムでした、マジで。
これ使ってゴニョゴニョしてるうちにだんだんとコツが分かり、こんな感じで考えました。
・最後は右下にスペースを持ってくるので左上から揃えるといい。
・1行揃えるためには最後の2マスを同時に揃えるようにせねばならぬ。
・一番右端を最後に残すとして、一番右端に置くべきものを先に右端から二番目に、そのすぐ下に右端から二番目に置くべきものを置いておくと1行が完成する。
・2つのものを入れ替えるのに6マス必要。
・なので最後は下から2段使って左上下2マスづつ揃えるようにする。
こんなんで壁なしは解けるかなーと思ってコーディング開始。今仕事が忙しくてなかなか時間が取れず、最初に流せる状態になるまで3日くらいかかったかな?それはバグがあって途中で止まったけど、それまでのはちゃんと解けてた。
おーいけそうじゃん!って思って仕事の忙しさもあって最後の金曜まで放置してたのが運の尽きでしたねぇ。
3.【まさかの気づき】
金曜の仕事が終わって夜の12時くらいから作業を再開したんです。で、バグ潰し終わったのが2時くらいだったかな。これで1100問くらい解けてた。よゆーじゃーん!やったーと喜び勇んで回答ファイルを提出。
…?
じゅってん?
ば、バカな!1000×0.1だぞ!?100は取れるだろ!?そんなに間違ったのか!?
と思って問題文をもう一回読んで顔面蒼白(泣)
何が一番焦ったかって、同じく挑戦してた人に全部挑戦しなくても満点取れるから壁なしだけ挑戦でもいいじゃん♪とのたまってしまっていたこと!!!
超焦って夜中にもかかわらずメール送信。夜分失礼に始まり返信不要で終わる、あれなメール。
で落ち着いたところで状況を整理。
とはいえ、ボーダーラインは100点ちょいみたい。とりあえず圏内だけど、確実に最後に照準合わせて点取ってくる人がいるはず。ここはちょっとでも点数が上がるように努力すべきだろう。
という事で壁ありパターンの設計を急遽開始しました。
4.【仕様追加】
突然の仕様追加。SIやってると良くありますよね!
みんなおうちに帰れなくなるあれです。
そして実質あと1日しか使えない状況。
(日曜は1日用事があったのです)
土曜は死に物狂いでしたね~。生活は完全に1日ニート。
こんな感じで考えました。
・壁の置き方が難しくない問題を優先的に解きたい。
・右から2列目や下から2段目に壁があると難しくなる。
・6ブロックの中に壁があったときに複数のマスを同時に揃えなければならなくなる。
・6マスの中の特定の位置に壁があった時の揃え方のパターンを増やしていけば解けるはず。
・空白を目的地まで移動させる時に、壁を回避するロジックを入れる(右手付き、左手付き)。
・横×縦=2×3の6マスで、右の真ん中に壁があった場合は壁の左に右上に置くべきものを置いたら左上に置くべきものを下に持ってくる。両方一つ上に移動させたら壁の左に置くべきものを左上に置くべきものの下に持ってくる。
・まずは壁一個のパターンをこんな感じで実装する。
・たぶん壁2個のパターンで片付くはず(3個になると条件が揃ってないと難しい)
全部じゃないけど、大まかにはこの方針で始めました。
結局無理やりの仕様変更な上、焦ってコーディングしてたのもあって、壁回避ロジックのバグ改修にかなり苦戦してしまいました。壁に左手つきながら、もしくは右手をつきながらのロジックが無限ループしちゃったんですよね~。
でまぁ何とか壁1個のパターンを1つだけ実装してギブアップ。日曜も夜中はやってたんですけど、2時くらいに実装は諦めて無限ループする問題のブラックリスト作ってたら朝の4時(何気にこれが一番泣きそうでした)。
で、17.4点。
…しかし、しかし落第(泣)
こ、この努力は報われないのかぁ~~~
来年は無理だろうなぁ。
きっと仕事でこんな時間取れなくなってるだろうから。
それが解ってたから有終の美を飾りたかったんですが、かなわずでした。
ま、DevQuiz、ひいてはGoogle様をなめてかかった自分が悪いんですけどね。
いろんな意味でいい勉強になりました。
Googleさん、ほんとにありがとうございました!!!!
(楽しかったです☆)