我目前正在解决 Project Euler 问题 22,它有以下挑战:
使用 names.txt(右键单击并“将链接/目标另存为...”),一个 46K 的文本文件,其中包含超过 5000 个名字,首先按字母顺序对其进行排序。然后计算每个名称的字母值,将该值乘以其在列表中的字母位置以获得名称分数。
例如,当列表按字母顺序排序时,价值 3 + 15 + 12 + 9 + 14 = 53 的 COLIN 是列表中的第 938 个名称。因此,COLIN 将获得 938 × 53 = 49714 的分数。
文件中所有名称分数的总和是多少?
该文件可以使用上面的链接下载。我写了下面的代码来解决这个问题:
rm(list=ls())
library(splitstackshape)
#read in data from http://projecteuler.net/problem=22
names=sort(t(read.table("names.txt",sep=",")))
#letters to numbers conversion vectors
from=LETTERS[seq(1,26)]
to=as.character(seq(1,26))
#function to replace all letters with corresponding numbers
gsub2 = function(pattern, replacement, x, ...){
for(i in 1:length(pattern))
x = gsub(pattern[i],paste(replacement[i]," ",sep=""), x, ...)
x
}
#create df, run function, create row number var for later calculation
df=data.frame(names=names)
df$name.num = gsub2(from,to,df$names)
df$rownum=seq(1,nrow(df))
#split letter values, add across rows, multiply by row number to get name score and sum
df=concat.split(df,"name.num"," ")
df$name.sum=rowSums(df[,4:15],na.rm=TRUE)
df$name.score=df$name.sum*df$rownum
print(sum(df$name.score,na.rm=TRUE))
我的结果似乎是 158,055(我得到871040227
了它应该在的地方871198282
)。我已经抽查了其中的一部分,并且似乎名称列表已正确排序,并且名称分数正在正确编译(例如,我也得到了COLIN=49174
)。我还阅读了其他在 SO 上解决此问题的线程,但它们主要是在 Python 中,并且问题似乎与我的不同。我的怀疑是names.txt
文件以某种方式没有被正确读取,或者我正在使用(concat.split
从splitstackshape
包中)拆分文件的df$name.num
方法不正确,尽管它似乎工作正常。
有任何想法吗?
此外,任何关于如何改进/简化我的代码的建议都非常受欢迎!