ProjectEuler - 错误的答案,功能按预期运行

时间:2015-12-11 23:02:19

标签: python

我相信你们都会得到很多这些问题,但我只是需要更多的眼睛,因为我找不到问题。我问两个回答的人:

  • 我的代码有什么问题导致我得到错误的答案?
  • 您是如何在世界找到问题的?

Project Euler #22概述的目标是:

  

使用names.txt(右键单击并将“保存链接/目标为...”),一个46K文本   包含超过五千个名字的文件,首先对其进行排序   按字母顺序排列。然后计算出字母值   每个名称,将该值乘以其中的字母位置   列表以获得名称分数。

     

例如,当列表按字母顺序排序时,COLIN,   值得3 + 15 + 12 + 9 + 14 = 53,是第938名   名单。因此,COLIN将获得938×53 = 49714的分数。

     

文件中所有名称分数的总和是多少?

他们给你的名字列表是这种格式:

"MARY","PATRICIA","LINDA","BARBARA","ELIZABETH","JENNIFER","MARIA","SUSAN","MARGARET","DOROTHY","LISA","NANCY"

以下是代码:

import datetime, string, pprint

def get_rawdata():
    # Use data = getRawData()
    with open('e22-data') as f:  #e22-data is the list of names
        rawdata = [line.strip('"').split('","') for line in f]
        return rawdata

def alphabetize(data):
    data[0].sort()

    return data

def score_letters(data):
    scores = []
    for n in data[0]:
        score = 0
        for l in n:
            score += alpha.index(l)+1
        scores.append(score)
    return scores

def score_placement(scores):
    products = []
    for n in scores:
        products.append(n*(scores.index(n)+1))
    return products


alpha = string.ascii_uppercase

data = get_rawdata()
data = alphabetize(data)
pprint.pprint(data)
scores = score_letters(data)
products = score_placement(scores)

answer = sum(products)
print(answer)

1 个答案:

答案 0 :(得分:3)

您的代码基本上是正确的,但score_placement()有一个微妙的错误。你的代码:

def score_placement(scores):
    products = []
    for n in scores:
        products.append(n*(scores.index(n)+1))
    return products

这会查看每个单独的分数值(以49,35,19,......开头),尝试查找第一个出现值的索引(使用list.index()) ,并执行乘法。

这种方法的问题在于它假设每个分数都是唯一的。如果在列表的后面出现另一个49分,它将使用找到的前49个的索引(在基于1的系统中为1)。

因此,您需要同时查看每个分数和每个索引,而不是试图以迂回方式查找索引。这种改变的算法既正确又节省时间( O n )与 O n < SUP> 2 ))。以下是score_placement()可以正确编写的一种方法:

def score_placement(scores):
    products = []
    for i in range(len(scores)):
        products.append((i+1)*scores[i])
    return products

通过这个小小的改动,整个程序运行以产生正确的答案!

注意:

  • 也可以使用enumerate()
  • 实现此逻辑
  • 您询问我是如何完成调试过程的。我之前有solved这个Project Euler问题,所以我熟悉它是如何工作的。我查看了代码底部的5个主要数据处理语句,打印出了一些值,并将这些数字与我的直觉告诉我应答的数字进行了比较。我发现了一些可疑的行为,所以我回到你的score_placement()函数,读取代码,发现逻辑错误。最后,我实施了一个建议的修复程序并运行它以验证它是否有效。