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

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

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

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

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

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

C D E F G
C - x x
D x - x
E x - x x
F x x - x
G x x -

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

mGoalPos = {
    {'E', 'G'},
    {'F', 'G'},
    {'C'},
    {'D'},
    {'C', 'D'},
};
1
2
3
4
5
6
7

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

mGoalPos = {
    {'G', 'E'},
    {'F', 'G'},
    {'C', 'C'},
    {'D', 'D'},
    {'D', 'C'},
};
1
2
3
4
5
6
7

というような配列になっている。アタリ位置が 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
];
1
2
3
4
5
6
7
8
9
10
11
アタリ位置 予測 実測
6 A 2 G
27 A 3 D
11 B 4 I
2 C 3 H
12 C 3 H
17 C 1 E
19 C 4 G
24 C 2 D
9 E 2 H
18 E 3 B
20 E 3 B
30 E 2 H
21 F 1 A
29 F 2 G
10 G 1 F
13 G 3 A
14 G 1 F
16 G 2 C
23 G 2 C
25 G 1 F
26 G 3 A
28 G 1 F
1 H 4 F
15 H 4 F
3 I 2 B
4 I 1 H
5 I 3 A
7 I 3 A
8 I 1 H
22 I 1 H

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

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

1 2 3 4
A
B
C
D
E
F
G
H
I

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

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

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

1 2 3 4
A ? G D ?
B ? ? D ?
C E D H G
D ? ? - -
E ? H B -
F A G ? ?
G F C A -
H ? ? ? F
I H B A -

まとめ

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

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

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