55 lines
1.4 KiB
Python
55 lines
1.4 KiB
Python
from itertools import permutations
|
|
from random import shuffle
|
|
|
|
try:
|
|
raw_input
|
|
except:
|
|
raw_input = input
|
|
try:
|
|
from itertools import izip
|
|
except:
|
|
izip = zip
|
|
|
|
digits = '123456789'
|
|
size = 4
|
|
|
|
def parse_score(score):
|
|
score = score.strip().split(',')
|
|
return tuple(int(s.strip()) for s in score)
|
|
|
|
def scorecalc(guess, chosen):
|
|
bulls = cows = 0
|
|
for g,c in izip(guess, chosen):
|
|
if g == c:
|
|
bulls += 1
|
|
elif g in chosen:
|
|
cows += 1
|
|
return bulls, cows
|
|
|
|
choices = list(permutations(digits, size))
|
|
shuffle(choices)
|
|
answers = []
|
|
scores = []
|
|
|
|
print ("Playing Bulls & Cows with %i unique digits\n" % size)
|
|
|
|
while True:
|
|
ans = choices[0]
|
|
answers.append(ans)
|
|
#print ("(Narrowed to %i possibilities)" % len(choices))
|
|
score = raw_input("Guess %2i is %*s. Answer (Bulls, cows)? "
|
|
% (len(answers), size, ''.join(ans)))
|
|
score = parse_score(score)
|
|
scores.append(score)
|
|
#print("Bulls: %i, Cows: %i" % score)
|
|
found = score == (size, 0)
|
|
if found:
|
|
print ("Ye-haw!")
|
|
break
|
|
choices = [c for c in choices if scorecalc(c, ans) == score]
|
|
if not choices:
|
|
print ("Bad scoring? nothing fits those scores you gave:")
|
|
print (' ' +
|
|
'\n '.join("%s -> %s" % (''.join(an),sc)
|
|
for an,sc in izip(answers, scores)))
|
|
break
|