鱼C论坛

 找回密码
 立即注册
查看: 4751|回复: 28

[技术交流] 小练习:20160613 文件中所有名字的得分之和是多少?

[复制链接]
发表于 2016-6-12 20:09:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 2016-6-20 10:26 编辑

从现在开始我们要开展一批欧拉计划的习题练习。
其实在我们论坛中已有欧拉计划的板块,可能有些鱼油还没注意到。
什么是欧拉计划:http://bbs.fishc.com/thread-60405-1-1.html
我们欧拉板块现已给出了81道题,这批练习将从欧拉计划中选题。其实用python语言完成有很多的优势,可以更简洁更方便的实现。
如果大家有兴趣也可浏览欧拉的英文网站:https://projecteuler.net/archives
这里已经有了500余题,并且你每做对一题,就可以下载到参考答案的pdf文件,看看你的实现方法与参考答案有什么不同,以利于迅速提高自己的水平。


                               
登录/注册后可看大图

好了言归正传,我们开始做小练习。




题目要求:
以python语言完成,如果是python2请注明。
程序以代码文字格式发帖。
题目比较简单,注重程序效率和创意。
答题在一周内完成,即6.20 10:00之前,其后将公开大家的答案,并评比成绩。

另程序和答案可以在网上搜到,希望大家独立完成。


题目:

文件 names.txt(见附件) 是一个 46K 大小的文本文件,包含 5000 多个英文名字。利用这个文件,首先将文件中的
名字按照字母排序,然后计算每个名字的字母值,最后将字母值与这个名字在名字列表中的位置相乘,得到这个名字的得分。

例如将名字列表按照字母排序后, COLIN 这个名字是列表中的第 938 个,它的字母值是 3 + 15 + 12 + 9 + 14 = 53。

所以 COLIN 这个名字的得分就是 938 × 53 = 49714.

文件中所有名字的得分总和是多少?

奖励:
对所有完成程序并得出正确答案的将给予加分奖励,优秀的将额外加分。
在完成一批题目后,将根据每期的完成情况总评评出最佳,会有神秘大奖。

names.txt

45.36 KB, 下载次数: 45

评分

参与人数 2荣誉 +10 鱼币 +10 贡献 +8 收起 理由
~风介~ + 5 + 5 + 5 感谢楼主无私奉献!
bacon6581 + 5 + 5 + 3 字母表排序:A->1,Z->26。不是ascii码.

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-6-13 08:57:59 | 显示全部楼层
  1. div=ord('A')-1
  2. with open('names.txt','r') as f:
  3.       exec("a=[%s]"%f.read())

  4. def calcu(string):
  5.       global ind
  6.       ind+=1
  7.       return ind*sum(map(lambda x:ord(x)-div,string))
  8. ind=0
  9. su=sum(map(calcu,a))
复制代码


su=850081394
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 10:21:43 | 显示全部楼层
  1. # 读取文件数据
  2. import re
  3. f = open('names.txt', 'r')
  4. allname = f.readlines()
  5. names = re.findall(r'\w+', allname[0])

  6. # 对name进行排序
  7. names = sorted(names)

  8. # 计算分数
  9. score = 0
  10. for i in range(0, len(names)):
  11.     name = names[i]
  12.     result = 0
  13.     for a in list(name): result = result + ord(a) - 64
  14.     score = score + (i+1)*result
  15.    
  16. print('得分总和为:' + str(score))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 10:57:18 | 显示全部楼层
  1. #-*- coding: UTF-8 -*-
  2. import time
  3. start= time.clock()

  4. dict_char={}#存放字母与对应的数值
  5. char_num='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
  6. i=1
  7. for each in char_num:
  8.     dict_char[each]=i
  9.     i=i+1

  10. with open('names.txt','r') as f:
  11.     list_1=((f.read().replace('"',"")).split(','))
  12. list_1.sort()

  13. all_sum=0#所有总和初始化为0
  14. for each in list_1:
  15.     char_num_sum=0#姓名字母值初始为为0
  16.     for eachone in each:
  17.         char_num_sum=char_num_sum+dict_char[eachone]
  18.     all_sum=all_sum+char_num_sum*(list_1.index(each)+1)
  19. print (all_sum)

  20. end = time.clock()
  21. print ("read: %f s" % (end - start))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 12:26:34 | 显示全部楼层
本帖最后由 bacon6581 于 2016-6-13 12:27 编辑
  1. from time import time
  2. start=time()

  3. file_txt=open('names.txt')
  4. txt=file_txt.read()
  5. list_txt=txt.split('","')

  6. list_txt[0]=list_txt[0][1:]
  7. list_txt[-1]=list_txt[-1][0:-1]

  8. list_txt_sorted=sorted(list_txt)

  9. result=0
  10. n=0
  11. for i in list_txt_sorted:
  12.     n+=1
  13.     num=0
  14.     for j in i:
  15.         num+=ord(j)-64
  16.     result+=n*num
  17.         
  18. print(result)
  19. print(time()-start)
复制代码


QQ截图20160613122726.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 13:03:19 | 显示全部楼层
本帖最后由 holdme 于 2016-6-13 13:35 编辑
  1. import time
  2. from string import ascii_uppercase

  3. start = time.time()

  4. fname = r'C:\names.txt'

  5. with open(fname,'r') as f:
  6.     data = f.read().split(',')
  7.     data.sort()

  8. def score(name):
  9.     return sum(ascii_uppercase.index(char) + 1 for char in name.strip('"'))

  10. total_score = sum(i*score(name) for i, name in enumerate(data, 1))

  11. print('所有名字的得分总和是:%s'%str(total_score))
  12. print('用时%s秒'%str(time.time()-start))
复制代码


结果是:
  1. 所有名字的得分总和是:871198282
  2. 用时0.019999980926513672秒
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 14:39:15 | 显示全部楼层
本帖最后由 凯布里克恩 于 2016-6-13 14:46 编辑
  1. import time as t
  2. start = t.perf_counter()
  3. def sort():
  4.             letterlist = []
  5.             sum2 = 0
  6.             f = open('names.txt')
  7.             for eachline in f:
  8.                         content = eachline.split(sep = ',')
  9.             length = len(content)
  10.             for i in range(length):
  11.                         letterlist.append(content[i].strip('"'))
  12.             letterlist.sort()
  13.             for i in range(length):
  14.                         sum2 += (i + 1) * getascii(letterlist[i])
  15.             return sum2

  16. def getascii(word):
  17.             alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
  18.             sum1 = 0
  19.             length = len(alphabet)
  20.             for i in range(length):
  21.                         for each in word:
  22.                                     if alphabet[i] == each:
  23.                                                 sum1 += (i+1)
  24.             return sum1
  25.                         
  26.             
  27. print(sort())

  28. end = t.perf_counter()
  29. print('Running Time is %s 秒' %(end - start))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 16:04:24 | 显示全部楼层
871198282
  1. f=open(r'd:\names.txt','r')
  2. line=f.read()
  3. list1=line.split(',')
  4. list2=[]
  5. for each in list1:
  6.     length=len(each)
  7.     each=each[1:length-1]
  8.     list2.append(each)
  9. list2.sort()
  10. length=len(list2)
  11. dic1={'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7,'H':8,'I':9,'J':10,'K':11,'L':12,'M':13,'N':14,'O':15,'P':16,'Q':17,'R':18,'S':19,'T':20,'U':21,'V':22,'W':23,'X':24,'Y':25,'Z':26}
  12. count=0
  13. for each in list2:
  14.     temp=list2.index(each)+1
  15.     score=0
  16.     for each1 in each:
  17.         score+=dic1[each1]
  18.         
  19.     count+=temp*score
  20. print(count)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 17:24:36 | 显示全部楼层
  1. print(sum(map(lambda name:sum(map(lambda x:ord(x) - 64, name[1])) * name[0], enumerate(sorted(open('names.txt').read().replace('"', '').split(',')),1))))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 20:31:45 | 显示全部楼层
  1. # names.txt位于F盘根目录下,求得结果为871198282
  2. with open('F:/names.txt') as f:
  3.     data = f.read()
  4. names = data.replace('"','').split(',')

  5. names.sort()
  6. n = 0
  7. for i in range(len(names)):
  8.     m = 0
  9.     for j in range(len(names[i])):
  10.         m += (ord(names[i][j])-64)
  11.     m *= (i+1)
  12.     n += m
  13. print(n)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 21:22:00 | 显示全部楼层
  1. def scores(string):
  2.     score=0
  3.     for i in string:
  4.         t=ord(i)-64
  5.         if 0<t<27:
  6.             score+=t
  7.     return score
  8.         
  9. with open('names.txt','r') as file:
  10.     f=file.read()
  11.     name_list=f.split (',')
  12.     name_list.sort ()
  13.     score_list=[scores(x) for x in name_list]
  14.     data=sum( (x+1)*score_list[x] for x  in range(len(score_list)))
  15.     print('文件中所有名字的得分总和是:%d' % data)

复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 22:41:05 | 显示全部楼层
python2.7
  1. num = 1
  2. ssum = 0
  3. lsum = 0
  4. f = open('names.txt')
  5. word = f.read()
  6. for acha in word:
  7.     if acha == ',':
  8.         num += 1
  9.         lsum += ssum * num
  10.         ssum = 0
  11.     elif acha.isalpha():
  12.         ssum += (ord(acha) - ord('A') + 1)
  13. print lsum
  14. f.close()
  15.             
复制代码

答案是850013466
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-14 11:57:38 | 显示全部楼层
程序代码:
  1. import time
  2. t1 = time.time()

  3. with open('E:\\names.txt', 'r') as f:
  4.     content = f.read()
  5.     data = content.split('","')
  6.     data[0] = data[0][1:]
  7.     data[-1] = data[-1][:-1]

  8. result = 0   
  9. for item in range(1, len(data)+1):
  10.     temp = 0
  11.     for i in data[item-1]:
  12.         temp += ord(i) - 64
  13.     temp = temp * item
  14.     result += temp

  15. t2 = time.time()   
  16. print('所有名字的总得分是:', result)
  17. print('时间是:', (t2-t1))
复制代码


结果是:
  1. 所有名字的总得分是: 850081394
  2. 时间是: 0.014008045196533203
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-14 12:14:59 | 显示全部楼层
  1. #python3.4
  2. print(sum([('ABCDEFGHIJKLMNOPQRSTUVWXYZ'.index(k)+1) * (i + 1) for i, j in enumerate(sorted(open('names.txt').read()[1:-1].split('","'))) for k in j]))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-14 16:17:57 | 显示全部楼层
本帖最后由 shichaoufo 于 2016-6-14 19:39 编辑

算出来871198282
  1. import re
  2. score = 0

  3. f = open("names.txt")

  4. a = f.read()

  5. b = re.findall(r'\w+',a)
  6. b.sort()

  7. def defen(n):
  8.     fenshu = 0
  9.     for i in n:
  10.         fenshu += (ord(i)-65+1)
  11.     return fenshu

  12. for i in b:
  13.     score += (defen(i)*(b.index(i)+1))

  14. print("总分为%d" % score)

复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-14 19:42:32 | 显示全部楼层
用的是2.7版

  1. # coding:utf-8

  2. import re
  3. import string

  4. file = open('names.txt','r')
  5. text = file.read()
  6. file.close()
  7. re_name = r'''"(.*?)"'''
  8. names = re.findall(re_name, text)
  9. new_names = sorted(names)
  10. print new_names

  11. str = string.ascii_uppercase

  12. sum = 0
  13. for name in new_names:
  14.         name_num = new_names.index(name) + 1
  15.         sum_ch = 0
  16.         for ch in name:
  17.                 ch_num = str.index(ch) + 1
  18.                 sum_ch += ch_num
  19.         product = name_num * sum_ch
  20.         sum += product
  21. print sum

复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-14 21:00:52 | 显示全部楼层
本帖最后由 wangzhenas 于 2016-6-14 21:05 编辑

一行搞定啊哈哈!
  1. print(sum([(index+1)*sum([ord(c)-64 for c in item]) for index,item in enumerate(sorted([name[1:-1] for name in open('names.txt','r').read().split(',')]))]))
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-15 08:58:55 | 显示全部楼层
import time

start = time.time()

def f(n):
    value={'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7,'H':8,'I':9,'J':10,'K':11,'L':12,'M':13,'N':14,'O':15,'P':16,'Q':17,'R':18,'S':19,'T':20,'U':21,'V':22,'W':23,'X':24,'Y':25,'Z':26,}
    s=sum(value[i] for i in n)
    return s

import re
name=open('d:\\names.txt').read().replace('"','')
alist = [re.split('',el) for el in re.split(',',name)]
alist.sort()

L=[]
for i in range(0,len(alist)):
    L.append((i+1)*f(list(alist[i][0])))

print('所有名字的得分之和%s'%sum(L))
print('用时%s秒'%(time.time()-start))

#
所有名字的得分之和871198282
用时0.10599803924560547秒
#本来想自己排序的,想不出来,一直提示错误,此活动不错,边学边实践,
#上面的方法大部分抄写的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-15 10:22:17 | 显示全部楼层
import time

start = time.time()

#def f(n):
#    value={'A':1,'B':2,'C':3,'D':4,'E':5,'F':6,'G':7,'H':8,'I':9,'J':10,'K':11,'L':12,'M':13,'N':14,'O':15,'P':16,'Q':17,'R':18,'S':19,'T':20,'U':21,'V':22,'W':23,'X':24,'Y':25,'Z':26,}
#    s=sum(value[i] for i in n)
#    return s
def f(s):
    summ=0
    for i in s:
        summ+=ord(i)-64
    return summ

import re
name=open('d:\\names.txt').read().replace('"','')
alist = [re.split('',el) for el in re.split(',',name)]
alist.sort()

L=[]
for i in range(0,len(alist)):
    L.append((i+1)*f(list(alist[i][0])))

print('所有名字的得分之和%s'%sum(L))
print('用时%s秒'%(time.time()-start))

这种方法好像比上面函数的速度快一点

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-15 21:38:30 | 显示全部楼层
  1. f = open('names.txt', 'r')

  2. content = f.readline().split('","')

  3. length = len(content)
  4. content[0] = content[0].strip('"')
  5. content[length-1] = content[length-1].strip('"')

  6. content.sort()

  7. score = 0
  8. scores = 0

  9. for i in range(0, length):
  10.     for each in content[i]:
  11.         score += ord(each) - 64
  12.     scores += (i+1) * score

  13. print(scores)

  14. f.close()
复制代码


2797578463454
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-21 19:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表