当Shriram第一次发布这个练习时,我的解决方案使用了uniq-c型,组成和数字来自标准前奏曲,加上非标准但非常有用的打印
Chez Scheme的功能:
(定义(benford xs)
(每个人)
(λ(x)(打印f“~a~f~%”(汽车x)(/(cdr x)(长度xs)))
(uniq-c=(排序<(地图(合成汽车数字)xs))))
Shriram的评论是“我的单词-那很可爱。”在帖子的后面,Joe Marshall提出了一个Lisp函数来计算数字的第一个数字,对此我说“我的词-那很有趣:”
(defon最左边的数字(n个基数)
(如果(>基数n)
n个
(做*(我下一个基地)
(下一个(*基数)(*i i))
((>下一个n)(最左边的数字(楼层n i)基数)))
这是我对Scheme函数的翻译;制作基础
默认值为10会使函数比原始值稍长:
(定义(第一位数字n.基数)
(让*((b(如果(null?基数)10(汽车基数)))
(b2(*b b))
(let循环((n n)(i b)(k b2))
(条件((<n b)n)
((<n k)
(循环(商n i)b b2))
(其他(循环n k(*i i)))))
Shriram的第二个挑战是从CSV文件中提取第一位数的比例,例如上一页二者的文本文件数据库功能以前的 练习简单点。首先,我们编写一个谓词来保存有用的记录,并丢弃各种标头、“N/a”值和其他无用的记录:
(define(keep?xs)(字符串->数字(list-ref xs 3))
然后我们使用read-csv-记录
,过滤器端口
和地图还原端口
计算第一位数百分比:
>(让*((fds(带输入from文件“mn-lakes.csv”)
(λ()
(地图还原端口
(过滤器端口读取-csv-记录保留?)
(λ(x)
(值
(第一位数(楼层(字符串->数字(list-ref x 3)))
1))
(λ(k v1 v2)(+v1 v1))
<))))
(fds-count(应用+(映射cdr-fds)))
(每个(λ(x))
(打印f“~a~f~%”
(x车)
(/(cdr x)fds计数0.01))
fds))
1 32.05699020480855
2 19.768477292965272
3 12.733748886910062
4 9.082813891362422
5 6.678539626001781
6 6.144256455921639
7 5.253784505788068
8 4.452359750667854
9 3.8290293855743545
在测试期间,我编写了以下awk程序来比较结果:
awk-F,'
$4>0{c[子($4,1,1)]++;t++}
结束{对于(i=1;i<10;i++)打印i,c[i]/t*100}
'mn-lakes.csv
运行该程序产生的结果与Scheme程序不同;Scheme程序计算第一位数字1的一条记录由awk程序计算为第一位数字4。问题是记录
“海鸥,上部”,“尼斯瓦”,422154,54,7.5
简单的awk程序将“Gull,Upper”视为两个字段,而实际上它是一个字段,再次证明很难解析CSV文件。
您可以在以下位置运行程序http://programmingpraxis.codepad.org/7l3dRSAn.
页:1 2 三