编程拼图和代码高尔夫

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

18
打印出所有IPv6地址
这使我想起几年前有人上传了洪流“黑客工具:所有IP地址的完整列表”。当然,这只是一个约40亿个IPv4地址的生成列表,但是有数千个“ h4xx0rz”下载了它。看妈妈,imahacker! 当时是这样,但如今每个人都已切换到IPv6。(对?) 您的任务是编写一个打印所有IPv6地址的程序。 您应该编写一个完整的程序,该程序不输入任何内容并打印IPv6地址,每行显示一个,而没有其他输出。您的程序必须打印所有2 128个可能的地址,包括无效的地址。每个地址必须打印一次。您可以按任何顺序打印地址。 每个地址都可以完整打印,用冒号分隔8组4个十六进制数字,例如 2001:0db8:85a3:0000:0000:8a2e:0370:7334 您可以自行决定使用RFC 5952中的任何标准缩写: 可以省略组中的前导零,除非0不能再进一步缩写。 :: 每个地址最多可使用一次,以缩写一个或多个全零组的序列。 十六进制数字可以使用小写或大写。 如果您达到RFC 5952的推荐制式建议(仅小写字母,表示形式尽可能短,::如果可以在多个地方使用,请尽早使用),您将获得-20%的奖励。 由于输出的大小,当我们坐在那里时,您的程序无法完成。您的程序可能在某些时候被外部手段中断(Ctrl+ C,拔出电源,…)。您的程序必须将输出作为流产生,以便在“合理”等待之后,它将产生一些行。基本上,不允许在内存中构造一个巨大的字符串仅在最后打印出来。任何会在“标准” PC上用尽内存的程序都将被取消资格。(尽管如此,如果您的程序运行了足够长的时间,它必须打印所有IPv6地址,然后退出。) (如果这种情况对于运行该程序直到完成并随后让您看到输出的Web解释器来说是一个问题,并且您没有托管的解释器,请在问题的较小版本上测试您的程序,然后仔细进行调整到完整的2128。) 您的分数是程序的长度(以字节为单位),如果获得奖励,则乘以0.8。这是代码高尔夫球,因此得分最低者获胜。

1
线性时间中最长的公共子串
挑战在于编写代码以解决以下问题。 给定两个字符串A和B,您的代码应输出具有以下属性的A子字符串的开始和结束索引。 A的子字符串也应该与B的某些子字符串匹配。 不再有满足第一个属性的A子字符串。 例如: A = xxxappleyyyyyyy B = zapplezzz apple带有索引4 8(索引从1开始)的子字符串将是有效的输出。 功能性 您可以选择输入是本地目录中文件中的标准输入还是您自己的选择。文件格式将只是两个字符串,用换行符分隔。答案应该是完整的程序,而不仅仅是功能。 我最终想在从http://hgdownload.cse.ucsc.edu/goldenPath/hg38/chromosomes/的字符串中提取的两个子字符串上测试您的代码。 得分 这是带有扭曲的代码高尔夫球。您的代码必须及时运行O(n),其中n表示输入的总长度。 语言和图书馆 您可以使用具有免费编译器/解释器/等的任何语言。对于Linux。您应该只使用不是为解决此任务而设计的标准开源库。如有争议,我将其视为您的语言所标配的任何库,或者可以从默认存储库安装在默认ubuntu计算机中的任何库。 有用的信息 在线性时间内至少有两种方法可以解决此问题。一种是首先计算后缀树,第二种是首先计算后缀数组和LCP数组。 这是线性时间后缀树构造的完整(也许是过度)详细说明(不幸的是,有些数字被弄乱了)。关于https://stackoverflow.com/questions/9452701/ukkonens-suffix-tree-algorithm-in-plain-english的线性时间后缀树构造,还有一个非常好的SO答案。它还包括到源代码的链接。可以在这里找到另一个详细的说明,这一次提供了使用C的完整解决方案。 http://www.cs.cmu.edu/~guyb/realworld/papersS04/KaSa03.pdf的第2节给出了线性时间后缀数组构造算法,附录A具有C ++源代码。该答案告诉您如何计算最长的公共子字符串https://cs.stackexchange.com/questions/9555/computing-the-longest-common-substring-of-two-strings-using-suffix-arrays。https://courses.csail.mit.edu/6.851/spring12/scribe/lec16.pdf的第5节,其中也有相关的视频讲座https://courses.csail.mit.edu/6.851/spring12/lectures/L16 .html还解释了从1:16:00开始的相同算法。

30
单个像素沿圆形路径移动
这是一个图形输出挑战,任务是提供每种语言最短的代码。 任务 您的代码应绘制一个紫色像素(十六进制值#800080或rgb(128,0,128)),顺时针旋转一个圆圈。绕一圈完整的旅程大约需要60秒,并且应无限期地继续。除像素外,其他任何内容都不应显示在屏幕或窗口上。圆的宽度应为屏幕或窗口的宽度的0.75(适当舍入),背景应为白色。为了防止出现笨拙的溶液,屏幕或窗口的宽度至少应为100像素。 您的代码应为完整程序。 语言和图书馆 您可以使用任何喜欢的语言或库。但是,我希望能够在可能的情况下对您的代码进行测试,因此,如果您可以提供有关如何在Ubuntu中运行代码的明确说明,将不胜感激。 缺少前二十种语言。需要帮助。 以下前二十种编程语言目前根本没有任何解决方案。 C,C ++,C#,Python,PHP,Visual Basic .NET,Perl,Delphi / Object Pascal,Assembly,Objective-C,Swift,Pascal,Matlab / Octave,PL / SQL,OpenEdge ABL,R 目录 这篇文章底部的Stack Snippet会根据答案a)生成目录,a)作为每种语言最短解决方案的列表,b)作为整体排行榜。 为确保您的答案显示出来,请使用以下Markdown模板以标题开头。 ## Language Name, N bytes N您提交的文件大小在哪里。如果您提高了分数,则可以将旧分数保留在标题中,方法是将它们打掉。例如: ## Ruby, <s>104</s> <s>101</s> 96 bytes 如果要在标头中包含多个数字(例如,因为您的分数是两个文件的总和,或者您想单独列出解释器标志罚分),请确保实际分数是标头中的最后一个数字: ## Perl, 43 + 2 (-p flag) = 45 bytes 您还可以将语言名称设置为链接,然后该链接将显示在代码段中: ## [><>](http://esolangs.org/wiki/Fish), …

30
爱我,不爱我
爱我,不爱我 这个简单的儿童游戏虽然古老,但仍然很受欢迎。由于我们现在生活在21世纪,因此我们将其数字化! 规格 程序必须不输入任何内容,除非您使用的语言不能生成随机种子-在这种情况下,您可以将种子用作输入。您的任务是编写一个程序,该程序将随机输出总共3到20行(包括3行和20行):“爱我...”和“爱我不...”,就像在游戏中一样(以及另外一行);读)。 但是,有一些限制。每行后应跟换行符。第一行必须是“爱我...”。最后一行(“爱我”或“不爱我”)应分别以感叹号或单个点结束。在最后一行之后,您需要在新行中输出一个heart(<3)或一个破碎的heart(</3),具体取决于是否“爱我!” 或“不爱我”。是最后一句话。 允许尾随空格。 示例输出 输出: 爱我... 不 爱我... 爱我...不 爱我... 爱我! <3 另一个输出: 爱我... 不 爱我... 爱我... 不爱我。 </ 3 这是代码高尔夫球,因此最短的条目将获胜! 另外,我的第一个挑战:)祝你好运!

4
猪会飞吗?
任务 您的任务是用您选择的语言编写函数或程序,该函数或程序分析几个语句并确定是否可以从这些语句中得出猪可以飞的结论。 输入项 输入是一个字符串,可以从STDIN读取,可以作为函数参数,甚至可以存储在文件中。可以使用以下EBNF描述输入: input = statement , {statement}; statement = (("Pigs are ", attribute) | ("Everything that is ", attribute, "is also ", attribute)), ". "; attribute = [not], ("able to fly" | singleAttribute); singleAttribute = letter, {letter}; letter = "a" | "b" | "c" | "d" | "e" …

3
创建xkcd样式的叙述图
在更具标志性的xkcd片段之一中,Randall Munroe在叙述图表中可视化了几部电影的时间表: (点击查看大图。) 资料来源:xkcd 657号。 给定电影时间线的规格(或其他一些叙述),您将生成这样的图表。这是一次人气竞赛,因此(净)票数最多的答案将获胜。 最低要求 为了进一步规范,这是每个答案必须实现的最少功能集: 输入一个字符名称列表,然后是一个事件列表。每个事件要么是垂死的字符列表,要么是字符组列表(表示当前在一起的字符)。这是侏罗纪公园叙述如何编码的一个示例: ["T-Rex", "Raptor", "Raptor", "Raptor", "Malcolm", "Grant", "Sattler", "Gennaro", "Hammond", "Kids", "Muldoon", "Arnold", "Nedry", "Dilophosaurus"] [ [[0],[1,2,3],[4],[5,6],[7,8,10,11,12],[9],[13]], [[0],[1,2,3],[4,7,5,6,8,9,10,11,12],[13]], [[0],[1,2,3],[4,7,5,6,8,9,10],[11,12],[13]], [[0],[1,2,3],[4,7,5,6,9],[8,10,11,12],[13]], [[0,4,7],[1,2,3],[5,9],[6,8,10,11],[12],[13]], [7], [[5,9],[0],[4,6,10],[1,2,3],[8,11],[12,13]], [12], [[0, 5, 9], [1, 2, 3], [4, 6, 10, 8, 11], [13]], [[0], [5, 9], [1, 2], [3, …

1
键入给定文本所需的击键次数最少
我们都知道程序员往往很懒。为了最大限度地利用您的空闲时间,您决定编写一个程序,该程序为输入的文本输出最少的击键次数。 输入:必须转换为击键的文本。您可以决定如何输入文本(STDIN /从参数中提供的文件中读取) 输出:以下格式的必要操作: 他们必须编号 H它:按下一个键并立即释放它 P提示:按下一个键然后不松开(将键R作为下一个击键时,这将永远不是最佳选择) Release:释放P密钥 范例: 输入: Hello! 输出: 一个幼稚的解决方案是: 1 P Shift 2 H h 3 R Shift 4 H e 5 H l 6 H l 7 H o 8 P Shift 9 H 1 10 R Shift 这样会更有效: 1 P Shift 2 H h …

19
弹枪编号
该猎枪的数字是一个相当简单的定义,但一些有趣的结构序列。从自然数开始: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, ... 现在,将所有数字除以2整除的索引,将它们分成对,然后交换每对中的数字: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ... ^ ^ ^ ^ ^ ^ ^ <---> <---> <-----> <---- 1, …

18
您可以将这根弦切成多少块?
考虑一条字符串(如“绳子”,而不是“一串字符”),该字符串在实线上来回折叠。我们可以通过(按顺序)通过的点列表来描述字符串的形状。为了简单起见,我们假定所有这些点都是整数。 举个例子[-1, 3, 1, -2, 5, 2, 3, 4](注意,并非每个条目都包含一个折叠): 沿垂直方向延伸的字符串仅用于可视化目的。想象一下,所有的弦线都扁平化到了实线上。 现在的问题是:一次切割就可以切成最大的弦数(在上图中必须是垂直的)。在这种情况下,答案是6,且在2和之间的任意位置都有一个割线3: 为了避免歧义,切口具有在一个非整数的位置被执行。 挑战 给定一串可折叠的整数位置列表,您将确定一次可在非整数位置进行一次切割即可切割的最大片段数。 您可以编写完整的程序或函数。您可以通过STDIN,命令行参数,提示符或函数参数进行输入。您可以将输出写入STDOUT,在对话框中显示或从函数返回。 您可以假定该列表采用任何方便的列表或字符串格式。 该列表将包含至少2个且不超过100个条目。入口将整数,每个范围-2 31 ≤p 我 <2 31。您可以假定没有两个连续的条目相同。 您的代码必须在合理的台式PC上在不到10秒的时间内处理任何此类输入(包括下面的测试用例)。 测试用例 所有测试用例只需输入,然后输出即可。 [0, 1] 2 [2147483647, -2147483648] 2 [0, 1, -1] 3 [1, 0, -1] 2 [-1, 3, 1, -2, 5, 2, 3, 4] 6 [-1122432493, -1297520062, …

3
帮助印第安纳·琼斯获得宝藏
故事 印第安纳·琼斯(Indiana Jones)正在探索一个珍贵宝藏所在的洞穴。突然,发生了地震。 地震结束后,他注意到从天花板掉下来的一些岩石挡住了通往宝藏的路。他还注意到他可以推一块石头,但是由于石头很重,所以不能连续推两块石头。 您的目标是帮助印第安纳·琼斯获得宝藏。由于即使一块石头也很难推,所以推的次数非常重要。 问题 找到最好的方法(印第安纳琼斯尽可能少地推石头),找到宝藏。 地图(输入) 映射是一个m按n(均大于1)的矩阵,可以包含五种单元格: 0 表示空白单元格 1 这意味着墙, 2 印第安纳·琼斯所在的位置(只有一个), 3 宝藏所在的位置(只有一个存在), 和4,这意味着一块石头。 在地图的第一行中,地图的尺寸​​指定为4 6,从地图的第二行到最后一行,则指定洞穴的结构,如下所示。 110131 104040 100101 200000 因此,完整的地图是: 4 6 110131 104040 100101 200000 意思是 该映射由stdin,文件(您可以指定文件名)或代码中仅包含上述信息的数组给出。 输出量 印第安纳·琼斯应推销的最低金额。如果没有这种方法,请输出X。 在上述情况下,他可以向左推石头,然后向右推石头以获得宝藏。因此,这种情况下的输出为2。 然而。在这种情况下 : 4 6 111131 104040 100101 200000 (请看下面的部分)他不能推正确的石头,因为它会破坏宝藏。同样,向左推动石头不会改变任何东西。因此,输出为X。 规则 他只能沿向上,向下,向左和向右四个方向移动。 他不能连续推两块石头。 他不能拉任何石头,只能向一个方向(“向前”)推石头。 他不能穿过墙壁。他只能去的地方是空白单元格和藏宝室。 …

13
为无类型的lambda演算编写解释器
面临的挑战是为无类型lambda演算编写尽可能少的字符的解释器。我们将无类型的lambda演算定义如下: 句法 有以下三种表达式: Lambda表达式的形式为(λ x. e),其中x可以是任何合法变量名和e任何合法表达式。这里x称为参数,e称为函数体。 为简单起见,我们添加了进一步的限制,即不得存在与x当前作用域同名的变量。当变量的名称出现在(λ和之间时,变量就开始在范围.内,而在对应的变量处就停止在范围内)。 功能应用程序具有形式和形式(f a),它们是合法的表达式。这里称为函数,称为参数。fafa 变量的格式为xwhere x是合法变量名。 语义学 通过将函数体内参数的每次出现替换为其自变量来应用函数。更正式的形式的表达((λ x. e) a),其中x是变量名和e和a是表达式,评估(或减少)至表达式e',其中e'是取代的每次出现的结果x在e与a。 范式是无法进一步评估的表达式。 挑战 您的任务(如果您选择接受它)是编写一个解释器,该解释器将不包含自由变量的未类型化lambda演算的表达式作为输入,并产生该表达式的标准形式(或与该表达式一致的表达式)作为其输出。 。如果该表达式没有范式或它不是有效的表达式,则该行为是不确定的。 字符数最少的解决方案获胜。 一些注意事项: 输入既可以从stdin读取,也可以从作为命令行参数给出的文件名读取(您只需要实现一个或另一个即可-无需同时实现)。输出进入标准输出。 或者,您可以定义一个函数,该函数将输入作为字符串,然后将输出作为字符串返回。 如果非ASCII字符对您有问题,则可以使用反斜杠(\)字符代替λ。 我们计算字符数,而不是字节数,因此,即使您的源文件被编码为unicodeλ也算为一个字符。 合法变量名称由一个或多个小写字母组成,即a和z之间的字符(无需支持字母数字名称,大写字母或非拉丁字母-尽管这样做当然不会使您的解决方案无效)。 就此挑战而言,没有括号是可选的。每个lambda表达式和每个函数应用程序都将恰好由一对括号包围。变量名不会用括号括起来。 语法糖就像写(λ x y. e)的(λ x. (λ y. e))并不需要得到支持。 如果评估函数的递归深度大于100,则行为不确定。该值应该足够低,以至于无需在所有语言中进行优化即可实现,而且还应足够大以能够执行大多数表达式。 您可能还假定间距将与示例中的相同,即在输入的开头和结尾或a λ或之前没有空格,而在a .和之后.以及函数与其参数之间以及a 之后恰好有一个空格λ。 样本输入和输出 输入: ((λ x. x) (λ y. (λ z. …

30
在PowerShell中打高尔夫球的技巧
您在Windows PowerShell中打高尔夫球有哪些一般技巧?我正在寻找可以普遍用于解决高尔夫问题的想法,这些想法至少在某种程度上特定于PowerShell(例如,“删除评论”不是答案)。请为每个答案发布一个提示。 -几乎完全不听马尔可格的问题。

14
全部登上ASCII火车
全部登上ASCII火车! o O O ___ ___ ___ ___ ___ ___ ___ ___ ___ o | C | | O | | D | | E | | | | G | | O | | L | | F | TS__[O] |___| |___| |___| |___| |___| |___| |___| |___| |___| …

30
输出编程语言名称
挑战: 在您选择的编程语言中,不输入任何内容,而是输出您的编程语言的名称。 足够公平吧? 限制条件: 您的代码中不能使用编程语言名称中包含的任何字符。例如,如果使用批处理,则不得在代码中使用字符'B''a't''c''h'。请注意,这是区分大小写的。我仍然可以使用字符“ b”,因为它与“ B”不同。 您可以在语言名称之前或之后使用“垃圾输出” 版本号不算作语言名称的一部分。例如,如果在Python 3中,我可以在答案中使用数字3 编程语言名称的输出不区分大小写。 禁止强行使用所有可能的字母组合,并希望您获得自己的语言名称。 示例输出:(假设我的编程语言称为语言)(✔如果有效,否则为✖) Language ✔ Body language is a type of non-verbal communication in which physical behavior, as opposed to words, is used to express or convey information. Such behavior includes facial expressions, body posture, gestures, eye movement, touch and …

16
一个新发现的数字:流血!
“诺贝尔数学奖授予了一位发现新数字的加利福尼亚教授!该数字是漂白的,他声称该数字介于6到7之间。” -乔治·卡林 在此挑战中,您将打印给定输入范围内的所有整数(包括整数)。按输入顺序升序或降序打印数字。也就是说,对于输入[n1, n2],打印上升如果n1 < n2,降如果n1 > n2。 由于bleen现在是整数,因此可以将其用作输入。还必须将其包括在输出之间6(7如果适用)。还请注意-bleen存在于-7和-6之间。 输入项 [n1, n2]通过您选择的编程语言输入,范围在[-10,10](含)之间的两个Integer 。 (输入也可能包含bleen和-bleen!) 输出量 打印所有以开头n1和结尾的Integer n2,包括新发现的bleen6到7之间的值。输出可以是一系列字符分隔的数字,其格式受您的语言支持,即逗号或空格分隔。输出的尾随空间是可以的。 例子 Input: 1 10 Output: 1 2 3 4 5 6 bleen 7 8 9 10 Input: -9 -4 Output: -9 -8 -7 -bleen -6 -5 -4 Input: -8 bleen Output: -8 -7 …
44 code-golf  number 

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.