编程拼图和代码高尔夫

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

4
计算ASCII Art的端点
您应该编写一个程序或函数,该程序或函数接收表示ASCII艺术作品的字符串作为输入,然后输出或返回输入中端点的数量。 输入将包含字符space - | +(分别具有0、2、2和4个端点)和换行符。例如: -|++- + 在以下情况下,两个相邻的字符相连,因此每个端点丢失1个端点: -- -+ +- | | + + ++ | + | + 第一个例子有 2+2+2+2+1+ 3 = 12 端点。 输入值 输入将包括空格字符,串-,|,+和换行符。 输入长度可以为0长度,并且与上述描述匹配的任何输入均有效(在regex输入中为[ -+|\n]*)。 尾随换行符是可选的。 输出量 单个非负整数,端点数。 例子 输出在其输入的最后一行之后。 + 4 -|++- + 12 +--+ | | +--+ 8 | | +--+-- ||| 12 …

5
文字处理1:连字
背景 这是有关文本处理的3洞高尔夫球场的第一部分。最重要的想法是,如果您输入一个输入文本并通过解决所有这三个挑战的解决方案(使用少量的粘合代码)来传递它,则它会吐出一段格式精美的段落。在第一个挑战中,您的任务是使用给定的连字模式对文本片段进行连字。 输入值 您的程序应采用两个字符串输入:一段文本和一个连字符模式列表。第一个输入只是一个可打印的ASCII字符和空格的非空字符串;它不会包含换行符或波浪号~。第二个输入是一个以逗号分隔的单词列表,由小写ASCII字符的代字号分隔的音节组成。一个例子是ex~cel~lent,pro~gram~ming,abil~i~ties。 输出量 您的程序应按以下方式修改第一个输入。在第二个输入中找到带连字符的小写字母的任何单词(字母ASCII字符的最大子串)都应由该带连字符的字母替换,但应保留其大小写。在上面的示例列表中,如果文本包含单词Excellent,则应将其替换为Ex~cel~lent;然而,Excellently应不会被修改。您的输出应为此修改后的字符串。 详细规则和计分 您可以假设以下有关输入的信息: 第一个输入不包含波浪号,也没有前导,尾随或重复的空格。它不是空的。 第二个输入至少包含一个单词,并且每个单词中至少包含两个音节。每个音节都是非空的。 第二个输入不包含在另一个单词中作为音节出现的单词。 如果需要,可以更改两个输入的顺序,还可以选择在输出中添加一个尾随换行符。 您可以编写函数或完整程序。最低字节数获胜,并且不允许出现标准漏洞。 测试用例 这些以格式列出1st input [newline] 2nd input [newline] output。 Excellent programming abilities, you work excellently! ex~cel~lent,pro~gram~ming,abil~i~ties Ex~cel~lent pro~gram~ming abil~i~ties, you work excellently! Superman (sometimes incorrectly spelled "Super-man") is super #&%@ing strong. su~per,some~times,in~cor~rectly,spell~ing Superman (some~times in~cor~rectly spelled "Su~per-man") is …

3
检查键盘的所有键
编写等待标准101键美国键盘的每个键的最短程序 *的被按下,然后退出写入OK! 每次按下一个键时,程序都会在新行上显示需要按下的剩余未按下唯一键的数量,直到所有键至少被按下一次。该程序应该能够测试101键盘并查看每个键是否正常工作。因此,只要指定给用户,就允许按两次键或回车键。 两次或多次按下同一键既不会打扰代码,也不会更改剩余未按下键的显示数量。 所有按键(Left Shift,Right Shift,Right Control,Esc,Enter,等)应包括在内。 实际的键盘上的按键都在这个挑战的重要所以从程序的角度(A与a,是相同的,所以是6和^)。 组合键不会被注册为组合命令,并且如果按下Ctrl+ Alt+,Del则仅会注册单个键,这将对所按下组合中的所有单个键进行计数。因此,如果您已经按了小写,则无需按大写字母,反之亦然。 数字小键盘上的数字键与程序的角度不同,因此,如果您使用的笔记本电脑或任何其他没有美国标准101键盘布局的键盘,则仍需要按数字键才能完成程序。你除非您插入兼容的键盘,否则无法完成挑战。 * 不支持具有Fn键和笔记本电脑键的键盘以使此挑战可行 这是美国标准101键盘布局的键的列表: backspace tab enter right shift right ctrl right alt left shift left ctrl left alt print screen pause/break caps lock escape page up page down end home left arrow up arrow right arrow down arrow …

1
丢失的典当问题
丢失的典当问题 象棋比赛结束后,幸存的棋子被留在了敌后。让我们帮助他找到回家的最短途路。 最初的问题描述了nXn“棋盘”板以及f: {1,..,n-1}X{1,..,n}X{-1,0,1} => R+权重的函数。目标是找到一条最佳路径,从对接线中的某个正方形到顶线中的其他正方形,其中可能的移动是:左上,上,右上,并且您可能不退出木板。 这个问题相对容易使用动态编程在O(n ^ 2)中解决,但这是代码高尔夫,我们不在乎诸如运行时复杂性之类的无用的东西。 问题 输入:一个3维数组(或您选择的其他集合,通过stdin接收,或作为函数参数接收),对应于常规棋盘,大小完全相同:7X8X3(#linePasses X #rowSize X #movesPerPass)包含非负整数。的移动花费从一些位置(i,j),其中i是行索引,并且j是列指数,分别是: a[i][j][0]从左上角到正方形(i+1,j-1)或以图形方式显示的费用:\。 a[i][j][1]到达正方形(i+1,j)或以图形方式显示的费用:|。 a[i][j][2]垂直移动到正方形(i+1,j+1)或以图形方式移动的费用:/。 您可能会假设它不包含总和大于的路径MAX_INT。 输出:显示最佳(最短,即最小权重之和)路径的8X8 ASCII输出(如果有超过1个最佳结果,则可以显示您选择的任意路径)。路径是从下到上绘制的,在每一行中,与典当在路径中的位置相对应的字符是它要创建的字符。例如,如果棋子要从第3列向左移动(移至第2列),则应绘制: #?###### ##\##### 在哪里?应该替换为下一步。最终职位需要画成X。 例子 输入: [ [[1,1,1],[1,1,1],[0,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]], [[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]], [[1,1,1],[1,1,0],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]], [[1,1,1],[1,1,1],[1,1,0],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]], [[1,1,1],[1,1,1],[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]], [[1,1,1],[1,1,1],[1,1,1],[1,0,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]], [[1,1,1],[1,1,1],[1,1,1],[0,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]] ] 输出: ##X##### ###\#### ###|#### ###|#### ##/##### #/###### #|###### ##\##### 输入: [ [[41,27,38],[12,83,32],[50,53,35],[46,32,26],[55,89,82],[75,30,87],[2,11,64],[8,55,22]], [[56,21,0],[83,25,38],[43,75,63],[56,60,77],[68,55,89],[99,48,67],[94,30,9],[62,62,58]], [[23,18,40],[24,47,61],[96,45,72],[71,6,48],[75,63,98],[93,56,51],[23,31,30],[49,34,99]], [[20,47,42],[62,79,72],[32,28,44],[68,61,55],[62,39,57],[4,17,49],[97,85,6],[91,18,12]], …
14 code-golf  chess 

8
按字母顺序排列的Fannkuch
Fannkuch是一个经典的基准程序。该名称来自德语“ Pfannkuchen”(煎饼),该算法类似于翻转煎饼叠。Fannkuch的数字序列形成如下: 以{1 ..... n}的排列为例,例如:{4,2,1,5,3}。取第一个元素(这里为4),并颠倒前四个元素的顺序:{5,1,2,4,3}。重复此操作,直到第一个元素为1,这样翻转就不再更改:{3,4,2,1,5},{2,4,3,1,5},{4,2,3, 1,5},{1,3,2,4,5} 您将要编写一个程序或函数来为字母字符串计算出类似于Fannkuch的序列。应该使用字母在字母表中的位置,而不是使用数字来指示每次应翻转列表中的多少元素。例如,前导c表示您应该颠倒前3个元素的顺序,而前导a表示序列已完成。 输入值 输入将通过stdin作为字符串或作为函数参数提供。该字符串将包含1到26个不同的小写字母。字符串将不包含字母,这些字母的等效索引将导致Fannkuch算法翻转比现有数量更多的元素。 输出量 程序或函数应返回或打印以输出通过应用Fannkuch算法产生的术语序列,直到a遇到前导为止,包括初始字符串。例如,如果输入为bca,则可以打印: bca cba abc 打印的结果可以使用任何合理的分隔符-逗号,换行符等。可以选择任何空白。 再举一个例子,如果输入的是eabdc您可能会返回: ("eabdc" "cdbae" "bdcae" "dbcae" "acbde") 规则和计分 这是代码高尔夫球 -最短的程序获胜。不允许使用标准漏洞。

4
实现bzip2的行程编码
背景 应用BWT(在Burrows,Wheeler和Back中看到)和MTF(在Move到可打印的ASCII front中看到)之后,bzip2压缩器应用了一种相当独特的游程长度编码形式。 定义 出于这一挑战的目的,我们将转换BRLE定义如下: 给定仅包含ASCII字符且代码点在0x20和0x7A之间的输入字符串s,请执行以下操作: 用单次出现的字符替换每次运行的相等字符,并在第一个字符之后存储重复次数。 使用双射基数2以及符号和和对字符首次出现后的重复次数进行编码。{} 非负整数n被编码为字符串b k …b 0,使得n = 2 k i(b k)+ ... + 2 0 i(b 0),其中i({)= 1和i(})= 2。 请注意,此表示始终是唯一的。例如,数字0被编码为空字符串。 插入大括号字符串,该字符串编码相应字符单次出现后的重复次数。 分步示例 Input: "abbcccddddeeeeeffffffggggggghhhhhhhh" Step 1: "abcdefgh" with repetitions 0, 1, 2, 3, 4, 5, 6, 7 Step 2: "" "{" "}" "{{" "{}" …

11
清空一个游泳池。。。只带一个红色独奏杯
您有一个充满水的游泳池。您需要清空它,但您无法想到一种有效的方法。因此,您决定使用红色的独奏杯。您将一路重复装满杯子并将其倾倒在游泳池外。 挑战 清空游泳池需要多长时间? 输入值 [shape of pool] [dimensions] [shape of cup] [dimensions] [speed] shape of pool将这些字符串之一:circle,triangle或rectangle。请注意,这些实际上是指3维形状:圆柱,三角形棱柱和矩形棱柱。 dimensions 会因形状而异。 圈子:[radius] [height]。体积=πr 2 h 三角形:[base] [height] [length]。体积= 1/2(bh)*长度 矩形:[width] [length] [height]体积= lwh shape of cup并dimensions以相同的方式工作。杯子也可以是圆形,三角形或矩形。 speed是几秒钟内倒空一杯水所需的时间。 输出量 清空游泳池所需的秒数。可以四舍五入到最接近的秒数。 笔记 输入中将没有单位。假定所有距离单位都相同(形状不会以英寸为单位的高度和以英尺为单位的宽度)。 将3.14用于pi。 输入将由字符串和浮点数组成。 永远不会下雨。永远不会添加水。 您的手非常稳固。每次您都将杯子完全塞满边缘,而且绝对不会溢出。 一旦接近尾声,将很难捞出一整杯水。您无需为此担心。您非常强壮,因此您可以将游泳池倾斜到其一侧(无需花费更多时间)。 每次进行计算时,都可以四舍五入到最接近的百分之一。您的最终答案将不一定是准确的。 测试用例 输入:triangle 10 12.25 3 circle …

2
GOLF CPU高尔夫挑战赛:主要分区
这个挑战是应该在GOLF CPU中编写的一系列最少操作问题中的第一个。您可以在这里找到下一个 数字的分区N是加在一起的数字列表N。一个主要的分区是加起来素数的列表N。 对于这个挑战,您将获得一个整数N ≥ 2。您需要为生成最短的主分区N。如果有多个可能的分区,则可以打印其中任何一个。 例子: 9: [2, 7] 12: [5, 7] 95: [89, 3, 3] 337: [337] 1023749: [1023733, 13, 3] 20831531: [20831323, 197, 11] 您的程序应使用GOLF CPU编写。对于输入/输出,您可以使用STDIO或寄存器。该列表可以按任何顺序排列,如果您使用的是STDOUT,则可以用空格或逗号分隔(无需括号)。显然,不允许对解决方案进行硬编码,也不得对头几个质数进行硬编码。 这是最少的操作问题,因此以最少的周期数解决上面的示例的答案就成功了!

7
递归二进制描述
递归二进制描述 最近,我对OEIS做出了第一个贡献,方法是将b文件扩展并添加到序列A049064中。该序列以开头0,然后通过给出最后一项的“二进制描述”来得出下一个值。 例如,第二项将是10,因为0第一个元素中有一个。第三项是1110,因为有一个1和一个0。第四个是11110。因为有三个(11二进制!) 1和一个0。以下是第五个术语的细目分类,以使该过程更加清晰: > 11110 > 1111 0 (split into groups of each number) > 4*1 1*0 (get count of each number in each group) > 100*1 1*0 (convert counts to binary) > 100110 (join each group back together) 这是一个从第六学期到第七学期的示例: > 1110010110 > 111 00 1 0 11 0 …
14 code-golf 

7
找到每个尺寸Toeplitz矩阵的最大行列式
对于固定的n,请考虑条目为0或1 的n×n Toeplitz矩阵。目的是在所有此类Toeplitz矩阵上找到最大行列式。 任务 对于n从1到更高的每个,输出在所有n×n Toeplitz矩阵上的最大行列式,其条目为0或1。每个输出n应该有一个最大行列式的输出,并且有一个达到它的示例矩阵。 得分了 您的分数是n您的代码在我的计算机上2分钟内获得的最高分。为了澄清一点,您的代码总共可以运行2分钟,而不是每个2分钟n。 抢领带 如果两个条目获得相同的n分数,那么获胜的条目将是n在我的机器上最短时间内获得最高得分的条目。如果两个最佳作品在此标准上也相等,那么获胜者将是第一个提交的答案。 语言和图书馆 您可以使用任何喜欢的免费语言和库。我必须能够运行您的代码,因此请尽可能提供有关如何在Linux中运行/编译代码的完整说明。 我的机器时间将在我的机器上运行。这是在AMD FX-8350八核处理器上的标准ubuntu安装。这也意味着我需要能够运行您的代码。 小答案 对于n = 1..10,输出应为1,1,2,3,5,9,32,56,125,315 此顺序不在OEIS中,因此获胜作品也可以在那里提出新的作品。 到目前为止的条目 n=10 n=11由Vioz在Python中 n=9由Tyilo在C中 n=12由Legendre in J n=10由Tensibai在R中 n=14由SteelRaven在C ++中 n=14由RetoKoradi在C ++中

3
最高周长的多米诺骨牌
这是代码高尔夫。获胜者是字节数最少的有效代码。 挑战 给定输入M和N,即正方形矩形网格的宽度和高度,输出满足以下条件的多边形: 多边形边缘仅由正方形边缘组成:没有对角线边缘-全部为垂直或水平。 多边形没有孔:从多边形外部边界上的多边形开始,可以在多边形外部的正方形上通过正交步骤到达多边形外部的每个正方形。 多边形没有自相交:在一个顶点相交的正方形边缘中,多边形周长的一部分不得超过2个。 多边形已连接:多边形中的任何正方形都必须可以通过停留在多边形内的正交步距多边形中的任何其他正方形。 多边形具有最大可能的周长:根据下面显示的公式。 您的代码必须适用于从1到255的M和N。 最大周长的公式 这里的挑战是要找到具有最大周长的那些多边形中最可打的高尔夫。最大周长本身始终由以下公式定义: 这是正确的,因为对于最大周长,每个正方形顶点必须在该周长上。对于奇数个顶点,这是不可能的,而可获得的最佳顶点数少一个顶点(因为周长始终为偶数)。 输出量 将形状输出为由换行符分隔的字符串(N行,正好是M个字符)。在这里,我为多边形外部的正方形使用空格,为多边形内部的正方形使用'#',但是您可以使用任何两个视觉上不同的字符,只要它们的含义对于所有输入都是一致的。 您最多可以包含一个前导换行符和最多一个尾随换行符。 如果愿意,您可以输出M个正好N个字符的行,对于某些输入,您可以选择M by N输出,而对于其他输入则选择N by M输出。 例子 由于孔无效: ### # # ### 由于交集(对角线触摸-顶点在外围具有4个正方形边缘)和一个孔而无效: ## # # ### 由于断开连接而无效: # # # # 最大周长的有效多边形: # # # # ### 学分 最初,我低估了可以计算出最大周长的值的速度,并只是要求将该值作为输出。感谢聊天中非常有帮助的人们,他们解释了如何计算任意N和M的最大周长,并帮助将其变成一项挑战,将持续多个答案... 特别要感谢: 斯帕尔,兹加布,费瑟姆,吉米23013。
14 code-golf  grid 

2
棋盘上的爆炸
原子象棋是一种(非常有趣的)象棋的变体,其中每次捕获都会引起“爆炸”,破坏捕获的棋子,进行捕获的棋子,以及所有非棋子都在1平方毫米的半径内。挑战的目的不是玩完整的原子象棋游戏,而是简单地模拟做出特定动作时发生的情况。 免责声明:不包括爆炸声效。 输入值 董事会职位将以Forsyth-Edwards表示法 (通常称为FEN)给出,但只有第一个字段。例如,输入: rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR 代表起始位置: 必须将其视为字符串或您的语言的等效字符串。保证有效;例如,您不必关心是否有十个国王,或者根本没有国王。 您还将获得要模拟的移动,该移动用两个正方形名称表示:要移动的块所在的正方形以及要移动到的正方形。例如,在上图上将国王的棋子向前移动两个空格将表示为: e2e4 这也必须作为字符串。此举将始终有效,并且您无需支持castling。您确实需要支持en passant,这将在下一部分中进一步详细说明。 输出量 程序的输出应与输入使用相同的部分FEN表示法,并进行指定的移动(如有必要,任何部分都应爆炸)。 爆炸的确切规则是-捕获一块时: 删除要捕获的片段(这将始终是输入中指定的第二个正方形上的片段,除非捕获为pass)。 删除正在捕获的片段(这将始终是输入中指定的第一个正方形上的片段)。 删除以下所有内容: 位于围绕捕获发生位置的8个正方形之一中(对于enpassant,这是捕获典当不会爆炸时将位于的正方形)。 不是典当。 快速概述顺便规则,对于那些谁不熟悉:如果从它开始的排名棋子移动两个空格前锋,并且有可能已经捕捉到它,如果它只能移动一格前进的棋子,它可以无论如何捕捉它,但仅在后续移动中。据说此捕获是“ 通过 ”完成的(或法语:“ en passant ”)。 测试用例 在图片中,绿色箭头重新预设了要进行的移动,绿色圆圈表示爆炸的片段。 输入:rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR,g1f3 输出:rnbqkbnr/pppppppp/8/8/8/5N2/PPPPPPPP/RNBQKB1R 输入:3kBb1r/pp5p/3p4/4pn2/P7/1P2P1pP/2rP1P2/R1B3RK,f2g3 输出:(3kBb1r/pp5p/3p4/4pn2/P7/1P2P2P/2rP4/R1B3RK 从http://en.lichess.org/ocoSfS5I/white#36盗取) 输入:rnbqk1nr/1pp5/p2pp1pp/5p2/1bN5/2P1PQ1N/PP1P1PPP/R1B1KB1R,f3b7 输出:(3qk1nr/2p5/p2pp1pp/5p2/1bN5/2P1P2N/PP1P1PPP/R1B1KB1R 从http://en.lichess.org/NCUnA6LV/white#14窃取) 输入:rnbqk2r/pp2p2p/2p3pb/3pP3/5P2/2N5/PPPP2P1/R1BQKB1R,e5d6 输出:(rnbqk2r/pp2p2p/2p3pb/8/5P2/2N5/PPPP2P1/R1BQKB1R 从http://en.lichess.org/AvgU4Skq/white#16窃取;这不是实际的举动,但是我不费心去寻找一个实际上具有过人之处的原子游戏: P) 输入:5r2/2k5/p1B5/1pP1p3/1P4P1/3P4/P7/1K3R1q,c6h1 输出:(5r2/2k5/p7/1pP1p3/1P4P1/3P4/P7/1K3R2 从http://en.lichess.org/l77efXEb/white#58盗取) 计分 这是code-golf,因此以字节为单位的最短代码获胜。
14 code-golf  chess 

14
实施模糊查找器
受此链接启发,我在Reddit上发现了该链接。 FuzzyFinder是许多文本编辑器的功能。当您开始输入文件路径时S,FuzzyFinder会弹出并显示当前目录中的所有文件,其中包含您输入的字符串,并按文件中的位置排序S。 您的任务是实现模糊查找器。它应该是采用(通过stdin,函数参数或命令行)一个字符串S和一个字符串列表的程序或函数,该字符串和字符串列表可以根据需要设置L格式,并返回或打印运行模糊查找器的结果。搜索应区分大小写。S您可以根据需要对多个字符串中处于相同位置的结果进行排序。 例: Input: mig, [imig, mig, migd, do, Mig] Output: [mig, migd, imig] OR [migd, mig, imig] 这就是代码高尔夫,所以最短的解决方案是成功的。
14 code-golf 

4
包装木片
有两块木头。两者都由笔直的身体和身体下方的一些额外的块组成。在(0索引)位置0、4、7、9、10处有额外块的示例块: XXXXXXXXXXX X X X XX 该片段可以表示为01二进制序列,第ith个字符显示在第ith个位置是否有块。上面的示例可以表示为10001001011。 我们可以通过垂直翻转第二个(或者也可以水平翻转)来将它们组合在一起。翻转后,我们可以找到一个对齐,可以将两部分放在一起以使其高度为3。 Two example pieces: XXXXXXXXXXX XXXXXXXX X X X XX XXX Second piece flipped vertically and horizontally: XXXXXXXXXXX X X X XX XXX XXXXXXXX Pieces put together: XXXXXXXXXXX XXXXX X XX XXXXXXXX 该示例的总宽度为12个块。 您应该编写一个程序或函数,该程序或函数接收两个字符串作为代表两个片段的输入,并输出一个高度为3 的最小可实现宽度的整数。 输入值 两个字符串,由字符0和组成1。 两个字符串均包含至少一个字符。 您可以选择将两个字符串作为一个字符串并由一个空格连接在一起。 输出量 一个正整数,可以达到的最小总宽度。 例子 0 …

1
安排四路停车
一排汽车在一个四向停车标志处排队等候前进。每个人都对下一步要走什么,谁要走什么方向等感到困惑。显然,次优。 您的工作是以最佳方式安排停车标志处的交通。 作为输入,您将收到4个转向请求字符串,其中四个基本方向之一。每个请求要么L向左,S向直线,要么R向右。 LLSLRLS SSSRRSRLLR LLRLSR RRRLLLL 第一行是交叉路口北入口的排队。排队的第一辆车希望向左转(即,向东出口)。随后的行用于传入的东,南和西入口。因此,第一辆来自西方的汽车希望从南方驶出。 交通经过一系列步骤。在每一步中,您都必须在其生产线的开头选择一部分汽车来进行。所选的汽车不得相互干扰。如果两辆汽车离开同一个方向或必须彼此相交(根据标准的右手驾驶规则),它们会相互干扰。因此,两辆都希望直行的相对汽车可能会走同一步。因此,可能有4辆车都希望右转。两辆相对的汽车可以同时向左转。 您的工作是按照最少的一系列步骤安排路口。对于每一步,输出一条直线,其中列出了传入汽车的指南针方向。对于上面的示例,最小计划为14个步骤。一个最小的时间表是: N [L from North] E [S from East] E [S from East] E [S from East] NESW [L from North, R from East, L from South, R from West] NE [S from North] EW [R from East] NESW [L from …
14 code-golf 

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.