编程拼图和代码高尔夫

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

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 

9
不对称KOTH:抓住猫(猫螺纹)
不对称的KOTH:抓住猫 更新: 由于Controller.java没有捕获到异常(仅错误),因此更新了主文件(包括新的子任务)。现在,它确实可以捕获错误和异常并打印它们。 这个挑战包括两个线程,这是cat线程,catcher线程可以在这里找到。 控制器可以下载 此处。 这是一个不对称的KOTH:每个提交都是猫还是一个捕手。每对猫和捕手之间都有游戏。猫和捕手的排名各不相同。 捕手 六角形网格上有一只猫。您的任务是尽快捕获它。每转一圈,您都可以在一个网格单元上放置一个水桶,以防止猫能够去那里。但是猫不是(也许)那么笨,每当您放置一个桶时,猫都会移动到另一个网格。由于网格是六角形的,因此猫可以向6个不同的方向移动。您的目标是用水桶包围猫,速度越快越好。 猫 您知道捕手想通过在您周围放水桶来接住您。当然,您会设法逃避,但是由于您是一只懒惰的猫(就像猫一样),您当时确实迈出了一步。这意味着您不能待在同一个地方,而是必须移至周围的六个景点之一。每当您看到捕手放了一个新的水桶时,您就会进入另一个牢房。当然,您尝试逃避的时间越长越好。 格网 网格是六边形的,但是由于我们没有六边形的数据结构,因此我们采用一个11 x 11正方形的2d数组并模仿该六边形的“行为”,即猫只能在6个方向上移动: 拓扑是环形的,这意味着如果您踩到阵列“外部”的单元格,您将被转移到阵列另一侧的相应单元格。 游戏 猫从网格中的给定位置开始。捕手可以先走,然后猫及其捕手交替走动,直到猫被抓到为止。步骤数是该游戏的分数。猫试图获得尽可能高的分数,捕手试图获得尽可能低的分数。您参与的所有游戏的平均总和就是您提交的分数。有两个单独的等级,一个用于猫,一个用于捕手。 控制者 给定的控制器是用Java编写的。作为捕手或猫,您每个人都必须完整地实现一个Java类(已经有一些原始示例)并将其放置在players包中(并更新Controller类中的猫/捕手列表),但是您也可以编写该类中的其他功能。控制器随附了简单的cat / catcher类的每两个工作示例。 该字段是一个11 x 112D int数组,用于存储单元格当前状态的值。如果一个单元格为空,则它具有值0;如果有一只猫,它具有值-1;如果有一个存储桶,则有一个值1。 您可以使用一些给定的功能:isValidMove()/ isValidPosition()用于检查您的移动(cat)/位置(catcher)是否有效。 每次轮到您时,takeTurn()都会调用您的函数。参数包含当前网格的副本,并具有类似于read(i,j)读取处的单元格的方法(i,j),以及isValidMove()/ isValidPosition()检查答案是否正确的方法。这也可以管理环形拓扑的环绕,这意味着即使网格只有11 x 11,您仍然可以访问单元格(-5,13)。 该方法应返回一个int包含两个元素的数组,这些元素代表可能的移动。对于猫来说,{-1,1},{0,1},{-1,0},{1,0},{0,-1},{1,-1}它们代表了猫想去的位置的相对位置,而捕手则返回了他们想要放水桶的位置的绝对坐标{i,j}。 如果您的方法产生无效举动,则您的提交将被取消资格。如果在您的目的地已经是一个铲斗或不允许该举动/目的地已经被占用(作为猫),或者如果已经有一个铲斗/猫(作为捕手),则该举动被视为无效。您可以使用给定的功能事先检查一下。 您的提交应该相当快地工作。如果您的方法每个步骤花费的时间超过200毫秒,则也将被取消比赛资格。(最好少得多...) 程序可以在步骤之间存储信息。 意见书 您可以根据需要进行任意数量的提交。 请不要显着改变您已经提交的内容。 请每个提交一个新的答案。 每个提交最好都具有唯一的名称。 提交内容应包括您班级的代码以及可以告诉我们您提交内容的工作方式的描述。 您可以在<!-- language: lang-java -->源代码前写一行,以自动突出显示语法。 计分 所有猫都将与所有捕手竞争相同的次数。我将尝试经常更新当前分数,当活动减少时将确定获胜者。 这项古老的Flash游戏启发了这一挑战 感谢@PhiNotPi进行测试并提供一些建设性的反馈。 …

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 > …

7
使用L形的Tromino将2 ^ N x 2 ^ N网格平铺
当初次向学生讲解数学归纳的证明技术时,一个常见的示例是将2个N ×2 N的网格与L形的Tromino砖砌在一起的问题,从而将一个预定的网格空间留空。(N是一些非负整数。) 如果您还不知道,我将交给您查看证明。有很多讨论它的资源。 您的任务是编写一个程序,该程序使用N的值以及要保留为空的网格空间的坐标,并输出所生成的Tromino平铺网格的ASCII表示形式。 角色O将填充空白区域,并且我们的Tromino旋转4次将如下所示: | +- | -+ -+ | +- | (是的,它可以是含糊其+与去-和|某些安排,但没关系。) 您的程序必须在N = 0(对于1×1网格)下工作,至少N = 8(对于256×256网格)。将给出x和y值,它们是的坐标O: x是水平轴。x = 1是左侧网格边缘,x = 2 N是右侧网格边缘。 y是垂直轴。y = 1是顶部网格边缘,y = 2 N是底部网格边缘。 x和y都始终在[1,2 N ] 范围内。 因此,对于给定的N,x和y,您的程序必须输出2 N ×2 N的网格,该网格完全用L形的三角骨平铺,但x,y网格坐标为O。 例子 如果N = 0,则x和y必须都为1。 O 如果N = 1,x = 1,y …

4
螺旋编程
编写一个命名函数或程序,该函数或程序接受单个整数N并打印(至STDOUT)或返回(作为字符串)下面螺旋的前N个条,从中心的竖线开始并顺时针向外螺旋。 _______________ / _____________ \ / / ___________ \ \ / / / _________ \ \ \ / / / / _______ \ \ \ \ / / / / / _____ \ \ \ \ \ / / / / / / ___ \ \ \ \ \ \ …

4
求ax + b的最大值
您将获得(a,b)列表和x列表。计算每个x的最大ax + b。您可以假设a,b和x为非负整数。 您的程序或函数必须在预期的时间内运行(如果您的代码涉及到该随机性,而不是输入,则为随机性)O(n log n)时间,其中n为总输入长度(两个列表的总和或最大值)。 这是代码高尔夫球。最短的代码获胜。 例 [[2 8] [4 0] [2 1] [1 10] [3 3] [0 4]] [1 2 3 4 5] 输出: [11 12 14 16 20] 说明: 11 = 1*1 + 10 12 = 1*2 + 10 = 2*2 + 8 14 = 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.