Вибачаюсь, вибачаюсь, вибачаюсь (.
В недавній статті щодо штучного інтелекту я зробив маленьку помилку в прогі, яка давала змогу мені вигравати. Бага була в тому що він не навчався на помилка, а лише навчався на перемегах, що було не досить ефективно. Тож тепер можу вам показати скриптик, який майже НЕПЕРЕМОЖНИЙ!
Оце кусок який відповідає за логіку:
class Game(object):
memory = one_game = {}
def __init__(self, sticks_count):
self.sticks_count = sticks_count
for _ in xrange(self.sticks_count+1):
self.memory[_] = {1:1, 2:1, 3:1}
def finish_lose(self):
self.memory[ min(self.one_game) ][self.one_game[ min(self.one_game) ]] -= 1
def one_move(self, stick):
ch = []
for i in self.memory[stick]:
for _ in xrange(self.memory[stick][i]):
ch.append(i)
if not ch:
return 1
self.one_game[stick] = random.choice( ch )
return self.one_game[stick]
А це повний ісходник супер-розумного скриптика:
import random
class Game(object):
memory = one_game = {}
def __init__(self, sticks_count):
self.sticks_count = sticks_count
for _ in xrange(self.sticks_count+1):
self.memory[_] = {1:1, 2:1, 3:1}
def finish_lose(self):
self.memory[ min(self.one_game) ][self.one_game[ min(self.one_game) ]] -= 1
def one_move(self, stick):
ch = []
for i in self.memory[stick]:
for _ in xrange(self.memory[stick][i]):
ch.append(i)
if not ch:
return 1
self.one_game[stick] = random.choice( ch )
return self.one_game[stick]
g = Game(random.randint(15,20))
for _ in xrange(1000):
g.one_game = {}
s = g.sticks_count
while 1:
if s<=3:
break
s -= g.one_move(s)
if s<=3:
g.finish_lose()
break
s -= random.randint(1,3)
for _ in xrange(5):
g.one_game = {}
s = g.sticks_count
while 1:
print ''.join([ '!' for _ in xrange(s)])
if s<=3:
print 'C WIN!!!'
break
s -= g.one_move(s)
print ''.join([ '!' for _ in xrange(s)])
if s<=3:
g.finish_lose()
print 'C LOSE'
break
try:
r_m = int(raw_input('>'))
if (r_m > 3) or (r_m < 1): raise
except: r_m = 1
s -= r_m
