编程拼图和代码高尔夫

编程益智爱好者和代码高尔夫球手的问答

22
从1到整数…在二进制中计数
介绍: 我记得,当我还是个孩子的时候,我会得到一个计算器并继续按下+按钮,看看我能数多少。现在,我喜欢编程,并且正在为iOS开发。 计数是人类和计算机都要做的一项基本技能。没有它,其余的数学将无法完成。只需从头开始1并重复添加1即可完成。 挑战: 这只是一个简单的挑战。我希望您的程序执行的工作是从打印1到打印的所有Integer内容。但是,由于十进制计数有点无聊,因此我会在其中加点麻烦: 计数不能以10为底,它必须以二进制形式显示计数。 因此,使用32位整数计算为5时,将如下所示: 0000 0000 0000 0000 0000 0000 0000 0001 ..... 1 0000 0000 0000 0000 0000 0000 0000 0010 ..... 2 0000 0000 0000 0000 0000 0000 0000 0011 ..... 3 0000 0000 0000 0000 0000 0000 0000 0100 ..... 4 0000 0000 0000 …
13 code-golf 

3
分析超支洗牌
Rod正在主持两个玩家George和Tim之间的纸牌游戏。目前,蒂姆正在洗牌。Rod怀疑Tim可能在作弊,因此他需要您的帮助来检查改组是否公平。 蒂姆(Tim)正在进行过度的洗牌:他从牌组的底部切出一堆纸牌,然后从牌堆的顶部切至卡牌的顶部,切开各个部分,然后重复该过程几次。 Rod眼神敏锐,可以确切地看到Tim每次切出多少张牌,但是他无法计算和跟踪Tim洗牌的速度。这就是您要进入的地方:Rod希望您编写一个程序或函数来获取详细的改组信息,并确定改组是公平的,微弱的还是技巧性的。 如果改组后,少于25对相邻纸牌保持相邻(以相同顺序),则改组是公平的,游戏可以继续进行。 如果至少有25对(但不是全部)对相邻纸牌保持相邻,则混洗很弱,Rod会在Tim的头上猛击,并要求他再混洗一些。 如果最后所有牌都保持在同一位置,那么蒂姆显然在作弊,罗德将用一条大鳟鱼击打他。 这是代码高尔夫球,所以最短的代码获胜。 输入: 在几行中,您将获得一系列介于0和52之间的数字(均为排他性数字),各行之间用空格隔开,其中每行代表一轮洗牌,其开始和结束时都是将所有牌堆在一起。 在每一行中,第一个数字是Tim从牌组底部切下的纸牌数,随后的每个数字是他从他的手掉到牌组顶部的纸牌数。如果一行中最后一个数字之后还剩下任何纸牌,则应假定Tim将其放在牌组的顶部。 输入保证有效。至少有一行数字,每行至少包含两个数字。每行上的第一个数字不少于同一行上所有其他数字的总和。尾随换行符是可选的,您可以假定输入有一个或没有输入。 输出: 如果随机播放正常,则程序应打印/返回“正常”;如果随机播放较弱,则打印/返回“弱”;如果Tim保持所有卡的顺序相同,则打印/返回“特技”。尾随换行符是可选的。 例: 假设套牌有52张牌,但是出于演示目的,我将使用10张牌的小套牌。 输入: 5 3 1 4 2 2 初始甲板,从顶部观察:0 1 2 3 4 5 6 7 8 9 5➜ 0 1 2 3 4(5 6 7 8 9手) 3➜ 5 6 7 0 1 2 3 …

7
高精度金属器件
背景 对于每个自然数(正整数),都定义了以著名的黄金均值开头的金属均值,并且每个均值是一个无理常数(其具有无限的非重复小数位数)。 对于自然数,金属平均值是二次方程的根 根源永远 但是金属平均值通常作为正数根。因此,对于此问题,它将定义为: 对于结果就是著名的黄金比例: 挑战 您的代码应采用2个输入:n和p (顺序一致并不重要) n是一个自然数,表示哪个金属均值 p是一个自然数,表示精度的小数位数 您的代码应将第n个金属平均值输出到p个小数位精度。 有效期 如果您的代码适用于从1到65,535的n和p值,则该代码有效。 您必须以以下形式输出小数 digit.s(不带空格) 例如,小数点后9位的黄金均值为 1.618033988 显示最后一位而不四舍五入,因为它将以较长的十进制扩展形式出现。黄金平均值的下一个数字是7,但是示例中的最后8个数字不应四舍五入为9。 十进制数字的数量必须为p,这意味着还必须包含任何结尾的零。 形式的答案 无效-您必须使用十进制扩展名。 您最多可以输出1个换行符和1个尾随换行符。除数字和单点/句号/句点外,您不得输出任何空格或其他任何字符。 得分了 这是标准代码高尔夫:您的得分是代码中的字节数。 排行榜 (使用Martin的页首横幅代码段) 显示代码段 var QUESTION_ID=52493;function answersUrl(e){return"http://api.stackexchange.com/2.2/questions/"+QUESTION_ID+"/answers?page="+e+"&pagesize=100&order=desc&sort=creation&site=codegolf&filter="+ANSWER_FILTER}function getAnswers(){jQuery.ajax({url:answersUrl(page++),method:"get",dataType:"jsonp",crossDomain:!0,success:function(e){answers.push.apply(answers,e.items),e.has_more?getAnswers():process()}})}function shouldHaveHeading(e){var a=!1,r=e.body_markdown.split("\n");try{a|=/^#/.test(e.body_markdown),a|=["-","="].indexOf(r[1][0])>-1,a&=LANGUAGE_REG.test(e.body_markdown)}catch(n){}return a}function shouldHaveScore(e){var a=!1;try{a|=SIZE_REG.test(e.body_markdown.split("\n")[0])}catch(r){}return a}function getAuthorName(e){return e.owner.display_name}function process(){answers=answers.filter(shouldHaveScore).filter(shouldHaveHeading),answers.sort(function(e,a){var r=+(e.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0],n=+(a.body_markdown.split("\n")[0].match(SIZE_REG)||[1/0])[0];return r-n});var e={},a=1,r=null,n=1;answers.forEach(function(s){var t=s.body_markdown.split("\n")[0],o=jQuery("#answer-template").html(),l=(t.match(NUMBER_REG)[0],(t.match(SIZE_REG)||[0])[0]),c=t.match(LANGUAGE_REG)[1],i=getAuthorName(s);l!=r&&(n=a),r=l,++a,o=o.replace("{{PLACE}}",n+".").replace("{{NAME}}",i).replace("{{LANGUAGE}}",c).replace("{{SIZE}}",l).replace("{{LINK}}",s.share_link),o=jQuery(o),jQuery("#answers").append(o),e[c]=e[c]||{lang:c,user:i,size:l,link:s.share_link}});var s=[];for(var t in e)e.hasOwnProperty(t)&&s.push(e[t]);s.sort(function(e,a){return e.lang>a.lang?1:e.lang<a.lang?-1:0});for(var …
13 code-golf 

4
很奇怪的单词计数器
输入:通过功能参数,命令行参数,STDIN或类似参数仅由小写字母组成的任何字符串。 输出:根据以下度量标准,打印或返回一个数字,该数字将代表字母的距离之和: 您取第一个和第二个字母并计算它们之间的距离。该距离由QWERTY键盘布局定义,同一行中的每个相邻字母之间的距离为1,同一列中的每个相邻字母之间的距离为2。要测量不相邻字母之间的距离,请采用最短路径两者之间。 例子: q->w is 1 distance apart q->e is 2 distance q->a is 2 distance q->s is 3 distance (q->a->s or q->w->s) q->m is 10 distance 然后,您输入第二个和第三个字母,然后输入第三个和第四个字母,依此类推,直到到达输入的末尾。输出是所有这些距离的总和。 输入和输出示例: INPUT: qwer OUTPUT: 3 INPUT: qsx OUTPUT: 5 INPUT: qmq OUTPUT: 20 INPUT: tttt OUTPUT: 0 这是显示哪些字母在同一列中的图像: 这是代码高尔夫,所以最短的代码以字节为单位获胜!

1
mtDNA突变树
背景: MtDNA是人类DNA的一部分,是从母亲传给孩子的,很少发生突变。由于这对所有人类都是如此,因此有可能创建一棵巨大的树,以可视化方式将所有人类如何通过其母系关系彼此联系,一直到假设的EVE。当孩子出生时,MtDNA中的每个突变都会从其父树中的分支创建一个新的子分支。 在此处了解有关线粒体DNA(mtDNA)的更多信息:https://en.wikipedia.org/wiki/线粒体DNA 目的: 您的程序将获得mtDNA树枝突变计数列表,并且您的程序应提供它的树状视图 输入和输出示例: 输入是一个三列的分号分隔表,每个分支都有一行。例: L0a'b'f'k;L0;14 L0a'b'f;L0a'b'f'k;23 L0;mtEVE;10 L0a'b;L0a'b'f;30 L0a;L0a'b;38 L0a1'4;L0a;39 L0a1;L0a1'4;40 L0a1a;L0a1;42 L0a1a NL;L0a1a;43 L0a1a1;L0a1a NL;44 L0a1a2;L0a1a NL;45 L0a1a3;L0a1a NL;44 L0a1 NL;L0a1;41 L0a1b;L0a1 NL;44 L0a1b NL;L0a1b;45 L0a1b1;L0a1b NL;46 L0a1b1a;L0a1b1;47 L0a1b1a1;L0a1b1a;48 L0a1b2;L0a1b NL;48 L0a1b2a;L0a1b2;50 L0a1c;L0a1 NL;45 L0a1d;L0a1 NL;44 L0a4;L0a1'4;55 L0a2;L0a;47 L0a2a;L0a2;49 L0a2a1;L0a2a;50 L0a2a1a;L0a2a1;51 L0a2a1a1;L0a2a1a;53 L0a2a1a2;L0a2a1a;53 L0a2a2;L0a2a;53 L0a2a2a;L0a2a2;54 L0a2b;L0a2;57 …

6
在O(log n)内存中打印ascii螺旋
您可以编写一个程序来接收一个奇数,正整数 n,其中n >= 3,作为函数参数,命令行参数或在STDIN(或您系统的等效参数)上,并打印到STDOUT(或系统等效参数)ASCII螺旋顺时针向内旋转,顶部边缘恰好是n字符长。n+1显然,第一个右边缘应该是字符长。例如, 输入: 11 输出: *********** * ********* * * * * * ***** * * * * * * * * * * * * * * * *** * * * * * * * ******* * * * *********** 收获: 您的程序只能使用O(log n)内存。 您的程序只能打印字符*(ASCII 42),(ASCII 32),<CR>(ASCII …

1
拯救大雁免于灭绝
被称为Alex A的鹅种以其居于由64个单元格组成的三角形网格中而闻名: (图片来自这个无关的欧拉项目问题。) 我们将用数字标记每个单元格,0使其63从第一行开始,然后在其下方的每一行中从左向右移动。因此,顶部的单元格是0,而右下角的单元格是63。 每个单元都有三个边界。我们可以在表格a,b中标记每个边框,其中a和b是共享该边框的单元格的编号。例如,单元格0和之间的边界2将被称为0,2或2,0(将它们置于哪个顺序都没有关系)。 网格最边缘的边框的标记系统是不同的,因为网格边缘的单元格具有不与其他单元格共享的边界。如果边框只是一个单元格的一部分,我们将使用字母X。例如,小区的三个边框0是0,2,0,X和0,X。 一些细胞含有鹅。但是,如果您不保护它们,这些鹅将会被邪恶的狐狸杀死(来自网格外部)。如果所有的鹅都死了,那么BrainSteel会很难过。因此,我们将编写一个程序在鹅周围建起篱笆,以保护它们免受狐狸侵害。鹅应该存在于单个完全封闭的栅栏多边形中。我们的围栏预算很低,因此请使用尽可能少的围栏。 输入说明 从0到的逗号分隔的数字列表63,代表包含鹅的细胞。例: 6,12 输出说明 为了成功保护鹅,需要在其上建立围栏的边界列表。这应该是最小数量的围栏。例: 5,6 6,7 11,12 12,13

3
自然线性Diophantine方程
两个变量中的线性Diophantine方程是ax + by = c形式的方程,其中a,b和c是常数,x和y是整数。 对于许多自然发生的丢番图方程,x和y表示不能为负的数量。 任务 编写一个接受系数a,b和c作为输入并返回任意对自然数(0、1、2,...)x和y的程序或函数,以验证方程ax + by = c(如果有)存在。 附加规则 您可以选择任何只涉及所需整数的语言,只要您不在输入中嵌入任何代码,就可以选择仅涉及所需整数的任何格式,以及(可选)语言的数组/列表/矩阵/元组/矢量表示法。 您可以假设系数a和b都非零。 您的代码必须适用于-2 60和2 60之间的任何三元整数;它必须在一分钟内在我的计算机(Intel i7-3770,16 GiB RAM)上完成。 您可能不使用任何可解决Diophantine方程从而使这项任务变得微不足道的内置函数,例如Mathematica FindInstance或FrobeniusSolve。 如果找不到解决方案,只要符合时间限制并且其输出不能与有效解决方案混淆,您的代码可能会按照您希望的方式运行。 适用标准代码高尔夫球规则。 例子 下面的示例说明方程2x + 3y = 11的有效I / O,正好具有两个有效解((x,y)=(4,1)和(x,y)=(1,3))。 Input: 2 3 11 Output: [4 1] Input: (11 (2,3)) Output: [3],(1) (x,y)=(1,0)对是2x + 3y = 2的唯一有效解决方案。 …

1
XKCD支架概率
今天的XKCD是一种运动比赛风格的支架,其中的参赛者都是众所周知的名字,分成几组可能令人困惑的名字。 根据给定回合中每个参赛者赢得该回合的机会均等,给出给定参赛者将赢得整个锦标赛的概率。 输入值 参赛者的名字。 XKCD喜欢使用所有大写字母,但是您可以使用任何对您有意义的大小写,也可以使您的输入不区分大小写。 您可以假定所有输入名称均有效。 Jeff Gordan可能是的拼写错误Jeff Gordon。您可以选择接受其中一个或两个。 一些名称包括标点符号,例如H. G. Wells和Joseph Gordon-Levitt。您可以选择接受带或不带标点符号的名称(或同时包含两者)。上面没有标点的将是H G Wells和Joseph Gordon Levitt 同样,你可以选择接受或者Beyoncé或Beyonce或两者 这Mister/Fred Astaire/Rogers条线有点奇怪。对于这一个,你必须接受以下所有的:Fred Rogers,Mister Rogers和Fred Astaire 输出量 给定参赛者以合理形式赢得整个比赛的概率(例如1/64) 例子 路易斯·阿姆斯特朗(Louis Armstrong)可能会参加6轮比赛,每轮有两名选手,因此他有1/64的获胜机会。 艾伦·里克曼(Alan Rickman)可能会参加7轮比赛,第一轮有3名选手参加,其余的有2名选手参加,因此他有1/192的获胜机会。 为了节省您键入图像中所有名称的工作量,explainXKCD已经将它们制成表格了。我也把它们丢到了这个粘贴桶里。 请注意,explainXKCD中的获胜概率是错误的-它们是应有值的两倍,因为它们大概忘记了最后一轮。感谢您指出@Geobits。


10
代码机器人3:并行编程反模式
欢迎回来!我很高兴提出第三个CodeBots挑战。这已经花了很长时间了。这项挑战将分为3个部分:简短版本,详细版本和其他详细信息。 短版 每个参赛者将编写一个24命令程序。这些bot会在世界各地移动并将其代码复制到其他bot中,同时试图阻止其他bot这样做。可能的命令之一是no-op Flag。如果一个机器人拥有Flag比其他任何一个机器人更多的东西Flag,那么您将获得积分。您可以通过获得最多的积分来获胜。 以上所有这些对于过去的两个挑战都是正确的。这次,机器人将能够同时运行多行代码。 长版 API 每个漫游器将精确地有24行,每行采用以下格式: $label command parameters //comments 标签和注释是可选的,并且每个命令具有不同数量的参数。一切都不区分大小写。 参量 输入的参数可以是以下格式: 介于0到23之间的值。 一个变量:A,B,C,D 使用加法的值:A+3或2+C 用#符号指定的一行代码(#4代表第5行,而#C+2代表由计算得出的行C+2)。 您可以使用$label而不是指定一行代码。 对手的变量或代码行,由指定*。您的对手是您面对的方形机器人。(*B代表对手的B价值,而*#9代表对手的第十行)。如果那个方格中没有人,则不执行该命令。 指令 移动V 移动机器人North+(V*90 degrees clockwise)。运动不会改变方向。 转V V*90 degrees顺时针旋转机器人。 复制大众 将任何内容复制V到中W。如果V是行号,则W必须是行号。如果V是变量或值,则W必须是变量。 旗 什么也没做。 星空卫视 启动附加到变量的新线程V。立即,在以后的每个回合中,线程将在line上执行命令V。 如果V已经连接到线程,则此命令为无操作。如果V是对手的变量,那么对手将启动附加到该变量的线程。 停止V V在此回合结束时停止附加到变量的线程。 锁V 防止V以任何方式使用该行或变量,除非被称为的线程使用Lock。随后Lock由同一线程进行的调用将解锁V。不能在对手的变量或行上调用锁。 如果康德大众 这将测试Cond。如果条件为true,则它将线程指针移至行号V,否则移至行号W。该行将立即执行。 条件句可以X=Y,X<Y,!X,或?X: X=Y 测试两条线是否属于同一类型且来自同一机器人的行,或者测试两条值是否等于相同数量。 X<Y测试的值X是否小于Y。 !X测试变量或行X是否被锁定(如果锁定,则返回true) ?X 测试给定变量是否附加了线程 额外细节 …

5
现在是选举时间!
是时候...点票了! 今天,我在整个国家举行地方选举。在此,使用D'Hondt方法确定每个宴会的席位数量。您的目标是实现一个程序或功能,该程序或功能将确定每个方以最少的字节数获得多少席位。 对于这种方法,要分配固定数量的席位,方法是这样的: 每一方都分配有一个可变数字,该数字从其获得的票数开始。 然后将第一个席位分配给变量中具有最大价值的政党,然后该政党的那个价值将成为其投票总数除以1+seats,四舍五入后,seats该席位中已有的席位数(因此,首先,他们的选票将被2除,并在获得第二个席位后被3除。 此后,再次比较当事方的票数。该过程继续进行,直到分配了所有席位。 如果最高数目是两个或多个参与方之间的平局,则它是随机解决的(必须是随机的,它不能只是列表中两个中的第一个)。 输入值 您将收到一个数字N,该数字将指示可用席位的数量,以及各方喜欢的任何格式的投票列表。例: 25 12984,7716,13009,4045,1741,1013 输出量 您应该输出每方获得席位的列表。在上面的示例中,它将类似于 8,5,9,2,1,0 它们的顺序应与输入中各方的顺序相同。 例子 5 3,6,1 outputs: 2,3,0 135 1116259,498124,524707,471681,359705,275007,126435 outputs: 45,20,21,19,14,11,5 奖金 如果以参与方的名字作为输入并在输出中提供他们,则获得-20%的奖励,例如: 25 cio:12984,pcc:7716,irc:13009,icb:4045,cub:1741,bb:1013 outputs cio:8 pcc:5 irc:9 icb:2 cub:1 bb:0
13 code-golf 

1
在Python中逐项串联字符串列表
这是在python中打高尔夫球的提示问题。 假设您有两个字符串列表,并且想要连接每个列表中的相应条目。例如,用a=list("abcd")和b=list("1234")计算["a1","b2","c3","d4"]。 在基于数组的编程语言中,这是微不足道的,在这种语言中,操作通常以成员方式应用于列表。例如,在我的高尔夫语言Pip中,代码就是a.b。但是在Python中,这并不容易。 Python方式可能是使用zip列表理解(25个字符): [x+y for x,y in zip(a,b)] 另一种方法是map使用lambda函数(23): map(lambda x,y:x+y,a,b) 以下是我想出的最短的(21): map("".join,zip(a,b)) 有没有更短的方法? 假设列表的长度相同,并且只需要某种可迭代的内容(因此map在Python 3中可以使用对象)。
13 code-golf  tips  python 

11
计算距离mod N
很长时间以来,您一直在从Advanced Collecting Device Controller™收集数据。您检查了日志,并惊恐地发现出了什么问题:数据只包含数字的最后几位! 幸运的是,您知道初始值,并且该值永远不会快速变化。这意味着您可以通过查找起点之间的距离来恢复其余部分。 挑战 您将编写一个程序或函数来计算值的变化量,给定一个模数N和一系列中间值modulo N。 每对数字之间的变化始终小于N/2,因此每个测试用例只有一个有效答案。 将以N您选择的格式为您提供输入> 2 的整数和值列表作为输入。输入可以通过STDIN或命令行或函数自变量给出。 您将输出一个整数,原始值已更改的数量。输出可以打印到STDOUT或返回。 规则 您的程序必须能以小于的距离和模数工作2^20。 您可以假设: N至少是3。 该列表至少包含2个值。 列表中的所有值都至少为0且小于N。 数字中的所有变化均小于N/2。 其他都是无效的输入,您的程序可能会做任何想做的事情。 禁止为此目的而使用标准漏洞,任何非标准库和内置函数。 这是代码高尔夫球,因此以字节为单位的最短程序获胜。 示例测试用例 输入: 3 0 1 2 2 0 1 0 2 1 2 0 1 2 1 1 输出: 4 说明(带有示例值): Value mod 3: 0 1 2 …
13 code-golf  math 

4
非常好的弗里德曼数字
甲弗里德曼号是一个正整数,它等于使用它自己的位结合的操作+,一个非平凡表达- ,*,/,^,括号和级联。 尼斯弗里德曼数是一个正整数,等于一个不平凡的表达式,该表达式使用其自己的数字与相同的运算结合使用,这些数字按其原始顺序排列。 我在这里发明的甚尼斯弗里德曼数(VNFN)是一个尼斯弗里德曼数,可以不用这种表达的不太漂亮的部分来书写(在我看来)。括号,串联和一元取反是不允许的。 对于此挑战,可以使用三种可能的方式编写不带括号的表达式。 前缀:这等效于左联想。这种类型的表达式的所有运算符都写在数字的左侧。每个运算符适用于以下两个表达式。例如: *+*1234 = *(+(*(1,2),3),4) = (((1*2)+3)*4) = 20 可以这样写的VNFN是343: ^+343 = ^(+(3,4),3) = ((3+4)^3) = 343 后缀:这等效于右联想。就像前缀表示法一样,除了操作在数字的右边。每个运算符都适用于前面的两个表达式。例如: 1234*+* = (1,(2,(3,4)*)+)* = (1*(2+(3*4))) = 14 可以这样写的VNFN是15655: 15655^+** = (1,(5,(6,(5,5)^)+)*)* = (1*(5*(6+(5^5)))) = 15655 中缀:中缀表示法对这五个操作使用标准操作顺序。出于挑战的目的,将按以下方式定义操作顺序:括号^右为第一个,关联为右。然后,将括号括起来*,/同时将其左移。最后,将括号括起来+,-同时将其左移。 1-2-3 = (1-2)-3 = -4 2/3*2 = (2/3)*2 = 4/3 2^2^3 = …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.