पायथन 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)]
जानवर बल न्यूनतम खोज। हर संभव कदम के लिए, हम पुनरावर्ती रूप से देखते हैं कि क्या प्रतिद्वंद्वी उस कदम के बाद जीत सकता है। बहुत कमजोर रूप से गोल्फ; किसी और को बेहतर करने में सक्षम होना चाहिए। यह एपीएल के लिए एक नौकरी की तरह लगता है।
winसार्वजनिक इंटरफ़ेस है। यह बोर्ड के आयामों को लेता है, इसे एक बोर्ड प्रतिनिधित्व में परिवर्तित करता है, और इसे पास करता है w।
wन्यूनतम एल्गोरिथ्म है। यह एक बोर्ड राज्य लेता है, सभी चालों की कोशिश करता है, एक सूची बनाता है जिसके तत्व जीत की चाल के अनुरूप होते हैं, और यदि सूची खाली है तो यह सही है। डिफ़ॉल्ट के साथ f=print, सूची के निर्माण में विजेता चालों को प्रिंट करने का एक साइड इफेक्ट होता है। फ़ंक्शन नाम का उपयोग अधिक समझ में आता था जब यह जीतने वाली चालों की सूची लौटाता था, लेकिन फिर मैं notअंतरिक्ष को बचाने के लिए सूची के सामने चला गया ।
for r,p in enumerate(b)for c in xrange(p) if(r+c): सभी संभावित चालों पर Iterate। 1 1आधार मामले को थोड़ा सरल करते हुए कानूनी कदम नहीं माना जाता है।
b[:r]+[min(i,c)for i in b[r:]]: निर्देशांक द्वारा प्रतिनिधित्व किए गए कदम के बाद बोर्ड की स्थिति का निर्माण rऔर c।
w(b[:r]+[min(i,c)for i in b[r:]],max): यह देखने के लिए कि क्या नया राज्य एक हारा हुआ राज्य है। maxसबसे छोटा कार्य है जो मुझे मिल सकता है जो दो पूर्णांक तर्क देगा और शिकायत नहीं करेगा।
f(r+1,c+1): यदि fप्रिंट है, तो मूव प्रिंट करता है। जो fकुछ भी है, यह सूची की लंबाई को पैड करने के लिए एक मूल्य पैदा करता है।
not [...]: खाली सूची के लिए और गैर- रिक्त के लिए notरिटर्न ।TrueFalse
मूल पायथन 2 कोड, पूरी तरह से ungolfed, बहुत बड़े इनपुट को संभालने के लिए संस्मरण सहित:
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