CodinGameのSMASH THE CODE 4年前のプログラムをみてみる
2760人の参加者の中で629位 まあそんなに悪くもない
その前にもぷよぷよ風のアルゴリズムを日本のコンテストで
C++で書いた記憶があって、そこそこ連鎖させていたはず
4年前のPythonのコードはクラスまで使っていて350ステップほど
しかしその対戦をみて愕然とする パット見弱い
連鎖すらコーディングできていない感じ
ということで作り直してみました
あいかわらずシルバーボスに苦戦します
1日半ぐらい経過してシルバーリーグの54位全体の444位
その設計のようなメモ書きから説明してみます
メモ書きーーーーーーーーーーーーーーーーー
#4年前 629
#右に90度倒してラインの"."を詰めて右に"."を新たに足す
#そのままと回転で横に2つ並んでいる点を連鎖の起点にする
#連鎖初回は置いた位置2点からのみ
#消える際その周りに0があれば消す
#消えた列の消えた点から上からしか次の連鎖は起きない
#3つなぎまでをポイント 608
#連鎖計算あり
#ピンチで早打ち 506
#ニア3ポイント 506
#2023 11/7 5:10 ニア3の拠点にエアがあること 510
#first attack2回の0削り40point 12:00 484
#ゲームの配点を取り入れる 14:49 488
#line_score導入 19:34 444
メモ書きーーーーーーーーーーーーーーーーー
今回工夫したのは版を右90度回転させたことによって板の生成の高速化
各列を行に変換した感じ
各色が1から5 0がおじゃまぷよ ”.”が空欄の文字列ボード
消すアルゴリズムの高速化が鍵なんだけど
最初に消えるのは最後においたぷよ2点からだけでいい
次に起点になる消えた点の上から落ちてきたぷよ
90度回転させて消した場所を空白スペースにする
行ごとに空白スペースを消して行の長さを合わせるように”.”を足せばいい
これでかなり計算は速くなったはず
連鎖は再帰にして戻りは連鎖数だけだったのが
おじゃまぷよの消せる数と実際のゲームにそったスコアを追加で返す
シルバー100位ぐらいからはいつも苦労する
2つぐらい新しいアルゴリズム思いつかないとダメみたいな感覚がある
とはいってもバグを念入りに調査して精度が上がってゴールドに上がれたり
2位ぐらいでピタッと止まって数年後にひょっこり上がったこともある
今回最後に導入したのはもともとの盤の1,2,6列の空欄1個につき加点するというもの
ほんの10行ぐらいなのだけどシルバー54位まであがった
難しいプログラムを50行ぐらい書いて下がることもあれば
指定位置の空欄を加点するシンプルがプログラムが効果あったり
不思議なものです
目標は300位
ぷよぷよの連鎖の積み方勉強しないと