2006-03-20

水玉潰しゲームソルバーに挑戦

水玉潰しを解くスクリプトを書こうと思い立ちました。が、やたらと時間がかかります。かたっぱしから手を生成して、それをシミュレートするという力技なので、時間がかかるのは当然です。ラスト何か数手であっても数分かかったりします。何かヒューリスティックを考えないといけませんね。




def main():
pattern = [[0,4,4,0,0,0],
[0,0,0,0,0,0],
[2,0,0,0,0,0],
[3,0,0,0,0,0],
[3,0,0,0,0,0],
[0,0,0,0,0,0]]
solution, tank = solve(pattern, 13,13)
print solution, tank

def play(game, sequence=[]):

for x,y in sequence:

game.dropByUser(x,y)



def solve(pattern, tank=10, limit=2):

tankMax = -1

solution = None

game = Game()

for currentLimit in xrange(1, limit+1):

print currentLimit

# for each sequence:

for seq in sequences(currentLimit):

# heuristics

if unsolvable(pattern, seq):

continue

# play game

game.init(pattern, tank)

play(game, seq)

# if solved and tank is larger than prev best,

# store tank and solution

if game.isSolved() and game.tank > tankMax:

solution = seq

tankMax = game.tank

if solution:

return solution, tankMax

return solution, tankMax



def sequences(limit):

if limit==0:

yield []

return

for x in xrange(6):

for y in xrange(6):

for tmp in sequences(limit-1):

yield [(x,y)] + tmp

return



_tmp_pattern = [[0 for x in range(6)] for y in range(6)]

def unsolvable(pattern, seq):

for y in xrange(6):

for x in xrange(6):

_tmp_pattern[y][x] = pattern[y][x]

for x,y in seq:

_tmp_pattern[y][x] += 1

if max([max(z) for z in _tmp_pattern]) < 5:

return True

else:

return False





class Game:

def __init__(self):

self.tank = 0

self.cells = {}

for y in xrange(6):

for x in xrange(6):

self.cells[x,y] = Cell(self)

self.splashes = []

self.chain = 0



def init(self, pattern, tank=10):

for y in xrange(6):

for x in xrange(6):

self.cells[x,y].drop = pattern[y][x]

self.tank = tank



def dropByUser(self, x, y):

self.chain = 0

return self.drop(x, y)



def drop(self, x, y):

self.tank -= 1

self.cells[x,y].growDrop()

while len(self.splashes) > 0:

s = self.splashes.pop(0)

s.move()

if s.alive:

self.splashes.append(s)



def notifyCrash(self, cell):

self.chain += 1

if self.chain == 3:

self.tank += 1

self.chain = 0

for (x,y),value in self.cells.items():

if value==cell:

break

for dx,dy in [(1,0), (-1,0), (0,1), (0,-1)]:

self.splashes.append(Splash(self, x,y,dx,dy))



def isSolved(self):

for c in self.cells.values():

if c.drop!=0:

return False

return True



def __str__(self):

string = "tank: %d\n" % self.tank

for y in xrange(6):

for x in xrange(6):

string += "%d " % self.cells[x,y].drop

string += "\n"

return string



class Cell:

def __init__(self, game):

self.game = game

self.drop = 0



def growDrop(self):

self.drop += 1

if self.drop==5:

self.drop = 0

self.game.notifyCrash(self)



class Splash:

def __init__(self, game, x, y, dx, dy):

self.x = x

self.y = y

self.dx = dx

self.dy = dy

self.game = game

self.alive = True



def move(self):

self.x += self.dx

self.y += self.dy

if (self.x<0 or 5
self.alive = False

elif self.game.cells[self.x, self.y].drop > 0:

self.game.cells[self.x, self.y].growDrop()

self.alive = False





if __name__ == "__main__":

main()



2006-03-19

Daniel L. Schacter / なぜ、「あれ」が思いだせなくなるのか



最近、物忘れがひどすぎるので、この本を買いました。



固有名詞には特別な意味はない。その名前で呼ばれる個人を象徴するが、その個人の性質を暗示することはない。[...] 名前がジョン・ベーカーだというとき、比較的よくあるアングロサクソン系の名前であるということの他には、彼個人についてほとんど、あるいはまったく何も伝えていないのだ。 (p.79)

よっぽどのことがない限り、私は、本名を知っている人を、あだ名やニックネームで呼びません。たとえば「ふるっち」や「ふるちん」などの呼び名があるからといって、誰かが私を識別することの役に立たないからです。ただし私の鼻が、他人の鼻より際立って赤い場合に「赤鼻の古川」とか「トオル・ザ・レッド」という呼称には意味があると思います。身体的特徴を口に出すことの倫理性は別として、認識のしやすさという点で、便利です。



記憶結合の失敗が原因で、実際に経験した出来事と、ただ考えたり想像しただけの出来事とが混乱することもある。たとえば、これから外出しようというときに、家のドアを閉めて鍵をかけなければと考える。その一時間後、車のなかで、あなたは突然パニックに襲われる。自分は本当にドアに鍵をかけてきたのか、それともただ想像しただけなのか?(p.117)

ちなみに私は、通勤途中に「ズボンをはいたかどうか」不安になることがあります。毎日、似たデザインのスーツを着ているので、ズボンをはいた記憶があいまいのなのです。あと、トイレでズボンを下ろしたときに、ファスナーを数秒前にあけたのか、元々あいていたのか分からなくなります。せっぱつまっているときは、特に。



つきまとう記憶を本当に和らげるためには、それらを認識し、直面し、対処しなければならないのだ (p.231)

トラウマというほどではないにしても、思い出すと逃げ出したくなる記憶が多々あります。どこかで向き合わねば。



矢幡洋 / とにかく目立ちたがる人たち



事態を客観的に分析したいと考えている人にとっては、ヒストリニオクスのトークは分析的な情報に乏しく、自分の主観的な体験を強調しているだけに聞こえる。 (p.101)


「これは大問題です」とか言うので話を聞いてみると、全体から見るとごく小さな障害に対して過剰に反応しているだけ、ということがあります。私は、「大」「非常に」「超」などの接頭辞を使わないと、他人の注意を集められない事象は、およそ重要ではない、という仮説を持っています。



ナルシストは、自分が他人に与えたものに関しては過大評価し、自分が他人から受け取ったものに関しては過小評価する傾向が強い。 (p.133)


しょうもない情報の提供や、たいした手伝いしかしてもらっていないのに、恩着せがましく「今期の成果」として公表されるときの、がっかり感はすさまじいものです。



以上、自戒もこめて。