【发布时间】:2014-07-01 05:45:14
【问题描述】:
作为我学习 Python 之旅的一部分,我正在实现 Bulls and Cows。
我有一个使用列表理解的工作实现,但我认为使用生成器和reduce()-ing 最终结果可能是一个很好的解决方案。
所以我有我的发电机:
def bullsandcows(given, number):
for i in range(given.__len__()):
if given[i] == number[i]:
yield (given[i], None)
elif given[i] in number:
yield (None, given[i])
还有我的 reduce 实现:
(bulls, cows) = reduce(\
lambda (bull, cow), (b, c): \
(bull + 1, cow + 1), bullsandcows(given, number), (0, 0))
其中given 是用户输入,number 是随机生成的数字供用户猜测。
如您所见,这并不完全是一个有效的实现,它只会返回 yielded 元组的计数。
我需要替换(bull + 1, cow + 1),我不知道如何构造它。
-
number是一个随机生成的数字,比如:1234 -
given是用户输入的,比如:8241 -
bullsandcows(given, number)的结果将是:[('2', None), (None, '4'), (None, '1'] -
reduce的结果应该是:(1, 2),这是第一个元素的所有非None值的计数和第二个元素的所有非None值的计数
【问题讨论】:
-
当
len(given)更清晰时不要使用.__len__(),当可以使用zip()时不要使用range()。 -
你是对的,解决了这个问题。 似乎忽略
bullsandcows的输出。结果始终是一个包含生成器结果数量的二元素元组 -
您忽略了 lambda 中的
(b, c)元组。 -
没错,这也是我的问题:)
-
我不清楚输入是什么,你期望什么输出。