七段式设备

2018年2月27日

我们今天有一个来自乔恩·本特利书中的简单练习编程珠玑,第3章,问题8:

[S.C.Johnson]七段式设备提供十位十进制数字的廉价显示:

-----           -----   -----           -----   -----   -----   -----   -----||||||||||||||     |       |       |       | |     | |       |             | |     | |     ||     |       |       |       | |     | |       |             | |     | |     |-----   -----   -----   -----   -----           -----   -----|     |       | |             |       |       | |     |       | |     |       ||     |       | |             |       |       | |     |       | |     |       ||     |       | |             |       |       | |     |       | |     |       |-----           -----   -----           -----   -----           -----   -----

这七个部分通常编号为:

--2个--||3     4||--1--||5     6||--0--

编写一个程序,用五个七段数字显示一个16位正整数。输出是五个字节的数组;一点字节的j个是一个当且仅当第个数字段j个应打开。

键入这些数字比看起来要难。

你的任务是按照宾利的指示,编写一个程序,用七段数字显示数字。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

我觉得我疯了!

2018年2月23日

最近的演习我写了一个我正在工作中编写的shell脚本。shell脚本的开发仍在继续,我正在处理脚本的各种需求。有一次,我决定使用Awk处理一项任务,我必须在Awk手册中查找一些信息,当我在那里时,我注意到Gawk有一个-米要使用的选项gmp公司对于算法,给了Awk一个更大的集成能力。于是我想到:awk大整数…质数…awk大整型…质数,于是一个项目诞生了。

我决定用Awk编写一个素数生成器,基于上一个练习。不要介意Awk没有提供迭代器,我应该能够理解这一点。我做到了;结果显示在下一页记录在案,它是有效的。但速度慢得可怕;生成少于100万的78498个素数大约需要四秒半的时间,这至少要花费四秒多的时间。我疯了吗?

你的任务是告诉我们你所做的一些疯狂的事情,用一种无法提供你所需要的语言编写程序,要么是因为环境迫使你这么做,要么是你想疯,就像我一样。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

N-Gram频率

2018年2月20日

给定一个字符串和一个n个-克大小n个,准备所有大小组合的频率表n个字符块。例如,使用字符串“Programming Praxis”和n个-克大小为2n个-克是“Pr”、“ro”、“og”、“gr”、“ra”、“am”、“mm”、“mi”、“in”、“ng”、“g”、“P”、“Pr”、“ra”、“ax”、“xi”和“is”;这两个n个-克“Pr”和“ra”出现两次,所有其他的出现一次。

你的任务是编写一个程序来计算频率表n个-克。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

完美电源序列

2018年2月16日

几个月前,我在YouTube上发现了Numberphile频道,并非常喜欢它的数学和编程交叉视频。他们的最近的视频讨论了加泰罗尼亚猜想:

在完美幂1、4、8、9、16、25、32、36、49、64、81、100……的无限序列中,仅有两个相邻的数字是2³=8和3²=9。

正如在Numberphile上讨论的那样,这个猜想最近得到了证明。

你的任务是编写一个生成完美电源序列的程序。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

今天我们有另一个家庭作业问题:

一天中最早的时间是什么时候(使用24小时制时钟),可以用四个给定的数字写入?例如,给定数字1、2、3和4,可以写出14:32和23:14这样的时间,但最早的时间是12:34。您的程序应该报告,数字6、7、8和9不能构成时间。

你的任务是找出一天中最早可以用四位数书写的时间。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

部分列表撤销

2018年2月9日

我们距离新学期的开始还有几周,初学者的留言板上充斥着新学生提出的问题。这个问题引起了我的注意;我想这是一个第二学期的编程学生写的,他在第一学期学了C,现在正在上数据结构课:

编写一个程序,给定一个链表和两个整数索引,将列表中两个索引之间的部分颠倒过来。例如,将索引3(包含)和6(不包含)之间的列表[0,1,2,3,4,5,6,7,8,9]颠倒,就会得到列表[0,12,5,4,3,6,7,8,9]。

你的任务是通过编写程序来反转列表的一部分来帮助学生。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

我之前提到过,我在一所社区学院工作,是在Oracle和Unix上维护企业级数据库系统团队的一员。我目前的任务涉及我们和教育部之间的文件传输程序(他们不使用sftp公司和世界其他地方一样),我用Posix shell语言编写,因为这是唯一既可以从我们的用户界面调用又可以运行教育部所需程序的语言。这不是一个500行以下的大程序,但有很多正在进行。以下是一些例子:

  • 文本文件数据库:教育部向我们发送了一个固定长度的记录文件,以换行符和换行符结尾,其中包含ascii文本,用作保存配置元数据的数据库。我通过选择所需的记录来读取数据库格雷普并使用提取所需字段切割-c.
  • 带文件头/尾:从教育部收到的文件在数据中添加了头和尾行。我用一个预计起飞时间脚本:
    编辑$FILENAME<
  • 算术:在程序开发过程中,有一次我需要做一些算术,没有什么花哨的。这个要求现在已经不存在了,但在我使用公元前要进行运算,请使用shell变量传递输入,并将输出返回到shell变量。我无法抗拒;解决方案页面中编写了一个因子分解程序公元前.
  • Oracle数据库:我使用SQL*Plus在Oracle数据库中插入和查询记录。
  • Shell内置程序:我使用了许多内置的Shell命令。如果测试允许我有条件地执行命令。While期间让我做循环。内容提供商毫伏让我把东西放在它们应该放的地方。Chown公司chmod公司让我控制数据的安全性。阅读让我逐行索引文件。Shell变量让我对代码进行参数化。Shell函数使我能够模块化代码。

我并不是第一个注意到拥有一个统一的数据类型(分隔文件中的ascii文本)和对该数据类型进行操作的各种程序构成了一个非常有用的系统环境的人。

您的任务是告诉我们您使用unix命令行实用程序和shell脚本的情况;希望其他读者能从你所做的有趣的事情中得到启发。完成后,欢迎您阅读建议的解决方案,或在下面的评论中讨论练习。

页:1 2

折叠

2018年2月2日

用函数编程的说法,折叠是一种将列表转换为其他类型值的方法;fold将函数成对应用于列表和累加器的每个元素,然后在列表耗尽时返回累加器。基本折叠是文件夹:

foldr f a[x1,x2,…,xn]=f x1(f x2(…(f xn a)…))

在这里,(f)是一个有两个参数的函数,是初始值,并且[x1,x2,…,xn]是输入列表。姓名文件夹代表“向右折叠”,因为括号堆叠在展开式的右侧,列表中的项从右到左进行处理,累加器位于二进制函数的右侧。折叠类似:

foldl f a[x1,x2,…,xn]=(…((f a x1)x2)。。。xn)

参数具有相同的含义,“向左折叠”是指括号堆叠在左侧,列表中的项从左到右进行处理,累加器位于二进制函数的左侧。注意foldl和foldr有不同的类型,因为二进制函数的参数顺序相反。在某些情况下,这会有所不同;例如,当(f)欺骗,您必须使用文件夹。但是当函数是关联的时,例如+,您可以使用其中之一折叠文件夹。以下是一些示例:

foldr+0[1,2,3,4]→10折叠+0[1,2,3,4]→10折叠图标[][1,2,4]→[1,2,4]foldl cons[][1,2,3,4]→[[[[][],1],2],3],4]foldr plusone 0[1,2,3,4]→4折叠snoc[][1,2,3,4]→[4,3,2,1]

有时没有明显的起始值。例如,如果您想查找列表中的最大项,则没有“保证小于任何其他值”可用于。在这种情况下,您可以使用文件夹1文件夹1将列表中的第一项作为初始值的变量。在这里,最大值是一个二进制函数,它接受两个数字并返回较大的数字;它是成对地应用于列表中的每一项(我们忽略了以下事实:最大值可以接受两个以上的参数):

foldr1最大[1,2,3,4]→4折叠1分钟[1,2,3,4]→1

与相关折叠扫描,这适用折叠列表的每个初始段:

扫描f a[x1,x2,…,xn]=[a,f(a,x1),f

例如:

扫描+0[1,2,3,4]→[0,1,3,6,10]扫描snoc[][1,2,3,4]→[[],[1],[2,1],[3,2,1],[4,3,2,2]

您的任务是实现上面显示的所有各种折叠;如果您的语言以本机方式提供了它们,那么您应该从基本原则重新实施它们。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2