Python 2 3, 141-15 = 126
def win(x,y):w([y]*x)
w=lambda b,f=print:not[f(r+1,c+1)for r,p in enumerate(b)for c in range(p)if(r+c)*w(b[:r]+[min(i,c)for i in b[r:]],max)]
การค้นหาขั้นต่ำแบบ Brute-force สำหรับการเคลื่อนไหวที่เป็นไปได้ทุกครั้งเราจะตรวจสอบซ้ำว่าฝ่ายตรงข้ามสามารถชนะได้หลังจากที่เราทำการเคลื่อนที่นั้นหรือไม่ ค่อนข้างอ่อนกอล์ฟ คนอื่นน่าจะทำได้ดีกว่านี้มาก รู้สึกเหมือนเป็นงานของ APL
winเป็นส่วนต่อประสานสาธารณะ wมันต้องใช้เวลาขนาดของบอร์ดแปลงให้เป็นตัวแทนคณะกรรมการและผ่านที่
wเป็นอัลกอริทึม minimax มันต้องใช้สถานะของบอร์ดพยายามย้ายทั้งหมดสร้างรายการที่มีองค์ประกอบที่สอดคล้องกับการเคลื่อนไหวที่ชนะและส่งกลับค่าจริงถ้ารายการว่างเปล่า ด้วยค่าเริ่มต้นการf=printสร้างรายการมีผลข้างเคียงของการพิมพ์การย้ายที่ชนะ ชื่อฟังก์ชั่นที่ใช้ในการทำให้รู้สึกมากขึ้นเมื่อมันกลับรายการของการเคลื่อนไหวที่ชนะ แต่แล้วฉันย้ายไปnotข้างหน้าของรายการเพื่อประหยัดพื้นที่
for r,p in enumerate(b)for c in xrange(p) if(r+c): ซ้ำทุกการเคลื่อนไหวที่เป็นไปได้ 1 1จะถือว่าเป็นการย้ายที่ไม่ถูกกฎหมายทำให้กรณีฐานง่ายขึ้นเล็กน้อย
b[:r]+[min(i,c)for i in b[r:]]: สร้างรัฐของคณะกรรมการหลังจากที่ย้ายที่แสดงโดยพิกัดและrc
w(b[:r]+[min(i,c)for i in b[r:]],max): เรียกคืนเพื่อดูว่าสถานะใหม่เป็นสถานะที่สูญหายหรือไม่ maxเป็นฟังก์ชั่นที่สั้นที่สุดที่ฉันสามารถหาได้ว่าจะรับอาร์กิวเมนต์จำนวนเต็มสองข้อและไม่บ่น
f(r+1,c+1): หากfมีการพิมพ์ให้พิมพ์การย้าย ไม่ว่าfจะเป็นอะไรก็ตามมันจะสร้างมูลค่าเพื่อลดความยาวของรายการ
not [...]: notส่งคืนTrueรายการว่างเปล่าและFalseไม่ว่างเปล่า
รหัส Python 2 ดั้งเดิมที่ไม่สมบูรณ์รวมถึงการบันทึกเพื่อจัดการอินพุตที่ใหญ่กว่ามาก:
def win(x, y):
for row, column in _win(Board([y]*x)):
print row+1, column+1
class MemoDict(dict):
def __init__(self, func):
self.memofunc = func
def __missing__(self, key):
self[key] = retval = self.memofunc(key)
return retval
def memoize(func):
return MemoDict(func).__getitem__
def _normalize(state):
state = tuple(state)
if 0 in state:
state = state[:state.index(0)]
return state
class Board(object):
def __init__(self, state):
self.state = _normalize(state)
def __eq__(self, other):
if not isinstance(other, Board):
return NotImplemented
return self.state == other.state
def __hash__(self):
return hash(self.state)
def after(self, move):
row, column = move
newstate = list(self.state)
for i in xrange(row, len(newstate)):
newstate[i] = min(newstate[i], column)
return Board(newstate)
def moves(self):
for row, pieces in enumerate(self.state):
for column in xrange(pieces):
if (row, column) != (0, 0):
yield row, column
def lost(self):
return self.state == (1,)
@memoize
def _win(board):
return [move for move in board.moves() if not _win(board.after(move))]
การสาธิต:
>>> for i in xrange(7, 11):
... for j in xrange(7, 11):
... print 'Dimensions: {} by {}'.format(i, j)
... win(i, j)
...
Dimensions: 7 by 7
2 2
Dimensions: 7 by 8
3 3
Dimensions: 7 by 9
3 4
Dimensions: 7 by 10
2 3
Dimensions: 8 by 7
3 3
Dimensions: 8 by 8
2 2
Dimensions: 8 by 9
6 7
Dimensions: 8 by 10
4 9
5 6
Dimensions: 9 by 7
4 3
Dimensions: 9 by 8
7 6
Dimensions: 9 by 9
2 2
Dimensions: 9 by 10
7 8
9 5
Dimensions: 10 by 7
3 2
Dimensions: 10 by 8
6 5
9 4
Dimensions: 10 by 9
5 9
8 7
Dimensions: 10 by 10
2 2