攻略サイトを見るのも無粋だと思うほど面白い作品なのでちょっと手を止めて適当に解いてみた。
data = []
data.append(
[ 25, 16, 80,104, 90,
115, 98, 4, 1, 97,
42,111, 85, 2, 75,
66, 72, 27,102, 48,
67, 18,119,106, 5,
])
data.append(
[ 91, 77, 71, 6, 70,
52, 64,117, 69, 13,
30,118, 21,123, 23,
26, 39, 92, 44,114,
116, 17, 14, 73, 95,
])
data.append(
[ 47, 61, 45, 76, 86,
107, 43, 38, 33, 94,
89, 68, 63, 58, 37,
32, 93, 88, 83, 19,
40, 50, 81, 65, 79,
])
data.append(
[ 31, 53,112,109, 10,
12, 82, 34, 87,100,
103, 3, 0, 0, 0,
113, 57, 0, 0, 0,
56,120, 0, 0, 0,
])
data.append(
[121,108, 7, 20, 59,
29, 28,122,125, 11,
51, 15, 0, 0, 0,
78, 54, 0, 0, 0,
36,110, 0, 0, 0,
])
choices = [ 62, 9, 41,
49,105, 96,
8, 22,101,
55, 35, 46,
84, 60, 99,
24, 74,124,
]
def get_patterns():
p = []
for x in xrange(5):
for y in xrange(5):
p.append([[x,y,z] for z in xrange(5)])
for y in xrange(5):
for z in xrange(5):
p.append([[x,y,z] for x in xrange(5)])
for z in xrange(5):
for x in xrange(5):
p.append([[x,y,z] for y in xrange(5)])
for x in xrange(5):
p.append([[x,yz,yz] for yz in xrange(5)])
p.append([[x,4 - yz,yz] for yz in xrange(5)])
for y in xrange(5):
p.append([[xz,y,xz] for xz in xrange(5)])
p.append([[4 - xz,y,xz] for xz in xrange(5)])
for z in xrange(5):
p.append([[xy,xy,z] for xy in xrange(5)])
p.append([[4 - xy,xy,z] for xy in xrange(5)])
def transform(p):
temp = []
for t in p:
temp.append([[i[0], i[1] * 5 + i[2]] for i in t])
return temp
return transform(p)
patterns = get_patterns()
targets = []
for Level in xrange(3,5):
for Index in (12, 13 ,14, 17, 18, 19, 22, 23 ,24):
targets.append([Level,Index])
def get_score(data):
scores = []
for t in patterns:
score = 0
for i in t:
Level,Index = i
score += data[Level][Index]
scores.append(score)
avg = float(sum(scores)) / len(scores)
return sum([(score - avg)**2 for score in scores])
def swap(old):
from copy import deepcopy
from random import randint
a = randint(0,len(targets) - 1)
while True:
b = randint(0,len(targets) - 1)
if a != b:
break
Level,Index = targets[a]
a_choice = old[Level][Index]
Level,Index = targets[b]
b_choice = old[Level][Index]
new = deepcopy(old)
Level,Index = targets[a]
new[Level][Index] = b_choice
Level,Index = targets[b]
new[Level][Index] = a_choice
return new
def optimization():
for i in xrange(len(targets)):
Level,Index = targets[i]
data[Level][Index] = choices[i]
pop = []
for i in xrange(20):
pop.append(swap(data))
last_score = 9999
round = 0
while round < 1000:
scores=[[get_score(v),v] for v in pop]
scores.sort()
ranked=[v for (s,v) in scores]
pop = ranked[0:10]
for i in xrange(10):
pop.append(swap(pop[i]))
best = scores[0]
print best
last_score = best[0]
if last_score == 0:
for i in xrange(len(targets)):
Level,Index = targets[i]
if i != 0 and i % 3 == 0:
print ''
print best[1][Level][Index],
print ''
break
round += 1
optimization()
105 8 96 9 62 74 55 49 35 41 124 84 99 24 60 46 22 101