Questions tagged «code-golf»

Code-golf是在最小的源代码字节中解决特定问题的竞赛。

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 

5
确定旋转矩形的尺寸
此堆栈代码段在黑色背景上绘制了一个别名白色矩形,并为其尺寸,位置,角度和网格尺寸提供了参数: <style>html *{font-family:Consolas,monospace}input{width:24pt;text-align:right;padding:1px}canvas{border:1px solid gray}</style><p>grid w:<input id='gw' type='text' value='60'> grid h:<input id='gh' type='text' value='34'> w:<input id='w' type='text' value='40'> h:<input id='h' type='text' value='24'> x:<input id='x' type='text' value='0'> y:<input id='y' type='text' value='0'> θ:<input id='t' type='text' value='12'>° <button type='button' onclick='go()'>Go</button></p>Image<br><canvas id='c'>Canvas not supported</canvas><br>Text<br><textarea id='o' rows='36' cols='128'></textarea><script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><script>function toCart(t,a,n,r){return{x:t-n/2,y:r/2-a}}function vtx(t,a,n){return{x:n.x+t*Math.cos(a),y:n.y+t*Math.sin(a)}}function sub(t,a){return{x:t.x-a.x,y:t.y-a.y}}function dot(t,a){return t.x*a.x+t.y*a.y}function inRect(t,a,n,r){var …

1
用俄罗斯方块件连接间隙
您应该编写一个程序或函数,以给定的俄罗斯方块块列表作为输入输出,或者返回可以连接的相同高度级别的两点之间的最大间隙。 俄罗斯方块的7种类型如下: 我们将分别用字母I,J,L,O,S,T和Z指代它们的形状。您可以旋转棋子,但不能像俄罗斯方块游戏中那样镜像它们。 我们的任务是从给定的零件中创建一个正交连接的区域(与侧面相连的侧面)。该区域应连接(也正交)两个高度相同的单元正方形。我们应该在可以桥接的两个正方形之间找到最大的差距。 详细的例子 用L片我们可以连接3个间隙 L XLLLX 用S片我们可以连接2的间隙 SS XSSX 对于S,S,O,我们可以连接7的间隙(请注意,我们不能连接8的间隙) S XSSOO SSX SOOSS 输入值 一个字符串,表示仅包含大写字母I,J,L,O,S,T和Z的可用片断。每个字母代表完整的俄罗斯方块片断。 字母将在字符串中按字母顺序排列。 该字符串将至少一个字符长。 输出量 单个正整数,与给定件可连接的最大间隙。 例子 输入=>输出 OSS => 7 LS => 5 LZ => 6 ZZZZ => 10 LLSSS => 14 IIJSSSTTZ => 28 IISSSSSS => 24 OOOSSSSSSSSSSSSTT => 45 IJLOSTZ => …
14 code-golf  tetris 

4
LOLCODE打高尔夫球的秘诀
您对LOLCODE打高尔夫球有什么一般提示?我正在寻找可以应用于编码高尔夫球问题的想法,这些想法至少在某种程度上特定于LOLCODE。(例如,“删除评论”不是答案)。请为每个答案发布一个提示。
14 code-golf  tips 

12
按数字拆分,按字符串连接,重复
考虑以下过程: 以一个非负整数N. 如27。 将其拆分为整数N - floor(N/2)和floor(N/2)(“较大”和“较小”的一半)并按该顺序写入。 例如27成为14 13。 删除空间以将整数连接成一个更大的新整数。 例如14 13成为1413。 重复步骤2和3所需的次数。 例如1413→交通707 706→交通707706→交通353853 353853→交通353853353853→交通... 这项挑战就是要做到这一点,但并不总是在基础10中。 挑战 编写一个包含三个数字B,N和S的程序: B是2到10的整数,它是N的底数(二进制到十进制)。 N是非负整数,适用于拆分重新合并过程。为了使用户输入更容易,它以B 的字符串而不是整数给出。 S是一个非负整数,它是重复拆分-重新加入过程的次数。 程序的输出是经过S个拆分连接过程后,基数B中N的字符串表示形式。 当S 0为时,不进行拆分,因此输出始终为N。 当N 0为时,所有拆分均具有形式0 0并0再次减小为,因此输出始终为0。 例子 B = 10, N = 27, S = 1 → 1413 B = 10, N = 27, S = 2 → …

1
十二硬币问题
背景 十二硬币问题是工作面试中常用的经典平衡难题。这个难题第一次出现在1945年,当我祖父要求嫁给我的母亲时,就把它摆给了我父亲!拼图中有十二个硬币,其中一个比其他硬币重或更轻(您不知道哪个)。问题是要使用三次天平来确定唯一硬币。在某些变型中,还需要识别硬币是较重还是较轻。 这里的任务涉及解决涉及n的一般问题硬币,在最坏的情况下使用尽可能少的称量。不必识别硬币是较重还是较轻,只需识别它是哪一个。此外,您无权访问给定集合之外的任何其他硬币(奇怪的是,这有所作为)。 事实证明,k个称重足以容纳多达(3 ^ k-1)/ 2个硬币(因此,此变体中的4个称重实际上可以处理13个硬币)。此外(令人惊讶的是),可以(但不是必需)预先选择整套称量,而不用将来的称量取决于过去的结果。有关两种可能的解决方案的说明,请参见本文和Quora答案。 任务 编写一个函数或程序,通过STDIN,命令行参数或函数参数将整数n作为输入,这可以解决n个硬币的问题,并在最坏的情况下使用最少的权重。该程序应: 以格式1,2,3-4,5,6将称量结果打印到STDOUT上,以指示秤两边的硬币列表。任何未称重的硬币都不应提及。硬币从1到n隐式编号,不需要按数字顺序打印(因此2,1-3,4与相同1,2-3,4)。 之后的每个称重程序应等待经由STDIN的输入,这应该是<,=或>,指示刻度的左侧是否比右侧打火机,同样的,或更重。 在最后一次称量结果之后,程序应打印或返回唯一硬币的编号。 该程序无需处理来自用户的不一致的结果输入。 程序不需要处理n小于3。 输出示例 >> 3 1-2 >> = 1-3 >> < 3 # using Quora algorithm >> 13 1,2,3,4-5,6,7,8 >> < 1,2,5-3,4,6 >> > 3-4 >> < 3 # using paper algorithm >> 13 1,2,3,4-5,6,7,8 >> < 2,6,7,9-3,8,10,11 …

13
串联整数的最大和最小值
这个问题来自于每个软件工程师应该在不到1小时的时间内解决的五个编程问题,这本身就是一个有趣的阅读。前几个问题很简单,但第四个问题可能会更有趣。 给定在标准输入上用单个空格分隔的整数列表,请打印出可以通过将整数在自己的行上连接在一起而获得的最大值和最小值。 例如: 输入: 5 56 50 输出: 50556 56550 各种程序点: 结果的顺序从小到大。 只能打印出最小值和最大值(对所有变化进行迭代,然后将它们打印出来是无效的)。 列表中将始终有两个或多个整数。 最大和最小结果可能相同。在输入的情况下5 55,该数字555应打印两次。 整数不一定是不同的。5 5是有效的输入。 领先0于整数s是不是有效的输入。你会不会需要考虑05 55。 因为这是代码高尔夫,所以最短的入场券获胜。
14 code-golf  number 


6
失控舍入错误
背景 您最近被一家小型会计师事务所雇用。会计的世界对您来说有点陌生,因此您不确定是否要遵循所有专业准则。特别是,您不知道何时应该将所有这些数字取整,以及朝哪个方向取整,因此,大多数时候您只希望将其取整,并希望取得最好的结果。 输入值 您的输入是代表简单计算的单个字符串。它包含一些由字符分隔的非负整数+-*/。字符串从左到右读取,并且普通优先级规则将被忽略,因此"23+1*3/4"表示“以23开头,加1,乘以3,再除以4”,结果为18。输入将不包含以开头的数字0(0自身除外),也不能除以零。 输出量 在计算的每个阶段,您都可以将结果向上或向下舍入为最接近的整数,或者保持原样。最后,向上或向下舍入以获得整数结果。您的输出是可能由这种计算产生的整数列表,排序后没有重复。 规则 您可以编写完整的程序或函数。最低字节数获胜,并且不允许出现标准漏洞。 测试用例 "42" -> [42] "2+0+4-0" -> [6] "23+1*3/4" -> [18] "5/2" -> [2,3] "5/2+7/3*6-1" -> [17,18,19,23] "23/2/2*30-170/3" -> [-7,-6,-2,-1,0,1,3,4] "1/3*2*2*2*2*2*2" -> [0,16,20,21,22,24,32,64] "1/3*9" -> [0,3,9]

4
用斜线绘制随机游走
编写一个程序或函数,该程序或函数采用正整数N(通过stdin /命令行/函数arg)并打印或返回由N个长步长(由斜杠引出)的二维随机游走的字符串表示形式:(/ \加上空格和换行符)。 2D随机游动从无限整数晶格的原点开始。然后,重复N次,随机地均匀选择基本方向(上,下,左,右),并且助行器在该方向上移动一个单位。采取的最终路径是随机游走。 这是N = 6时的随机游走。请注意,到达(-1,3)时,它会向后移动。 为了用斜线画出它,我们实际上需要将整个对象顺时针旋转45°。斜线版本中未绘制轴以及起点和终点。 / \ \ /\ 像这样的更复杂的步行(N = 20,尽管无法分辨): 会变成这样: / /\/ /\ \/\/ /\/ \/ 您的程序需要生成这些类型的斜杠版本的随机游走。您必须随机选择步行要走的每个新方向,因此程序每次运行一定的N几乎肯定会产生不同的步行。(伪随机性很好。) 最低和最高斜杠上方或下方不得有任何空行(除了一个可选的尾随换行符),并且最左边和最右边的斜杠之前或之后绝对不应有空格的空列。 因此,对于N = 1,输出始终为/或\,但永远不会像这样: / 只要不超过最右斜杠的列,就可以使用尾随空格。 字节最少的提交将获胜。这是一个方便的字节计数器。

1
在正方形中找到对称
编写一个包含正整数列表的程序或函数。这些整数均表示2D平面上正方形的边长。每个正方形都可以移动到平面中的任何整数坐标,但不能旋转,也不能与其他正方形重叠。 对于每个正方形(不包括用于空白的空格)使用不同的可打印ASCII字符,您的程序/函数需要打印具有水平或垂直反射对称线的正方形的任何单个排列。如果不存在这样的安排,则不应该打印任何内容。 正方形是不同的字符,因此可以区分它们。只有所有正方形的并集形成的形状才需要对称。您可以假定该列表将包含不超过94个元素(因为有94个字符)。 例如,如果输入为[2, 1, 2, 2, 2],则可能的输出为: DD-- DD-- Z FFPP FFPP 此形状具有一条反射对称的水平线;它的上半部分和下半部分是镜像。还有其他一些可能性:(请注意,不需要触摸正方形,并且只要没有两个正方形由同一字符组成,就可以使用任何字符。) 55 55 %% %% @ HH HH (( (( G 11 33 11 33 22 44 22 44 对称线也可以是字符之间的边界,例如[2, 4]: !!!! !!!! ++ !!!! ++ !!!! 某些正方形无法对称排列,例如[1, 2, 3]: AAA BB C AAA BB (these can't …

3
取消合并清单
介绍 你们中的大多数人都熟悉用于对数字列表进行排序的合并排序算法。作为该算法的一部分,我们编写了一个名为的辅助函数merge,该函数将两个排序列表组合为一个排序列表。在类似Python的伪代码中,该函数通常如下所示: function merge(A, B): C = [] while A is not empty or B is not empty: if A is empty: C.append(B.pop()) else if B is empty or A[0] ≤ B[0]: C.append(A.pop()) else: C.append(B.pop()) return C 这个想法是继续弹出和中的前几个元素中较小的一个A,B直到两个列表都为空,然后将结果收集到中C。如果A和B都被排序,则也是如此C。 相反,if C是一个排序列表,我们将其分为任意两个子序列A和B,然后A和B也进行排序和merge(A, B) == C。有趣的是,如果C未排序,则不一定成立,这使我们面临挑战。 输入值 您的输入是其中一些的第一个2*n非负整数的排列,以列表形式给出。[0, 1, 2, ..., 2*n-1]n > …

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.