見出し画像

Exponential Idle #2 矢印パズル攻略法(と二元体GF(2)上の線形方程式について)

この記事の続きです。

残るミニゲームであるところの矢印パズルの攻略法を説明します。

このパズルは,矢印が書かれたマス目を触ると自身および隣接するマスの矢印が一定角度回転するので,全ての矢印を上向きに揃えることを目指すパズルです。

マス目の配置および回転角度は難易度によって異なり,

イージー
:3×3の正方形グリッド,90°ずつ回転
ミディアム
:4×4の正方形グリッド,90°ずつ回転
ハード
:一辺4の六角形グリッド,180°ずつ回転
エキスパート
:一辺4の六角形グリッド,60°ずつ回転

となっています。

ここで,スターを得る際の時間対効果を考えると,ハードが最も効率が良いので,以下ハードの攻略法に絞って述べます。

1. ハード攻略法

下準備として,設定で配色を「グレースケール」に変更しておきましょう。
下向き矢印が光ってくれるので,光っているマスを消せばよいと考えることができます。

画像1

(1) 上7マス以外を揃える

まずは下から順番に,光っているマスの真上を触ることを繰り返します。ある段から光っているマスがなくなったら,1つ上の段に移ります。

これにより,一番上に「へ」の字に並ぶ7マス以外は揃えることができます。
この時点で上7マスも消えていたらラッキークリアです。これを引き当てると画像の通り5秒くらいで解けます。

(2) 上7マスを揃える

上7マスが消えていない場合,その点灯パターンは7通りしかありえません。

そして,それぞれの場合の最適解は以下の通りです。

画像2

この図で赤く示された部分を触れば,解くことができます。

これで,手際よくやれば20秒程度でトーラスパズルのハードと同量のスターを手に入れることができます。多分これが一番早いと思います。


2. 背景

さて,先程の最適解は以下のようにして求めることができます。

まず,各マスに以下のように番号をつけます。中心から外側に向かって,0から36までです。

画像3

このとき,ある番号のマスの点灯消灯は,自分自身と周囲のマスが押された回数の合計分だけ切り替わります。

すなわち,マスiを押す回数をx_iと書き,マスiの点灯消灯が切り替わる回数をb_iと書けば,

x_0+x_1+x_2+x_3+x_4+x_5+x_6 = b_0

x_7+x_18+x_19+x_35+x_36 = b_36

というような関係式が成り立ちます。

ここで,x_iには0か1のみが入ると考えてしまって問題ありません。なぜなら,同じマスを2回押しても何も変わりませんから,そのようにする意味はないためです。

また,b_iについても,
・b_iが奇数なら元の状態から切り替わっている
・b_iが偶数なら元と同じ
という2通りの意味しか持ちませんから,先の方程式の足し算はmod 2で考えればよい,つまり

0 + 0 = 0  0 + 1 = 1  1 + 0 = 1  1 + 1 = 0

と考えればよいです(演算としては排他的論理和と同じです)。

この考え方のもとで,各マスを押すか否かの変数x_iを設定し,先程のように各マスについて「自身と周囲のマスを押した回数の合計から切り替わりの有無がわかる」という式を立式すれば,37個の変数に対し37本の式が立式されます。
行列の積の形で記述すれば,以下の通りです。

[1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [x_0 ] = [b_0 ]
[1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [x_1 ] = [b_1 ]
[1 1 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [x_2 ] = [b_2 ]
[1 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [x_3 ] = [b_3 ]
[1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [x_4 ] = [b_4 ]
[1 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [x_5 ] = [b_5 ]
[1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [x_6 ] = [b_6 ]
[0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] [x_7 ] = [b_7 ]
[0 1 1 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [x_8 ] = [b_8 ]
[0 0 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0] [x_9 ] = [b_9 ]
[0 0 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0] [x_10] = [b_10]
[0 0 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0] [x_11] = [b_11]
[0 0 0 1 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0] [x_12] = [b_12]
[0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0] [x_13] = [b_13]
[0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0] [x_14] = [b_14]
[0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0] [x_15] = [b_15]
[0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0] [x_16] = [b_16]
[0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0] [x_17] = [b_17]
[0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1] [x_18] = [b_18]
[0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] [x_19] = [b_19]
[0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [x_20] = [b_20]
[0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0] [x_21] = [b_21]
[0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0] [x_22] = [b_22]
[0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0] [x_23] = [b_23]
[0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0] [x_24] = [b_24]
[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0] [x_25] = [b_25]
[0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0] [x_26] = [b_26]
[0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0] [x_27] = [b_27]
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0] [x_28] = [b_28]
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0] [x_29] = [b_29]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0] [x_30] = [b_30]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0] [x_31] = [b_31]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0] [x_32] = [b_32]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0] [x_33] = [b_33]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0] [x_34] = [b_34]
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1] [x_35] = [b_35]
[0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1] [x_36] = [b_36]

ですから,この式のbベクトルの部分に,所望のパターン(切り替えたいマスを1,それ以外を0とした配列)を設定し,二元体GF(2)上でこの線形方程式を解けば,そのパターンを実現する入力:xベクトルが手に入ります。

大学の線形代数で扱うガウスの消去法を用いて,以下のように線形方程式を解くプログラムを記述しました。
プログラミングは独学の初心者なので,コードが冗長だったり計算量がおばかだったりするかもしれませんが許してください。

import numpy as np
np.set_printoptions(threshold=10000)

#係数行列の作成
g = [[0 for i in range(37)] for j in range(37)]

for i in range(1,7):
   g[0][i] = 1

for i in range(1,7):
   g[i][i+1] = 1
   for j in range(4,7):
       g[i][2*i+j] = 1

g[1][18] = 1
g[6][7] = 0

for i in range(7,19,2):
   g[i][i+1] = 1
   for j in range((3*i+15)//2,(3*i+21)//2):
       g[i][j] = 1

for i in range(8,20,2):
   g[i][i+1] = 1
   for j in range(2):
       g[i][(3*i+16)//2+j] = 1

g[7][36] = 1
g[18][19] = 0

for i in range(19,36):
   g[i][i+1] = 1

g[19][36] = 1

for i in range(37):
   g[i][i] = 1
   for j in range(i):
       if g[j][i]:
           g[i][j] = 1
           
#二元体におけるガウスの消去法
def gaussian_elimination_gf2(A, b):
   n = len(b)
   m = n
   b = b.reshape(n,1)
   M = np.hstack((A, b)) #拡大係数行列

   #前進消去
   for i in range(n): #i行目について,
       ok = False
       for j in range(i,n): #対角成分から右に向かって調べる
           k = M[i:, j].argmax() + i
           if i != k: #対角成分が0でその下に1がある場合,行入れ替え
               temp = M[i].copy()
               M[i] = M[k]
               M[k] = temp
           if not M[i, j]: #対角成分が0でその下に1がない場合,右に移動
               continue
           for l in range(i+1, n): #対角成分に1がきたら,それより下の1は引いて消去
               if M[l, j]: 
                   M[l, j:] ^= M[i, j:]
           ok = True
           break
       if not ok: #i段目以降の係数部分が全て0になったら
           print('Reduced row echelon form:') #既約行階段形
           for p in range(n):
               print(M[p, :-1], M[p, -1])
           if np.all(M[i:, n] == 0): #係数0部分の右辺が全て0なら不定
               m = i #n-mが係数0の行の本数,すなわち独立に決定できる変数の数
               break
           else:
               print('None.') #係数が0で右辺が1なら不能
               return

   #対角成分に1がくるよう行入れ替え
   for i in range(n):
       if M[i, i]:
           continue
       temp = M[i:n-1].copy()
       M[i] = M[n-1]
       M[i+1:n] = temp
   
   #後退代入
   print('\nResults:')
   print(np.array([i%10 for i in range(n)]))
   print('-'*(2*n+1))
   mn = n
   temp = M.copy()
   for j in range(2**(n-m)): #n-m個の自由変数に入る値の各パターンについて
       ind = 0
       for k in reversed(range(n)): #下からx_iを決定
           if not M[k, k]: #対角成分が0なら,そこは自由変数
               M[k, k] = 1
               M[k, n] = (j>>ind)&1 #jの値によって自由変数の値を指定
               ind += 1
           if M[k, k] and M[k, n]: #x_kの値が1なら
               for l in range(k):
                   M[l, n] ^= M[l, k] #上の行全体からx_kの項を消去
       print(M[:, n], sum(M[:, n]))
       if sum(M[:, n]) < mn:
           best = M[:, n].copy()
           mn = sum(M[:, n])
       M = temp.copy()
           
   if m != n:
       print('\nBest answer:')
       print(np.array([i%10 for i in range(n)]))
       print('-'*(2*n+1))
       print(best,'\n')
       
#目的のパターンを受け取って方程式を解く
while(1):
   print('Enter the shining place. e.g.) \"0 1 7\" Quit:\"-1\"')
   ans = [0 for i in range(37)]
   l = [int(i) for i in input().split()]
   if len(l):
       if l[0] < 0:
           break
       for i in l:
           ans[i] = 1
   gaussian_elimination_gf2(np.array(g), np.array(ans))

これを用いると,任意のパターンは16通りの解があるか,解がないかのいずれかになります。例えば,攻略法の部分の画像の左上のパターンは以下のようになります。

Enter the shining place. e.g.) "0 1 7" Quit:"-1"
20 36
Reduced row echelon form:
[1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 1 0 0 0 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 0 1 0 0 1 0 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 0 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 0 0 0 1 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 0 0 0 0 1 1 1 1 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1] 0
[0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1] 0
[0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0] 0
[0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 0 0 0 0 1] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 0 0 0 0] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 0 0 0 0 0 1] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1] 1
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 1 0 0 0 0 1 1 0 1 0 1 1 0 0 0 1] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 0 0 0 1] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1 0 0 0] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1] 1
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 0 0 0 0] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 0 1 0 1] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 1 1 0 0 1] 1
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 0] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0] 1
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 0] 1
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1] 1
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0

Results:
[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6]
---------------------------------------------------------------------------
[0 1 1 1 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0] 15
[0 1 1 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 1] 15
[0 1 1 1 1 1 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 1 0 0 0 0 0 0 1 0 1 1 0 1 0] 17
[0 1 1 1 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 0 1 1] 17
[0 0 1 0 0 1 0 1 0 0 1 1 1 1 1 0 0 1 0 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 1 0 0] 17
[0 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 1 1 1 1 0 1 0 1 0 1] 21
[0 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 1 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1 1 0] 15
[0 0 1 0 0 1 0 1 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 1 1 1 1] 19
[0 0 0 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 1 1 0 0 0 0] 19
[0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 1 0 0 1 0 0 0 0 1] 15
[0 0 0 1 0 0 1 1 1 1 1 0 0 1 0 1 0 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 0] 21
[0 0 0 1 0 0 1 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 1 0 0 0 0 1 1 1 0 1 0 1 0 1 1] 17
[0 1 0 0 1 0 0 0 1 1 1 1 1 0 0 1 0 1 0 1 1 0 1 0 1 1 1 0 0 0 0 1 0 0 1 0 0] 17
[0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 1 1 0 0 1 0 0 1 0 0 0 0 1 1 1 0 1 0 1] 17
[0 1 0 0 1 0 0 0 0 1 0 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 1 0 1 1 1 0] 23
[0 1 0 0 1 0 0 0 1 1 1 1 1 0 0 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 1 1 1 1 1 1 1] 23

Best answer:
[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6]
---------------------------------------------------------------------------
[0 1 1 1 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0] 

Best answerの部分が,必要操作数が最も小さいような解になります。

なお,実現可能な際に必ず16通りの解が出てくるのは,全てのマスの状態を保つような操作が16通り存在する(何も押さない,を含め)からです。

Results:
[0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6]
---------------------------------------------------------------------------
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 0
[0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1] 12
[0 0 0 0 0 0 0 0 1 0 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0] 12
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1] 12
[0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0] 20
[0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0 1 0 1] 20
[0 1 0 1 1 0 1 1 0 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 0 1 0 1 1 1 1 0 1 1 1 1 0] 20
[0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1] 24
[0 1 1 0 1 1 0 1 1 1 0 0 0 1 1 1 0 0 0 1 0 1 1 1 1 0 1 1 1 1 0 1 0 0 0 0 0] 20
[0 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1] 24
[0 1 1 0 1 1 0 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1 0 1 0] 20
[0 1 1 0 1 1 0 1 1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 1 1 1 1 0 1 1] 20
[0 0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 1 0 0 0 0 1 0 1 1 1 1 0 1 1 1 1 0 1 0 0] 20
[0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 1 0 0 1 0 1 0 1 0 1 0 0 1 0 1] 20
[0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 1 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0] 24
[0 0 1 1 0 1 1 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 1 1 0 1 0 0 0 0 0 1 0 1 1 1 1] 20

図で表すと,回転して重なるものを同一視して以下の6パターンです。

画像4

そのため,あるパターンが解なら,それにこれら16種を合成させたものも全て解になります。

なお,数学的に言うなら,今回の係数行列(37次正方行列)のrankが33ということです。なので,解には独立変数が4つ残ります。

おわりに

現状この攻略法に従って矢印パズルのハードを周回するのが最も効率がよいと思います。エキスパートは各マスの状態数が6なので,mod 6で同じことをやれば解けますが,やりたくないので誰かお願いします。

参考文献


この記事が気に入ったらサポートをしてみませんか?