ใฏใใใซ
ใๅฒใใฐใใใจใใไบไบบใง่กใๆ้ใณใใใใๅฐๆนใซใใฃใฆๅๅใใซใผใซใฏๆงใ ใ ใใๅบๆฌใซใผใซใฏไปฅไธใฎใใใชใใฎใ ใ
- ใใใใใใชใฉใงๅ ่กใๅพๆปใๆฑบใใใไบใไธกๆใฎไบบๅทฎใๆใ็ซใฆใ
- ๅ ่กใฏใ่ชๅใฎๅฅฝใใชๆใง็ธๆใฎๅฅฝใใชๆใๆปๆใใ
- ๆปๆใใใๅดใฏใๆปๆใใใๆใฎๆใใๆปๆใใๆใฎๆใฎๆฌๆฐใ ใๅขใใ
- ใใฎๆใใใๆใ5ๆฌไปฅไธใซใชใฃใใใใฎๆใฏๆญปใฌ
- ใใใไบคไบใซ็นฐใ่ฟใใไธกๆใๆญปใใ ใ่ฒ ใ
่ฟฝๅ ใซใผใซใใใชใจใผใทใงใณใจใใฆใไปฅไธใฎใใใชใใฎใใใใ
- modใซใผใซ๏ผๆปๆใใใใจใใใใกใใใฉ5ใใงใชใใใฐๆญปใชใใๆใฎๆฌๆฐใฏ5ใงๅฒใฃใไฝใใซใชใ
- ๅ่บซใซใผใซ๏ผ่ชๅใฎๆ็ชใงใๆใไธๆฌๆญปใใงใใใจใใๆใฎ็ทๆฐใๅคใใใชใใใใซไธกๆใซๆใๅใใใใจใใงใใ
- ่ชๅๆปๆ๏ผ่ชๅใฎๆใง่ชๅใๆปๆใใใใจใ่จฑใ
็นใซmodใซใผใซใฏใใชใๅบใ็ฏๅฒใงๆก็จใใใฆใใใใใ ใใใกใฎๅฐๅใงใฏใๅฒใใฐใใใจๅผใฐใใฆใใใใฎใฎใใใใ็ขบๅฎ็ใชๅๅใงใฏใชใใใใใWikipediaใงใฏๆฐๅญใๅขใใ้ใณใจ็ดนไปใใใฆใใใ
ใใฆใ็ฐกๅใฎใใใๅบๆฌใซใผใซใ ใใ่ใใใใๆญปใใ ๆใฎๆใฎๆฌๆฐใใ5ๆฌใใจๆฐใใใจใใไบใใฎๆใฎๆฌๆฐใฏใใฟใผใณๆฏใซๅฟ ใๅขๅ ใใใใใใใฃใฆใๅๆฅๆใฏๅญๅจใใใๅฟ ใๆ้ใฟใผใณใงใฒใผใ ใ็ตใใใใพใใๅ่ฒ ใๆฑบใพใใฎใฏ็ธๆใฎๆๅพใฎๆใๆฎบใใๆใ ใใชใฎใงใๅผใๅใใฏๅญๅจใใชใใใฉใณใใ ่ฆ็ด ใใชใใใใๅ ๆใๅพๆใฎใฉใกใใใๅฟ ๅใงใใใใจใใใใใ
ๅฎ้ใใใฎใฒใผใ ใฏๅพๆๅฟ ๅใงใใใใใใ่ฆใฆใฟใใใใจใใใฎใๆฌ็จฟใฎ่ถฃๆจใงใใใ
ใฝใผในใฏไปฅไธใซใใใฆใใใ
็ถๆ ้ท็งปๅณ
่ใใในใ็ถๆ ใฏใๅ ๆใฎๆใฎๆฌๆฐใจๅพๆใฎๆใฎๆฌๆฐใใใใฆ็พๅจๅ ๆ็ชใๅพๆ็ชใใ ใใงใใใ็ถๆ ๆฐใๆ้ใชใฎใงใๅๅธฐใงใใฉใฃใฆใฐใฉใใไฝใใฎใฏ้ฃใใใชใใจๆใใใใใๅ็ดใซๅฎ่ฃ ใใใจ็ถๆ ใๅคใใใใฎใงใไธกๆใฎๆใฎๆฌๆฐใใฝใผใใใใใใคใพใใ๏ผๅณxๆฌ,ๅทฆyๆฌ๏ผใจใใ็ถๆ ใจใ(ๅณyๆฌ,ๅทฆxๆฌ)ใจใใ็ถๆ ใๅไธ่ฆใใใ่คๆฐใฎ็ถๆ ใใๅใ็ถๆ ใซ้ท็งปใใฆใใๅ ดๅใใใใฎใงใ็ถๆ ้ท็งปใฐใฉใใฏๅณๅฏใซใฏใๆจ(tree)ๆง้ ใใใใชใใฎใ ใใใใใงใฏๆจใจๅผใถใใจใซใใใใ
ใฐใฉใใๆใใฎใฏGraphvizใงไธ็บใงใใใใใผใไธ่ฆงใจใจใใธไธ่ฆงใฎใชในใใไฝใใGraphvizใซๆจใๆใใใใฎใ็ฐกๅใ ใใๅพใงๅพๆๅฟ ๅใ่ฆใใใใซๆจใใใฉใๅฟ ่ฆใใใใฎใงใ่ชๅใงๆจๆง้ ใไฝใใใ
ใจใใใใใใผใใ่กจใใใใใชใฏใฉในใไฝใใใงใใใญใ
class State:
def __init__(self, is_first, f, s):
self.is_first = is_first
self.f = [max(f), min(f)]
self.s = [max(s), min(s)]
self.siblings = []
self.is_drawn = False
def params(self):
return (self.is_first, self.f, self.s)
def __eq__(self, other):
return self.params() == other.params()
def __str__(self):
s = str(self.f) + "\n" + str(self.s)
if self.is_first:
return "f\n" + s
else:
return "s\n" + s
def has(self, node):
return node in self.siblings
def next_state(self, fi, si):
d = self.f[fi] + self.s[si]
f2 = self.f.copy()
s2 = self.s.copy()
if d >= 5:
d = 0
if self.is_first:
s2[si] = d
else:
f2[fi] = d
return State(not self.is_first, f2, s2)
่ชๅใฎ็ถๆ
(ๅ
ๆ็ชใใฉใใใๅ
ๆ็ชใจๅพๆ็ชใฎๆใฎๆฌๆฐ)ใจใๅญใใผใใฎๆ
ๅ ฑ(siblings)ใไฟๆใใฆใใใ__eq__ใๅฎ่ฃ
ใใฆใใใฎใฏใๅญใใผใใชในใใซๅใStateใชใใธใงใฏใใใใใใฉใใใinใงๅคๅฎใใใใใใ ใใพใใ็พๅจใฎ็ถๆ
ใใใfi็ชใฎๆใงsi็ชใฎๆใๆปๆใใใๅพใฎ็ถๆ
ใ่ฟใnext_stateใๅฎ่ฃ
ใใฆใใ(ๅ
ๆ็ชใฎๅ ดๅใๅพๆ็ชใฎๆใฏsi็ชใงfi็ชใๆปๆ)ใ
ใใใใงใใฆใใพใใฐใๅๅธฐใงๆจใไฝใใฎใฏ็ฐกๅใ ใ
def move(parent, index, is_first, nodes):
fi, si = index
if parent.f[fi] == 0 or parent.s[si] == 0:
return
child = parent.next_state(fi, si)
if parent.has(child):
return
s = str(child)
child = nodes.get(s, child)
nodes[s] = child
parent.siblings.append(child)
for i in [(0, 0), (0, 1), (1, 0), (1, 1)]:
move(child, i, not is_first, nodes)
def make_tree():
nodes = {}
root = State(True, [1, 1], [1, 1])
nodes[str(root)] = root
move(root, (0, 0), True, nodes)
return root
make_treeใๅผในใฐใๅๆ็ถๆ
ใๆ นใจใใๆจๆง้ ใ่ฟใใ
ๅฏ่ฆๅใฏGraphvizใไฝฟใใใไธใคใ ใๆณจๆใในใ็นใฏใใใคใผใใซๆ็ปใใใจใๅใใจใใธใ่คๆฐๆฌๆใใใฆใใพใใใจใ ใใใ็ถๆ ใซ่คๆฐใฎใในใใๅฐ้ๅฏ่ฝใชใฎใงใๅใใจใใธใไฝๅใ้ใใใจใซใชใใใใใใขใ็ตใถใจใใธใไธๆฌใใใใใชใใใใซใใใใใซใฏ
- ใจใใธใฎ่พๆธใไฝใฃใฆใใใงใซๆ็ปๆธใฟใ่ชฟในใ
- ใใผใใซ็ถๆ ใๆใใใฆใใใงใซๆ็ปๆธใฟใ่ชฟในใ
ใชใฉใฎๆนๆณใ่ใใใใใใใใใฏๅฎ็ดใซๅพ่
ใ้ธใใ ใStateใฏใฉในใซis_drawnใใญใใใฃใๆใใใฆใๆ็ปๆธใฟใชใๆใใชใใใจใซใใใไปฅไธใๅฎ่ฃ
ใใใจใใใชใใ
def make_graph(node, g):
if node.is_drawn:
return
node.is_drawn = True
ns = str(node)
if max(node.f) == 0:
g.node(ns, color="#FF9999", style="filled")
elif max(node.s) == 0:
g.node(ns, color="#9999FF", style="filled")
else:
g.node(ns)
for n in node.siblings:
g.edge(ns, str(n))
make_graph(n, g)
root = make_tree()
g = Digraph(format="png")
make_graph(root, g)
g.render("tree")
ไฝๆใใๆจใฎๆ นใๆธกใใฆใใใใใ้ ็ชใซใใฉใฃใฆใใผใใจใจใใธใไฝใฃใฆใใใ ใใ ใใๆ็ปๆธใใผใใชใreturnใใฆใใใใพใใๅ่ฒ ใๆฑบใใ็ถๆ
ใใใใใใใใใใซใๅ
ๆ็ชใฎๅใกใ้ใใๅพๆ็ชใฎๅใกใ่ตคใๅกใฃใฆใใใ
ใใใใฆไฝๆใใ็ถๆ ้ท็งปๅณใฏใใใชๆใใซใชใใ
ๅทฆๅณใฎๆใฎ้ ็ชใ็ธฎ้ใใใฆ็ถๆ ๆฐใๆธใใใใใใใใงใ165ใใผใใใจใใธใฏ273ๆฌใใใไบบ้ใฎ็ฎใง่งฃๆใใใฎใฏใใใฉใใใใใซใๅ ๆ็ชๅๅฉใๅพๆ็ชๅๅฉใฎใใผใใใใใใ8ๅใใคใใใใใใ ใใงใฏใฉใกใใๆๅฉใใฏๅคๆญใงใใชใใ
ๅพๆๅฟ ๅ่งฃๆ
ใใฆใใใฎใฒใผใ ใๅพๆๅฟ ๅใงใใใใจใๅฏ่ฆๅใใฆใฟใใใๅผใๅใใใชใใฎใ ใใใ่ฒ ใใซใคใชใใๆใๆใใชใใใฐๅใฆใใฏใใงใใใๅ ๆใซๅใก็ญใใใๅ ดๅใๅฝ็ถๅ ๆใฏใใฎๆใๆใคใใใใใฃใฆใๅพๆใฏใๅ ๆใซๅใก็ญใใใใใใช็ถๆ ใซใคใชใใๆใใๆใฃใฆใฏใชใใชใใใใใงใใใใซใคใชใใๆใๆๅใใใใพใใๆๅใใใ็ตๆใๆใฆใๆใใชใใชใฃใฆใใพใใใผใใๅบใฆใใใใใฎใใใชใใผใใซใคใชใใๆใๆใฃใฆใฏใชใใชใใฎใงใใใใๆๅใใใ
ไปฅไธใๅฎ่ฃ ใใใจใใใชๆใใซใชใใ ใใใ
def prune(node):
if max(node.s) == 0:
return True
if node.is_first:
for n in node.siblings:
if prune(n):
return True
return False
if not node.is_first:
sib = node.siblings.copy()
for n in sib:
if prune(n):
node.siblings.remove(n)
if len(node.siblings) == 0:
return True
return False
ใใใซrootใ้ฃใใใฆใใๆ็ปใใใจใไปฅไธใฎใใใช็ถๆ
้ท็งปๅณใๅพใใ
ๅใใผใใงใfใๅ ๆ็ชใsใๅพๆ็ชใไธๆฎตใๅ ๆ็ชใฎๆใฎๆฌๆฐใไธๆฎตใๅพๆ็ชใฎๆใฎๆฌๆฐใงใใใไพใใฐ
f
[1,0]
[3,1]
ใฏใๅ ๆ็ชใงใๅ ๆใๆไธๆฌใใใ็ๆนใฎๆใฏๆญปไบกใๅพๆ็ชใฏ3ๆฌใจ1ๆฌใใจใใ็ถๆ ใ่กจใใฆใใใๅ ๆ็ชใใฉใฎใใใชๆใๆใจใใจใใๅพๆ็ชใใใฎๅณใฎใใใซๅฏพๅฟใใใจๅฟ ใๅพๆ็ชๅๅฉใฎใใผใใซๅฐ้ใงใใใใจใใใใใ
ใชใใๅใซใ่ฒ ใใซใคใชใใๆใๆใใชใใใจใใๆน้ใงๆใๅใฃใใฎใงใๅใฆใๆใใใๅ ดๅใงใใใใใใๅ ๆ็ชใๅปถๅฝใใใๆใๆใฃใใใใฆใใใใใพใใใใฏใใใ
ใพใจใ
ใๅฒใใฐใใใจใใๆ้ใณใฎๅบๆฌใซใผใซใใผใธใงใณใซใคใใฆๅพๆใๅฟ ๅใงใใใใจใๅฏ่ฆๅใใฆใฟใใๅๅธฐใงๆจใไฝใฃใฆๅฏ่ฆๅใใใใจใใๅ ดๅใๆๅคใซๆ้ ใชไพใใชใใไพใใฐไธ็ฎไธฆในใฏๅฎ่ฃ ใฏ็ฐกๅใ ใๅฏพ็งฐๆงใง่ฝใจใใฆใ็ธๅฝใช็ถๆ ๆฐใใใใใๅฐใใใชใปใญใใใใใซ็ฝฎใใใใฉใใใใฎๅคๅฎใใใ้ขๅใใใใใๅฒใใฐใใใฏๆๅนๆใฎๅคๅฎใ็ฐกๅใงใใใค็ถๆ ๆฐใใใปใฉๅคใใชใใใใใชใใซ้่ชๆใชใฎใง้ข็ฝใใ
ใชใใmodใซใผใซใๅ่บซใซใผใซใชใฉใๆก็จใใใจๅๆฅๆใๅบ็พใใใใใใใใใไธก่ ๆๅๆใๆใคใจๅ่ฒ ใๆฑบใพใใชใใจๆใใใใ่ฉฆใใซmodใซใผใซ็ใฎ็ถๆ ้ท็งปๅณใๅฏ่ฆๅใใฆใฟใใใใจใฆใไบบ้ใซ็่งฃใงใใใใใชๅณใซใชใใชใใฃใใ
ใใใใใPythonใฎใณใผใใฏnumba.jitใงๆฉใใชใใใจใใใใฎใ ใใใใฎใณใผใใฏ้ใซ้
ใใชใใnumbaใใฉใใใๅฎ่ฃ
ใใใฆใใใ็ฅใใชใใใใใใใ้ขๆฐใใจใซJITใณใณใใคใซใใฆใใใฎใ ใใใใใใจใใ้ใใฆๅผใณๅบใๅๆฐใๅฐใชใ้ขๆฐใใฏ้ซ้ๅใงใใใใใไฝๅบฆใๅผใถ่ปฝใ้ขๆฐใใฏJITใฎๆฉๆตใๅพใใใใ้ใซJITใณใณใใคใซใฎๆ้ใ ใ้
ใใชใใจๆใใใใๅๅธฐใฏๅ
ธๅ็ใชใใชใใฉใๅผใถ่ปฝใ้ขๆฐใใชใฎใงใJITใใใใใจ้
ใใชใฃใใฎใงใฏใใจๆใใ

