编程拼图和代码高尔夫

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

12
前置,追加序列
任务 prepend,append-Sequence像这样递归定义 a(1)= 1 如果n是偶数,则a(n)= a(n-1).n 如果n为奇数,则a(n)= na(n-1) 哪里。表示整数串联。 因此,前几个术语是:1,12,312,3124,53124,531246,7531246,...这是A053064。 您的任务是,给定a> 0的整数以返回n,以使prenend,append-Sequence中的第n个元素等于a,如果不存在n则返回0,负数或错误输出等。 规则 输入可以作为整数,字符串,字符/数字列表等。 输出可以打印到STDOUT或返回(整数,字符串等都可以) 在输入无效的情况下,如果不存在这样的n,则您的程序可以执行任何操作,但返回正整数(例如,永远循环,返回0等)。 您可以选择使用0索引,但是如果不存在n,则输出不能为0 测试用例 1 -> 1 12 -> 2 21 -> 0 123 -> 0 312 -> 3 213 -> 0 211917151311975312468101214161820 -> 21 2119171513119753102468101214161820 -> 0 333129272523211917151311975312468101214161820222426283031 -> 0 999795939189878583817977757371696765636159575553514947454341393735333129272523211917151311975312468101214161820222426283032343638404244464850525456586062646668707274767880828486889092949698100 -> 100

3
解决手推车问题
哲学家们一直在思考台车问题。不幸的是,还没有人解决过这个问题。幸运的是,作为程序员,我们可以使用计算机为我们解决问题! 输入值 您的程序将输入一个(有限的)有向图(最多有一个从x到的边y,对于任何x和而言y),并带有一个指定的节点,并且在每个边上附加一个非负整数(表示与该轨道相关的人数) 。另外,每个节点至少具有一个出口边缘。 手推车从指定的节点开始。每次转弯时,如果手推车在节点处x,那么功利主义者就会选择一条边(x,y)。那个边缘的人死了,手推车现在处于边缘y。这个过程将永远持续下去。 请注意,人只能死一次,因此,如果边缘(x,y)将n人绑在其上,而手推车经过它们,例如,滑过100次,它仍然只会导致n死亡。 输出量 功利主义者以使死亡人数最小化的方式做出选择(这是有限的,因为只有有限的人)。您的程序将输出该号码。 输入格式 您可以按照自己喜欢的任何合理方式获取输入图。例如,您可以将其作为矩阵,并将指定的节点计为标记为0的节点。或者可以使用x1,y1,n1;x2,y2,n2;...。例如0,a,0;a,b,5;a,c,1;b,b,0;c,c,0,代表标准手推车问题(末尾带有循环)。 测试用例 0,a,0;a,b,5;a,c,1;b,b,0;c,c,0 -> 1(从0到a,从a到c(杀死一个人),然后继续将手推车从c循环到c)。 0,0,1;0,a,5;a,a,0 -> 1(保持从0到0,永远超过1个人), 0,a,5;0,b,1;a,a,1;b,b,6 -> 6(0-> a-> a-> a-> a-> ...(请注意,转到b的贪婪解是不正确的)) 0,a,1;0,b,5;a,b,1;b,a,1 -> 3(0-> a-> b-> a-> b-> ...) 0,a,1;0,b,1;a,a,0;b,b,0 -> 1(请注意,功利主义者可能采取两种不同的选择,即两者都只会杀死一个人) 这是代码高尔夫球,所以最短的答案会成功!祝好运。 注意:不会出现恶性循环,并且禁止多轨漂移。同样,尽管我更喜欢从阿西莫夫的三个定律来考虑这个问题,彼得·泰勒在沙盒中指出,这个问题在数学上等同于找到权重最低的rho(使循环返回自身的路径) 。

11
取字符串的平方根
动机 在此挑战中,您的任务是将两个字符串相乘,这自然会引入一种取字符串平方根的方法。 它是如何工作的? 给定一个字符串(例如pub),您需要做的第一件事就是确定每个字符的ASCII代码: "pub" -> [112, 117, 98] 接下来,[0..94]通过减去32每个值将这些代码映射到范围: [112, 117, 98] -> [80, 85, 66] 现在,您需要为每个值找到其根模95(例如40*40 % 95 = 80,也可以选择55): [80, 85, 66] -> [40, 35, 16] 最后,您将其映射回范围[32..126]并将其转换回字符串: [40, 35, 16] -> [72, 67, 48] -> "HC0" 的确"HC0" ⊗ "HC0" = "pub",您可以从这里的其他挑战中找到解决方案,以此来验证。 那些熟悉模算术的人可能注意到平方根模数95并不总是存在,例如,没有根2。在这种情况下,未定义字符串的平方根,并且您的程序/函数可能会崩溃,不确定地循环等。 为了方便起见,以下是具有平方根的字符列表(第一个是空格): !$%&)+03489:>CDGLMQVW]`bjlpqu 规则 您将编写一个将字符串(或字符列表)作为参数并返回任何平方根(如果存在)的程序/函数 您可以假设输入始终具有平方根 …

8
制作八角形文字
上周四,用户@SpookyGengar对他/她关于制作平方字的第一个挑战使我们感到高兴。如果我们将边数加倍怎么办? 挑战 以字符串形式使用您需要的任何合理格式的输入(string,chararray ...)并输出该输入的八角形表示形式(也可以使用任何合理的格式:string,strings的列表,charmatrix ...),如以下示例所示: Input: golf Output: golf o l l o f g l o o l g f o l l o flog Input: HelloWorld Output: HelloWorld e l l r l o o W W o o l r l l e d H l e …
14 code-golf  string 

5
计算曲线上一点的对映体
曲线是正方形网格上的一组点,这样,每个点在四个邻居的邻域中恰好有两个邻居,并且这些点形成单个连接的组件。即,由网格图上的点所引起的图对于单个周期是同构的。“感应”是指两个点在循环中不彼此相邻就无法触摸输入。 图中顶点V的对映体是距离V最远的顶点。对映体在偶数长度的循环中总是唯一的(并且网格图上的每个循环都是偶数长度的)。距离的测量应由循环本身引起,而不考虑下面的方格。 您的输入应为曲线图像。曲线将#在背景字符()之外的背景上用一系列数字符号()标记出来。曲线上的点之一将标记有P字符(“ pode”)。您的输出应与输入相同,除了一个曲线点应替换为A(“ antipode”)。 您可能会假设字符将被填充为矩形。您可以假设输入的第一行和最后一行和列将完全由空格组成(输入由背景填充)。或者,您可以假设第一行和最后一行和每一列都将包含一个曲线点(输入具有最小的填充)。 您可以作为单个换行符分隔的字符串,行的数组或单个字符的2D数组输入和输出此网格。输入和输出的选择应相同。如果您的语言允许,则可以通过在适当位置修改输入而不是返回修改后的字符串或数组来输出。 可能的输入: P# P## #P# ##### #####P# ####### #####P######### #####P######### ## # # # # # # # # # # # # # # ### ### ## ## # ### # # ### # # ### ### ### # # # ### # …

30
排序后获取数组的索引
今天的挑战是编写一个程序或函数,该程序或函数需要一个列表l并给出排序的l每个连续元素l出现的位置。 换句话说,输出最小值的索引,然后输出第二个最小值的索引,依此类推。 您可以假设输入数组仅包含正整数,并且至少包含一个元素。 测试用例: Input | Output (1-indexed) [7, 4, 5] | [2, 3, 1] [1, 2, 3] | [1, 2, 3] [2, 6, 1, 9, 1, 2, 3] | [3, 5, 1, 6, 7, 2, 4] [4] | [1] 当出现两个或多个具有相同值的元素时,它们的索引应从最小到最大依次出现。 这是代码高尔夫球,最少字节获胜!

23
计算矩阵向量
给定一个至少包含两个元素的整数数组,输出该数组的矩阵向量(定义如下)。 为了计算Matrix-Vector,首先旋转通过nsize - input数组以创建一个size的矩阵n x n,该数组的第一个元素位于主对角线之后。这形成矩阵部分。对于向量,垂直翻转输入数组。然后执行普通矩阵乘法。输出向量是结果。 例如, a = [1, 2, 3] 首先,将阵列向右旋转两次,以获得[3, 1, 2]和[2, 3, 1],然后将它们堆叠以形成3x3矩阵 [[1, 2, 3] [3, 1, 2] [2, 3, 1]] 接下来,垂直翻转数组以形成向量 [[1, 2, 3] [[1] [3, 1, 2] x [2] [2, 3, 1]] [3]] 执行通常的矩阵乘法 [[1, 2, 3] [[1] [[1+4+9] [[14] [3, 1, 2] …

20
递增和递减,同时递增一倍
输入: 非空列表/向量,其中每个元素包含一个值/字符,表示如果你能指望向上 或向下。我将使用1和-1,但是您可以选择任何喜欢的东西。您只能使用两个值,而不能分别使用1,2,3...和-1,-2,-3...来表示向上和向下。 挑战: 您将使用几何序列1、2、4、8、16、32 ...中的数字。每次开始计数向上或向下,都可以在增量计数1,然后2,然后4上等等。如果更改并开始计数的其他方式,那么你就减1,然后2,然后4等。输出将是最后得到的数字。 例子: 在下面的示例中,第一行是输入,第二行是您要递增/递减的数字,第三行是累积总和,最后一行是输出。 范例1: 1 1 1 1 1 1 1 1 1 1 1 2 4 8 16 32 64 128 256 512 1 3 7 15 31 63 127 255 511 1023 1023 范例2: 1 1 1 1 1 1 -1 -1 -1 …

1
突变硬化的奎因
您的任务是制作一个打印出自己的源代码的程序。 “嘿,我们已经面临这个挑战,而且挑战无穷!您为什么要再挑战一个?” 您可能会问,但这将是最困难的一项(希望如此)。 您的quine必须经过“突变强化”,这意味着即使在其中的任何一个字符被复制的地方,quine也必须输出原始程序的源代码。 例如,如果您有一个quine(以下示例不是用任何语言编写的,那只是伪代码): abcd 这些程序必须全部输出abcd: aabcd abbcd abccd abcdd (在每一个这些方案,a,b,c和d各自就地复制,这意味着复制的字符在原始字符后直接放置。) 规则: 适用标准标准规则。 多字节字符算作一个字符,并且重复时该字符不会“拆分”为相应的字节。 这是代码高尔夫球,因此以字节为单位的最短代码胜出!

6
用倍数覆盖一组
让我们一组整数大于1,并称之为X。我们将S(i)定义为X被i整除的所有成员的集合,其中i> 1。想从这些子集中选择一组集合,以便 他们的联合是集合X X的元素不在两个集合中。 例如,我们可以重新组合{3..11}为 {3,4,5,6,7,8,9,10,11} S(3): {3, 6, 9, } S(4): { 4, 8, } S(5): { 5, 10, } S(7): { 7, } S(11):{ 11} 有些集合不能用这种方式表达。例如,如果我们采用{3..12},12则是3和4的倍数,以防止我们的集合相互排斥。 某些集合可以多种方式表达,例如 {4..8}可以表示为 {4,5,6,7,8} S(4): {4, 8} S(5): { 5, } S(6): { 6, } S(7): { 7, } 但也可以表示为 {4,5,6,7,8} S(2): {4, …

6
n * k = dd0d00d其中d =…?
给定正整数n≤500: 找出最小的正整数k,以使n * k的十进制表示形式中的所有数字均为0或d,且1≤d≤9。 在不到30秒的时间内打印或返回d(有关“说明和规则”部分的详细信息,请参阅d)。 简单的例子 这是d的前30个值。 +----+-------+---------+---+ +----+-------+---------+---+ | n | k | n * k | d | | n | k | n * k | d | +----+-------+---------+---+ +----+-------+---------+---+ | 1 | 1 | 1 | 1 | | 16 | 5 | 80 | 8 …

6
您可以循环播放而不会崩溃吗?
我们很多人都熟悉Tron游戏。您可以控制放置在网格上的“ lightcycle”。灯光周期总是向前移动(尽管您可以控制方向),并在其后面留下永久的痕迹。如果碰到一条小路,就会崩溃! 此处的目标是确定给定路径是否为有效循环,也就是说,它返回到其起始点而不会“崩溃”。为此,我们假设我们从这一点开始(0,0)。输入形式为N2E1S2W1,具有一系列基本方向(Nis north,Eis east,依此类推),每个方向后跟移动该方向的距离。在此示例中,您将旅行 N2 : North 2 to (0,2) E1 : East 1 to (1,2) S2 : South 2 to (1,0) W1 : West 1 to (0,0) 如果一条路径在(0,0)不重复访问任何其他坐标的情况下结束,则该路径被认为是有效的(它(0,0)精确地访问了两次,一次在起点,一次在终点)。请记住,与上例相比,从(0,0)到(0,2),我们也必须访问(0,1)。 其他例子: input -> output N1E1S1W1 -> true N1E1N1E1S2W2 -> true N1S1E1W1 -> false // Visits (0,0) 3 times N4E2S2W4S2E2 -> …

3
计算树宽
无向图的树宽是图论中一个非常重要的概念。发明了许多图算法,如果您分解出具有小树宽的图,则该算法运行很快。 树宽通常根据树分解来定义。这是一个图以及该图的树分解,由维基百科提供: 树分解是一棵树,其中每个顶点与原始图的顶点子集相关联,具有以下属性: 原始图中的每个顶点都在至少一个子集中。 原始图中的每个边都在至少一个子集中拥有两个顶点。 分解中所有子集包含给定原始顶点的顶点都已连接。 您可以检查上述分解是否遵循这些规则。树分解的宽度是其最大子集的大小减去一。因此,以上分解为二。图的树宽是该图的任何树分解的最小宽度。 在此挑战中,将为您提供一个连接的,无向的图,并且您必须找到其树宽。 虽然很难找到树分解,但还有其他方法可以计算树宽。Wikipedia页面上有更多信息,但是此处未提及的计算树宽的一种方法(最小消除顺序宽度)是算法中常用的一种计算树宽的方法。有关此事实的论文,请参见此处。 在消除顺序中,一次消除一个图形的所有顶点。消除每个顶点后,将添加边,以将该顶点的所有邻居彼此连接。重复此操作,直到所有顶点消失。消除顺序宽度是此过程中要消除的任何顶点具有的最大邻居数。树形宽度等于消除顺序宽度的所有顺序中的最小值。这是一个使用此事实来计算树宽的示例程序: import itertools def elimination_width(graph): max_neighbors = 0 for i in sorted(set(itertools.chain.from_iterable(graph))): neighbors = set([a for (a, b) in graph if b == i] + [b for (a, b) in graph if a == i]) max_neighbors = max(len(neighbors), max_neighbors) graph = …

9
创建茎叶图
相关:验证茎叶图 输入值 一个非空的正整数列表。如果需要,可以将它们视为字符串。您不能假定它已排序。 输出量 一茎和叶情节的数字。在一个这样干和叶情节,数字排序为茎数十,那么适合的干所有的数字有他们的人值放入干,然后将所有的排序。在此挑战中,换行符将茎分开,而空格将茎和叶子分开。 您可以包括或排除非空词干之间的所有空词干。 测试用例 (列表可以采用您所用语言的默认列表,我在下面使用了JSON) 包括空茎: [1, 2, 3, 3, 3, 3, 3, 10, 15, 15, 18, 1, 100] 0 11233333 1 0558 2 3 4 5 6 7 8 9 10 0 [55, 59, 49, 43, 58, 59, 54, 44, 49, 51, 44, 40, 50, 59, …
14 code-golf  number 

14
短日期转换为英语长日期
将短日期格式转换为英文长日期(尽可能少的字节)。 输入值 输入将采用格式为的字符串形式,yyyy-mm-dd所有值都可选零填充。您可以假设这在语法上是正确的,但不一定是有效日期。负年份值不需要支持。 输出量 您必须将日期转换为英语长日期格式(例如14th February 2017)。此处不允许零填充。 如果日期无效(例如2011-02-29),则必须以某种方式进行识别。允许引发异常。 可以在下面看到更多示例。 测试用例 "1980-05-12" -> 12th May 1980 "2005-12-3" -> 3rd December 2005 "150-4-21" -> 21st April 150 "2011-2-29" -> (error/invalid) "1999-10-35" -> (error/invalid)

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.