10个问题或更少:猜猜日期(Python)

时间:2017-07-31 03:31:34

标签: python python-3.x

我的任务是编写一个程序来猜测一个用户正在考虑的日期,AI要求10或更少,'是'或'否'的问题。基本上这只是一个反向猜数游戏。我写了一个函数,创建了一年中所有日期的列表,从1月1日到12月31日,基本上是365个条目。

def Calendar(monthNames, numDaysInMonth):
'''Return a list of elements, each element
    is a date in a calendar year'''

    if len(monthNames) != len(numDaysInMonth):
        return []

    dates = []
    idx = 0

    while idx < len(monthNames):
        for date in range(1, numDaysInMonth[idx] + 1):
            dates.append(monthNames[idx] + " " + str(date))
        idx = idx + 1
    return dates
months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
          "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
numDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 
print(Calendar(months, numDays))

显然不需要print语句,但用于检查我的工作。现在,我的问题是,我从哪里开始?由于计算机询问“是”或“否”问题,我希望程序通过将数字除以一半直到“日期”归零为止来缩小范围,然后使用该数字指向我已经创建的功能。我决不是要求为我做这件事,但在正确的方向上一个好的推动会很好。我迷失在下一步该做什么。

2 个答案:

答案 0 :(得分:0)

我可以将它视为二叉树实现..总计是365天根据用户输入是或否除以2

365/2  - step 1 yes or no 
182    -2
91 .   -3
45     -4
22     -5
11     -6
5      -7
2      -8 
1,2 .  - 9, 10

粗略估计,但我想优化算法会有所帮助

答案 1 :(得分:0)

您似乎被要求编写一个应用某种{{3}}的程序。

因为要求您的计算机回答一个Y / N问题,所以让我们定义一个会询问问题的函数,接收答案并返回一个相应的布尔值:

def is_earlier(guess):

    answer = input("is {} earlier then your date? Y - earlier /N - not earlier".format(guess))

    if answer.upper() == "Y":
        return True

    else:
        return False

所以基本上,这段代码每次都会询问用户是否属于早期属性,并会根据用户的反应做出反应。

接下来,让我们使用二进制搜索:每个程序都会询问用户d,它指向的当前日期是否更早。 如果d更早,我们将扔掉#34;列表中的所有内容,然后是d-1(前一天)。 如果d是晚些时候或者确切日期,我们将&#34;扔掉&#34;那些早于d的一切。 当我们只剩下一个值的lst时 - 我们返回这个值 - 这是我们的日期。

def guess_game(lst = Calendar(months,numDays)):

    if len(lst) == 1:
        return lst[0]

    mid = len(lst)//2

    if is_earlier(lst[mid]):
        return guess_game(lst[:mid])
    else:
        return guess_game(lst[mid:])

现在为什么不到10个问题呢?如果我们知道二进制搜索采用粗略的LOG(N)操作(其中N是列表的长度),并且我们知道一年365天就有这种情况,我们将达到8-10个问题,具体取决于用户在列表中选择的日期的位置。