Quantumleap
850 words
4 minutes
キンシャケ探しのゴール位置配列を求めよう

キンシャケ探しのゴール位置#

キンシャケ探しのアタリ位置は常に ID 順に初期化されている。

なので、どの ID が実際にどの位置に対応するかはキンシャケ探しを長くプレイして全部のアタリ位置がアタリになるまで繰り返して対応表をつくるだけでよい。

ではゴール位置も同じようにやればいいじゃないかと思うが実はそう簡単ではない。

ゴール位置配列は整列されていない#

例えばトキシラズいぶし工房の満潮を考えてみよう。

CDEFG
C-xx
Dx-x
Ex-xx
Fxx-x
Gxx-

この表は C がアタリならゴール位置は E か G というように読む。ゴール候補が E か G のどちらかであるなら配列は、

mGoalPos = {
    {'E', 'G'},
    {'F', 'G'},
    {'C'},
    {'D'},
    {'C', 'D'},
};

このように表現可能であればわかりやすい。が、実際には

mGoalPos = {
    {'G', 'E'},
    {'F', 'G'},
    {'C', 'C'},
    {'D', 'D'},
    {'D', 'C'},
};

というような配列になっている。アタリ位置が D しかないにも関わらず、D、D という配列を持っていることにしないと上手く計算できないのだ。まあこれはプログラムを少し変えれば対応できそうな気もする。

大事なのは「ゴール候補の配列はソートされていない」ということなのだ。

調べてみた#

各ステージで各アタリ位置に対するゴール候補全ての組み合わせを試してどうズレているかをチェックすれば良い。

シェケナダム#

とりあえず 30 回ほど開栓を試みた。

mDest = [
  ["1", "2", "3", "4"], // A
  ["1", "2", "3", "4"], // B
  ["1", "2", "3", "4"], // C
  ["1", "2"], // D
  ["1", "2", "3"], // E
  ["1", "2", "3", "4"], // F
  ["1", "2", "3"], // G
  ["1", "2", "3", "4"], // H
  ["1", "2", "3"], // I
];
アタリ位置予測実測
6A2G
27A3D
11B4I
2C3H
12C3H
17C1E
19C4G
24C2D
9E2H
18E3B
20E3B
30E2H
21F1A
29F2G
10G1F
13G3A
14G1F
16G2C
23G2C
25G1F
26G3A
28G1F
1H4F
15H4F
3I2B
4I1H
5I3A
7I3A
8I1H
22I1H

あとはこの結果をまとめればよい。

以下のフォームを埋めるだけなのでやり方が分かれば誰でもできる。より正確には数字とアルファベットが全単射になっていることを確認しなければいけないのだが、基本的には(配列の大きさが間違っていなければ)全単射になるはずである。

1234
A
B
C
D
E
F
G
H
I

で、A の 2 は G だとわかるし、3 は D だとわかる。あとは同じように埋めていく。

すると、以下のような表ができる。これ自体はまだデータ数が少ないので全てのマスが埋まっていない。

ただ、E、G、I に関してはゴール候補の配列の大きさが 3 であることがわかっているので 4 に対応するアルファベットは存在しない。

1234
A?GD?
B??D?
CEDHG
D??--
E?HB-
FAG??
GFCA-
H???F
IHBA-

まとめ#

そして、全部の表が埋まらなくても一つを残して他が埋まれば残り一つは容易に求められる。

面倒くさい作業だが、これを繰り返せば全ステージのゴール位置の配列を求めることができる。

ただし、ドンブラコだけは 3.1.0 と 5.4.0 でアタリ位置を求めるアルゴリズムが異なるため、この手法だけで求めることができないことは注意していただきたい。

キンシャケ探しのゴール位置配列を求めよう
https://fuwari.vercel.app/posts/2021/04/goldieseeking/
Author
tkgling
Published at
2021-04-22