拆分

2011年12月30日

今天的练习来自我们的面试问题档案:

给定一个列表,将列表的前半部分作为一个列表返回,而将列表的后半部分作为第二个列表返回。例如,给定输入列表{1234},输出两个列表{122}和{34}。如果输入列表有奇数个项目,中间的项目可以转到其中一个列表,这样输入列表{1 2 3 4 5}可以生成输出列表{1 2}和{3 4 5{或输出列表{1 2 3}和}。

您的任务是编写将列表拆分为两半的函数。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

作弊刽子手

2011年12月27日

我们在Programming Praxis有一个通过举办派对来庆祝里程碑的传统,而派对需要游戏。今天,在我们的第三百次练习中,我们将从一个上一次练习

这个想法很简单。不要在游戏开始时选择一个答案,而是选择一个长度,并列出所有可能的答案。每次玩家猜测一个字母时,从可能的答案列表中删除尽可能少的单词,使其与玩家的猜测一致;大多数时候,另一个身体部位会被添加到绞刑架上。

你的任务是为骗人绞刑游戏写一个裁判。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

科赫雪花

2011年12月23日

现在是圣诞节,这意味着冬天,也意味着下雪(有时,但今年可能不会),所以今天的练习是画科赫的雪花。这个著名的分形是由一个等边三角形构成的,如左上角所示。在每一步中,每一边都会被修改,去掉中间的三分之一,换成另一个等边三角形的两条腿。因此,在右上角,三条腿中的每一条腿都被四条线段取代,这四条线段形成了一个新的形状。继续下去,三角形边缘的分形变得越来越细;最终,三角形的周长是无限的,尽管它的面积是原始三角形面积的8/5。数学上,科赫雪花可以用初始字符串编码为林登迈耶系统F++F++F,正在重写规则F→F-F++F-F和角度60度(在林登迈耶符号中,如果意味着前进,+右转,然后-是左转)。

你的任务是编写一个程序来绘制科赫雪花。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

刽子手

2011年12月20日

在今天的练习中,我们实现了用于猜测单词的经典Unix V7游戏hangman。给玩家一系列空格,每个单词的字母对应一个空格。在每个回合中,玩家猜测一个字母;如果是在单词中,字母的所有出现都会填入相应的空格中,但如果猜测错误,则会在绞刑架上添加另一个身体部位,传统上是头部、躯干、两只胳膊和两只腿,总共六个。玩家通过猜测单词的所有字母获胜,然后刽子手将其身体的所有碎片加在一起。

你的任务是实现绞刑的交互式游戏。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

多数投票

2011年12月16日

在选举中,获胜者必须获得大多数选票。例如,在一组选票{A A A C C B B C C C B C C C}中,得主是C,获得13票中的7票。有些选举没有获胜者;在一组选票{ABCABCA}中,A获得了多数票,但不是多数票,所以没有获胜者。你可以将投票视为一场政治选举,也可以将其视为关键系统中的冗余硬件,其中一个组件的故障不得导致整个系统的故障。

您的任务是编写一个函数来确定投票的获胜者,或指示没有候选人达到多数。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

验证电话号码

2011年12月13日

当我还是个孩子的时候,电话有转盘,而不是按钮,交换机有名字;我祖母参加了Underhill 8交易所。如果你在同一个交换机中呼叫某人,只需拨号码的最后四位即可。长途电话通常需要人工接线员。

现代美国电话号码有十位数,分为三位数区号、三位数交换码和四位数。在区号内,你只需要拨七位数的交换代码和号码(动词没有改变,即使电话不再有拨号盘);否则,您必须拨打完整的十位数,通常带有前缀。

我们今天的练习要求你验证一个电话号码,就像写在输入表格上一样。电话号码可以写为十位数字,也可以在三段之间加上破折号、空格或点,也可以加上区号;区号和段之间的任何空白都是可选的。因此,以下所有号码都是有效的电话号码:1234567890、123-456-7890、123、456.7890、(123)456-7890、(123。以下是无效的电话号码:123-45-6789、123:4567890和123/456-7890。

您的任务是编写一个遵循上述规则的电话号码验证器;您的函数应该返回有效的电话号码或指示输入无效。确保编写正确的测试套件。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

McNugget数字

2011年12月9日

在麦当劳餐厅,麦当劳炸鸡餐有6块、9块或20块大小。如果一个数字可以是订单中购买的McNugget数量之和(在食用之前),那么这个数字就是McNuggert数字。亨利·皮奇奥托设计的上世纪80年代,他和儿子在麦当劳用餐时,在餐巾上解出了这个问题。

您的任务是确定所有不是McNugget数字的数字。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

帕斯卡三角

2011年12月6日

1653年,布莱斯·帕斯卡发表了他的论文三角形算术特征描述他的三角形,计算用于概率研究的二项式系数;尽管系数及其在三角形中的排列在帕斯卡之前就已经知道了,但帕斯卡还是因为这个名字而获得了赞誉。

要计算三角形,请从只包含1的行开始。然后,通过将当前数字上方的两个数字三角形相加来构建后续的每一行,假设前一行的每一端都有一个临时的0。

你的任务是编写一个程序来整洁地显示帕斯卡三角形。完成后,欢迎您阅读运行建议的解决方案,或在下面的评论中发布自己的解决方案或讨论练习。

页:1 2

骑士骑士

2011年12月2日

计算中的一个经典问题是骑士之旅,其中骑士访问棋盘上的每个方块;目标是按顺序列出骑士的动作。有两种类型的巡游:循环巡游(或闭合巡游),其中最后一个方块是骑士从起始方块跳出的地方,以及非循环巡视(或开放巡视),其中最终一个方块不受约束。除了标准的8×8棋盘外,骑士之旅通常针对一般棋盘,如5×5或10×12棋盘。

简单的解决方案是通过回溯:做出任何有效的举动。然后再做一个动作。依此类推,直到你完成整个旅程。如果在任何时候都没有有效的移动,请回溯并选择其他移动。下图显示了一个8乘8的循环巡视示例,电路板下面的列表显示了按访问顺序使用行和列坐标的方块列表:

01 16 51 34 03 18 21 36
50 33 02 17 52 35 04 19
15 64 49 56 45 20 37 22
32 55 44 63 48 53 42 05
61 14 57 54 43 46 23 38
28 31 62 47 58 41 06 09
13 60 29 26 11 08 39 24
30 27 12 59 40 25 10 07

0/0 1/2 0/4 1/6 3/7 5/6 7/7 6/5
5/7 7/6 6/4 7/2 6/0 4/1 2/0 0/1
1/3 0/5 1/7 2/5 0/6 2/7 4/6 6/7
7/5 6/3 7/1 5/0 6/2 7/0 5/1 3/0
1/1 0/3 1/5 0/7 2/6 4/7 6/6 7/4
5/5 3/6 4/4 3/2 2/4 4/5 5/3 3/4
2/2 1/0 0/2 1/4 3/5 4/3 3/1 2/3
4/2 5/4 7/3 6/1 4/0 5/2 3/3 2/1

由于可能的旅行数量非常大,简单的解决方案可能需要很长时间。1823年,H.C.von Warnsdorff提出了以下启发:根据后续移动的数量对有效移动进行排序,首先选择后续移动数量最少的移动(如果出现平局,则随机选择)。在小棋盘上,比如说小于10乘10的棋盘,Warnsdorff的启发式经常会完全消除回溯。

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

页:1 2