ハクソク

世界を動かす技術を、日本語で。

Hackerたちの意見

どっちが先だったんだろうね、ゲームそれともドメイン名?
もう何年も払ってるドメインがたくさんあって、今は10倍以上のスピードでコーディングできるから、やっとサイトが作れるようになる!
ゲームの感じはちょっとWordleみたいだね。1日1つのパズルで、他の人と解答を比べられるのがいい。
楽しかった!でも、FireFox(Floorp)でブロックを削除するのがちょっと面倒だった。タイルをクリックしようとすると右クリックメニューが出てきちゃって。明日のも楽しみ!
最初はそう思ったけど、実は壁を削除するのは左クリックでできるよ。
自分の解答と最適解をワンクリックで比べたり切り替えたりできたらいいな。
すごく楽しい!でも、壁が四角の境界を越えてしまうのがめっちゃイライラする。3D効果なしで、壁を単純に埋めた四角にできるオプションがあったらいいな。
馬がブロックを置くごとに1マス動くと思ってたんだけど、出口に誘導して最後の瞬間に閉じ込める計画を立ててたのに…ダメだった!
最近、そういうゲームを見た気がする(タイルを置くと動物がタイルを動かす、みたいな) - たぶんitch.ioで。探してみるね。
Day 8やった!「パーフェクト」ってのが最適なスコアって意味かは分からないけど、グラフの一番上には出てるよ。 https://enclose.horse Day 8 パーフェクト!100%
「最適解を見る」をクリックすると、自分の「完璧」と同じはずの最適解が表示されるよ。[0] 一日につき最適解は1つだけだと思ってるんだけど、もしかしたら間違ってるかも。
面白いゲームだけど、一回しか挑戦できないのが嫌だな。ページに戻っても前のスコアを超えるために再挑戦できないし、リプレイの価値が全然ないよね。
リプレイ性についてはちょっと意見が違うな。これはデイリーチャレンジだから、明日また戻ってくればいいじゃん。結構好きだよ。
出口ルートがどこか、スコアがどうなるかを示してくれて、ゲートを好きなだけ動かせるから、最大の面積を見つける手段は完全に自分の手の中にあるよ。
ブラ、これWordleみたいだね。明日また戻ってこいよ。
一回だけ提出できるけど、リセットを押せばもっと良い解決策を見つけられるよ。リーダーボードには提出できないけどね。
右上のサンドイッチアイコンをクリックして、過去のパズルかブラウズを選べば、もっとパズルが遊べるよ。(自分で作って提出することもできるし。)
一日一回のワンショットが、1つのボードにじっくり取り組む理由を与えてくれるね。Wordleが大好きなんだけど、無限にゲームをプレイできるWordleアーカイブサイトを使った時は、10回目以降のラウンドを一気にやるから、深く考える理由がなくてプレイできなかったんだよね。
提出せずにテストするだけでもいいんじゃない?
全部配置した後は、壁を取り除いたり変更したりできるよ。今のスコアは見えるけど、繰り返し調整できるからね。
こういう問題に対して、もっと大きなグリッドの最適解をアルゴリズム的にどうやって見つけるのか気になるな。Factorioで同じ問題を生成されたマップ画像を使ってシード探しをしたかったけど、速さ的に良い解決策は見つからなかったんだよね。
制約プログラミングが適切なアプローチかもね。入力は壁の数と湖の位置で、決定変数は壁の位置になる。馬が囲まれていることをエンコードするために、馬が特定のマスに到達できるかどうかの追加変数を設定できるよ。最後に、到達可能性の制約や、エッジに到達できないことを確保する制約が正確性を保証するはず。
このサイトは、Clingoエンジンを使って小さいグリッドの最適解を計算するためにアンサーセットプログラミングを利用してるよ。こういうグリッドを最大化するのはたぶんNP困難だね。伝統的なSATやSMTソルバーはフラッドフィルの計算がかなり非効率的だってことも覚えておいて。最適解を計算するために使っているASPの仕様は意外と短くて読みやすいよ。こんな感じ:#const budget=11. horse(4,4). cell(0,0). boundary(0,0). cell(0,1). boundary(0,1). % ...省略... cell(3,1). water(3,1). % ... % 隣接セル(4方向接続) adj(R,C, R+1,C) :- cell(R,C), cell(R+1,C). adj(R,C, R-1,C) :- cell(R,C), cell(R-1,C). adj(R,C, R,C+1) :- cell(R,C), cell(R,C+1). adj(R,C, R,C-1) :- cell(R,C), cell(R,C-1). % 歩ける = 水じゃない walkable(R,C) :- cell(R,C), not water(R,C). % 選択:馬とチェリー以外の歩けるセルに壁を置く { wall(R,C) } :- walkable(R,C), not horse(R,C), not cherry(R,C). % 予算制約(ネイティブカウント - ビットブラスティングなし!) :- #count { R,C : wall(R,C) } > budget. % 馬からの到達可能性(z = 囲まれた/到達可能なセル) z(R,C) :- horse(R,C). z(R2,C2) :- z(R1,C1), adj(R1,C1, R2,C2), walkable(R2,C2), not wall(R2,C2). % 馬は境界に到達できない(脱出するから) :- z(R,C), boundary(R,C). % 囲まれたエリアを最大化(チェリーは+3ボーナス = 合計4) #maximize { 4,R,C : z(R,C), cherry(R,C) ; 1,R,C : z(R,C), not cherry(R,C) }. % 壁の位置だけ出力 #show wall/2.
たぶんNP困難だと思うけど、スパースカットから来てるかも。最小カットを見つけて、最小カットのエッジに容量を追加していけば、目的のカットサイズに合うカットが見つかるかもね。(もし目的のカットサイズが最小カットサイズに近いならだけど)。
いいね。Rodent's Revengeを思い出す。