鱼C论坛

 找回密码
 立即注册
查看: 4992|回复: 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 | 显示全部楼层
div=ord('A')-1
with open('names.txt','r') as f:
      exec("a=[%s]"%f.read())

def calcu(string):
      global ind
      ind+=1
      return ind*sum(map(lambda x:ord(x)-div,string))
ind=0
su=sum(map(calcu,a))

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

使用道具 举报

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

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

# 计算分数
score = 0
for i in range(0, len(names)):
    name = names[i]
    result = 0
    for a in list(name): result = result + ord(a) - 64
    score = score + (i+1)*result
    
print('得分总和为:' + str(score))

评分

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

查看全部评分

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

使用道具 举报

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

dict_char={}#存放字母与对应的数值
char_num='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
i=1
for each in char_num:
    dict_char[each]=i
    i=i+1

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

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

end = time.clock()
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 编辑
from time import time
start=time()

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

list_txt[0]=list_txt[0][1:]
list_txt[-1]=list_txt[-1][0:-1]

list_txt_sorted=sorted(list_txt)

result=0
n=0
for i in list_txt_sorted:
    n+=1
    num=0
    for j in i:
        num+=ord(j)-64
    result+=n*num
        
print(result)
print(time()-start)

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

使用道具 举报

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

start = time.time()

fname = r'C:\names.txt'

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

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

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

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

结果是:
所有名字的得分总和是:871198282
用时0.019999980926513672秒

评分

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

查看全部评分

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

使用道具 举报

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

def getascii(word):
            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']
            sum1 = 0
            length = len(alphabet)
            for i in range(length):
                        for each in word:
                                    if alphabet[i] == each:
                                                sum1 += (i+1)
            return sum1
                        
            
print(sort())

end = t.perf_counter()
print('Running Time is %s 秒' %(end - start))

评分

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

查看全部评分

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

使用道具 举报

发表于 2016-6-13 16:04:24 | 显示全部楼层
871198282
f=open(r'd:\names.txt','r')
line=f.read()
list1=line.split(',')
list2=[]
for each in list1:
    length=len(each)
    each=each[1:length-1]
    list2.append(each)
list2.sort()
length=len(list2)
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}
count=0
for each in list2:
    temp=list2.index(each)+1
    score=0
    for each1 in each:
        score+=dic1[each1]
        
    count+=temp*score
print(count)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 17:24:36 | 显示全部楼层
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 | 显示全部楼层
# names.txt位于F盘根目录下,求得结果为871198282
with open('F:/names.txt') as f:
    data = f.read()
names = data.replace('"','').split(',')

names.sort()
n = 0
for i in range(len(names)):
    m = 0
    for j in range(len(names[i])):
        m += (ord(names[i][j])-64)
    m *= (i+1)
    n += m
print(n)

评分

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

查看全部评分

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

发表于 2016-6-13 22:41:05 | 显示全部楼层
python2.7
num = 1
ssum = 0
lsum = 0
f = open('names.txt')
word = f.read()
for acha in word:
    if acha == ',':
        num += 1 
        lsum += ssum * num
        ssum = 0
    elif acha.isalpha():
        ssum += (ord(acha) - ord('A') + 1) 
print lsum
f.close()
             
答案是850013466
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

result = 0    
for item in range(1, len(data)+1):
    temp = 0
    for i in data[item-1]:
        temp += ord(i) - 64
    temp = temp * item
    result += temp

t2 = time.time()    
print('所有名字的总得分是:', result)
print('时间是:', (t2-t1))

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

使用道具 举报

发表于 2016-6-14 12:14:59 | 显示全部楼层
#python3.4
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
import re
score = 0

f = open("names.txt")

a = f.read()

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

def defen(n):
    fenshu = 0
    for i in n:
        fenshu += (ord(i)-65+1)
    return fenshu

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

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

评分

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

查看全部评分

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

使用道具 举报

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

import re
import string

file = open('names.txt','r')
text = file.read()
file.close()
re_name = r'''"(.*?)"'''
names = re.findall(re_name, text)
new_names = sorted(names)
print new_names

str = string.ascii_uppercase

sum = 0
for name in new_names:
        name_num = new_names.index(name) + 1
        sum_ch = 0
        for ch in name:
                ch_num = str.index(ch) + 1
                sum_ch += ch_num
        product = name_num * sum_ch
        sum += product
print sum

评分

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

查看全部评分

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

使用道具 举报

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

一行搞定啊哈哈!
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 | 显示全部楼层
f = open('names.txt', 'r')

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

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

content.sort()

score = 0
scores = 0

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

print(scores)

f.close()


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 05:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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