- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在研究欧拉计划的第 22 题:
Using names.txt (right click and 'Save Link/Target As...'), a 46K text file containing over five-thousand first names, begin by sorting it into alphabetical order. Then working out the alphabetical value for each name, multiply this value by its alphabetical position in the list to obtain a name score.
For example, when the list is sorted into alphabetical order, COLIN, which is worth 3 + 15 + 12 + 9 + 14 = 53, is the 938th name in the list. So, COLIN would obtain a score of 938 × 53 = 49714.
What is the total of all the name scores in the file?
http://projecteuler.net/problem=22
当我编译下面的代码时,我得到了答案 871196077。正确答案应该是871198282。
import time
def euler_22():
## Creates a sorted list of the names in Py_Euler_22.txt
names = open('Py_Euler_22.txt', 'r')
names = names.read()
names = names.split('","')
names[0] = names[0][1:]
names[-1] = names[-1][:-2]
names = sorted(names)
## Creates a dictionary: letter -> value
value_letters = {}
start = ord("A")
for i in range(0, 26):
value_letters[chr(start+i)] = i+1
result = 0
for i in range(1, len(names)+1):
name = names[i-1]
sum_letters = 0
for letter in name:
sum_letters += value_letters[letter]*i
# = value of the letter multiplied with the name position
result += sum_letters
return resulttstart = time.time() print euler_22() print "Run time: " + str(time.time() - tstart)
我试图找到一个具有类似解决方案的程序,但我只知道 Python,这限制了选项。我用我创建的更简单的文本文件运行了这个程序,我可以在没有程序的情况下得到答案,而且所有这些都有效。我用谷歌搜索了问题的答案,但这也无济于事,因为我找不到遗漏的地方。
我是初学者,所以我非常感谢有关程序和 Python 的任何提示,而不仅仅是那些可以帮助我正确解决问题的提示。
非常感谢!
最佳答案
你不小心弄错了一个名字。
这里 qnames
是你的代码生成的名称的排序列表,sorted_names
是我的:
>>> for a,b in zip(qnames, sorted_names):
... if a != b:
... print a, b
...
ALONS ALONSO
为了好玩:一行 - 嵌套列表理解,avast ye!
print sum ( [ (pos+1) * nv for pos, nv in enumerate([ sum ( [ ord(char) - 64 for char in name ] ) for name in sorted([name.strip('"') for name in open('names.txt','r').readline().split(",")]) ]) ] )
或者更易读:
print sum (
[(pos+1) * nv for pos, nv in
enumerate([ sum ([ ord(char) - 64 for char in name ] ) for name in
sorted([name.strip('"') for name in
open('names.txt','r').readline().split(",")]) ]) ] )
黑魔法是 ASCII A
是整数 65
,ASCII B
是整数 66
,等等on - 所以 ord(char) - 64
为您提供 char
的“字母值”。
编辑 2:
为了您的娱乐,我将完整的、人类可读的解决方案塞进了一行。
with open('names.txt','r') as f:
data = f.readline();
names = [name.strip('"') for name in data.split(",")]
sorted_names = sorted(names)
name_values = [ sum ( [ ord(char) - 64 for char in name ] ) for name in sorted_names ]
name_position_values = [ (pos+1) * nv for pos, nv in enumerate(name_values) ]
total_sum = sum(name_position_values)
# debug output
from pprint import pprint
#position, word value, position * word value, word
pprint(zip(xrange(1,len(names)+1),name_values,name_position_values,sorted_names))
请注意大量使用列表理解 [x for x in list_of_xes]
而不是循环,以及 sum()
函数而不是 for x in xes : 总和 += x
。
这里还有一些其他技巧,但带回家的教训是列表理解和处理列表的函数可以使您的代码更简单、更易于阅读。
编辑 3:
pprint.pprint()
函数是一个“漂亮的print()
”。它非常适合调试。
编辑 4:
代码高尔夫版本(142 个字符):
print sum([(p+1)*v for p,v in enumerate([sum(map(ord,n))-64*len(n) for n in sorted([n[1:-1] for n in open('names.txt').read().split(",")])])])
关于python - Project Euler #22 Python,缺少 2205 个点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10493702/
我正在尝试将欧拉旋转顺序从现有的 xyz 转换为 zxy。谁能帮我做这件事?谢谢。 编辑:我发现这篇非常有用的文章,认为它可以帮助其他人在同一条道路上 - http://knol.google.com
考虑修改后的欧拉问题 #4——“找出最大回文数,它是 100 到 9999 之间的两个数字的乘积。” rev :: Int -> Int rev x = rev' x 0 rev' :: Int ->
例如,我如何在 R 中输入值 e^2? 最佳答案 R 表达式 exp(1) 代表e,并且 exp(2) 代表e^2。 这是有效的,因为 exp 是以 e 为底的求幂函数。 关于R编程: How do
我正在尝试了解 Euler Tour 算法以及为什么它在树遍历中很受欢迎。但是,我看不出 Euler Tour 和树的预序遍历之间的区别。 假设你有一棵树: A / \ B
我一直在尝试对 Euler #22 问题中的这些名称进行排序。我尝试了很多方法来交换字符串。我每次都有问题。有些是随机的符号;有些是随机的。在其他情况下,我在交换时出现了溢出(?)的名字(就像在尝试交
我想为游戏创建一些 physx,我从小例子开始了解它是如何工作的。在此期间我遇到了一些问题,但我在 90% 内解决了它们。 为了创建我的示例,我研究了一些其他示例并创建了我使用的示例:codeflow
/* The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 60
我正在研究 Problem 8 of Project Euler我必须从给定的 1000 位数字中找到 13 个连续数字的最大乘积。我将该数字存储在一个文本文件中,然后将其输入到我的源代码中。我的代码
我目前正在尝试解决二体问题,然后我可以升级到更多行星,但它不起作用。它正在输出我不可能的位置。有谁知道是什么原因造成的? 这是我使用的代码: day = 60*60*24 # Constants G
我最近一直在研究毕达哥拉斯三元组和 Euler Bricks并且想知道生成所有这些的最佳方法是什么。 我从更广泛的阅读中知道有 10 个 c n: break
在我当前的 Project Euler problem 5 ,我有一个“有效”的解决方案。它适用于较小的数字(问题中的示例),但不适用于实际问题,因为我在强行使用它,并且程序没有完成。 问题的解释如下
基于标准定义,Eulerian Path是图中的一条路径,它恰好访问每条边一次。 现在,我试图在有向图中找到欧拉路径。我知道欧拉电路的算法。如果一个图有欧拉回路,它就有欧拉路径,这似乎是微不足道的。
我正在研究项目欧拉程序是为了“启蒙”,而不仅仅是解决它们。我已经在 80x80 矩阵上使用动态程序解决了问题 81,但是当我尝试使用统一成本搜索解决它时,我的程序消失在永无止境。我只想知道使用统一成本
我有一个关于 Project Euler 问题和使用循环展开优化的问题。 问题描述:2520是能被1到10的每一个数整除而没有余数的最小数。能被 1 到 20 的所有数字整除的最小正数是多少? 解决方
我正在使用以下行旋转 SCNNode: let rotate = SCNAction.rotateByAngle(CGFloat(M_PI), aroundAxis:SCNVector3Make(0
我想获得更精确的 1/7,但它被截断了。如何在转换有理数时获得更好的精度? >>> str(1.0/7)[:50] '0.142857142857' 最佳答案 Python 有一个用于任意精度计算的内
我正在处理项目 euler 中的问题 401,我在 python 中编写了我的解决方案,但它需要几天时间才能运行,显然我需要加快速度或使用不同的方法。我在 Haskell 中遇到了一个看起来与我的 p
我正在处理 Project Euler 的第四个问题并且遇到了 stackoverflow 异常。我不是在寻求解决问题的帮助,我只是想解释为什么我会收到 stackoverflow 异常。这通常是因为
我已经做了几天 Euler 项目,我不得不承认它很有趣。但是,如果有一些更专注于计算机科学而不是数学的东西,那就太好了。这样的事情对于练习算法和数据结构会很有趣,例如在准备编码面试时。 最佳答案 您可
13195 的质因数是 5、7、13 和 29。 数字 600851475143 的最大质因数是多少? 我自己在Project Euler上解决了这个问题,很慢,后来在某人的github账号上找到了这
我是一名优秀的程序员,十分优秀!