编程拼图和代码高尔夫

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

3
重构排列
介绍 假设您获得了n对象的随机排列。排列被密封在一个盒子中,因此您不知道n!它是哪种。如果设法将置换应用于n不同的对象,则可以立即推断出其身份。但是,只允许将置换应用于长度n二进制矢量,这意味着您必须多次应用置换才能识别它。显然,仅将其应用于n向量1就可以完成工作,但是如果您很聪明,则可以使用log(n)应用程序来完成。但是,该方法的代码将更长。 这是一项实验性挑战,您的分数是代码长度和查询复杂度的组合,这意味着对辅助过程的调用次数。规格有点长,请耐心等待。 任务 您的任务是编写一个命名函数(或最接近的对等函数) f,该函数使用基于0或基于1的索引作为输入n,并使用正整数和p前n整数的排列作为输入。其输出是排列p。但是,不允许您p直接访问排列。您唯一可以做的就是将其应用于任何n位向量。为此,您应该使用一个辅助函数P,该函数接受一个置换p和一个bits向量v,并返回其p[i]th坐标包含bit 的置换向量v[i]。例如: P([1,2,3,4,0], [1,1,0,0,0]) == [0,1,1,0,0] 您可以将“位”替换为任意两个不同的值,例如3和-4,或'a'和'b',并且它们不需要固定,因此可以P在[-4,3,3,-4]和[2,2,2,1]的同一调用中使用两者进行调用f。的定义P不会计入您的分数。 计分 解决方案在给定输入上的查询复杂度是它对辅助函数进行的调用次数P。为了使此度量明确,您的解决方案必须是确定性的。您可以使用伪随机生成的数字,但随后还必须为生成器确定初始种子。 在此存储库中,您将找到一个名为的文件permutations.txt,该文件包含505个排列,使用从0开始的索引(在从1开始的情况下,增加每个数字),每个长度在5到50之间(含150和150)之间。每个排列都在其自己的行上,并且其编号由空格分隔。您的分数是这些输入的字节数f+平均查询复杂度。最低分获胜。 额外规则 最好使用带说明的代码,并且不允许出现标准漏洞。特别是,各个位是无法区分的(因此,您不能给Integer对象提供矢量P并比较它们的身份),并且该函数P始终返回一个新矢量,而不是重新安排其输入。您可以自由更改和的名称f以及P它们接受参数的顺序。 如果您是第一个使用您的编程语言回答的人,我们强烈建议您包括一个测试工具,其中包括该函数的实现,该实现P还计算调用它的次数。例如,这是Python 3的工具。 def f(n,p): pass # Your submission goes here num_calls = 0 def P(permutation, bit_vector): global num_calls num_calls += 1 permuted_vector = [0]*len(bit_vector) for i in range(len(bit_vector)): permuted_vector[permutation[i]] = bit_vector[i] return permuted_vector …

7
用打乱的钥匙打字
您的朋友不太擅长使用计算机,所以有人打扰他键盘上的字母(az)成为一个恶作剧。当他坐下来尝试在键盘上键入自己的名字时,他意识到字母被打乱了,要求您的帮助。 您很聪明,所以您知道,如果他键入他的名字,然后重复输入屏幕上出现的内容而不是他的名字,他最终将成功输入他的名字。您也很友善并重新排列了按键,但想知道要成功旋转几圈。 您的任务是编写给定字母改组的程序或函数,而朋友的名字将计算转数。 输入详细信息: 以方便您的语言的结构形式输入了两个字符串作为输入。 第一个字符串是按照旧字母的字母顺序列出的新小写字母的列表。(第一个字符位于的位置a,最后一个字符位于的位置z。)字符串中总是会发生一些变化。 第二个字符串是名称。它可以包含任何可打印的ascii字符,但是只有大写和小写字母字符会被打乱。这个名字本身可能不会被改组。 输出详细信息: 输出是单个整数,最小所需匝数。换行符是可选的。 例子: 输入:( 'abcfdeghijklmnopqrstuvwxyz' 'Mr. John Doe'更改了d,e,f个位置) 输出:( 3显示的名称是:Mr. John Fod=> Mr. John Eof=> Mr. John Doe) 输入: 'nopqrstuvwxyzabcdefghijklm' 'Mr. John Doe'(ROT13密码) 输出:( 2任何包含字母的输入名称都会2四舍五入以产生原始名称。) 输入: 'aebcdjfghiqklmnopzrstuvwxy' 'John Doe' 输出: 140 这是代码高尔夫球,因此最短的条目将获胜。

9
将人类可读的时间间隔转换为日期分量
挑战 编写将人类可读的时间间隔转换为以下形式的日期部分的最短程序: {±YEARS|±MONTHS|±DAYS|±HOURS|±MINUTES|±SECONDS} 样品盒 每个测试用例都是两行,输入后跟输出: 1 year 2 months 3 seconds {1|2|0|0|0|3} -2 day 5 year 8months {5|8|-2|0|0|0} 3day 9 years 4 seconds -5 minute 4 years 4 years -3seconds {17|0|3|0|-5|1} 规则 你不能使用 strtotime或任何内置函数来完成整个工作。 最短的代码获胜(字节) 您可以将输出打印到stdout或文件中,结果也可以由函数返回,这取决于您 令牌可以是单数或复数形式。 组件可能是随机的 数字和令牌之间可能没有空格 时间间隔为正时(输入和输出),符号是可选的 如果组件出现多次,则应添加值 每个组件都有自己的符号 组件应分开处理(例如80 minutes在输出中保留为80) 输入保证为小写 高尔夫快乐!
16 code-golf  string  date 

2
得分游戏《王国建设者》
我想在这里尝试一种新的代码高尔夫形式。与奖金类似,并非必须完成挑战的所有部分,但每个答案都必须实现一定规模的子集(并且每个答案都必须实现一个核心)。因此,除了打高尔夫球之外,这项挑战还涉及选择一套可以完美搭配的功能。 规则 Kingdom Builder是一种棋盘游戏,在(尖顶)十六进制网格上播放。该评估板由四个(随机的)象限组成,每个象限具有10x10的十六进制单元(因此完整的评估板将为20x20)。出于此挑战的目的,每个十六进制单元格包含水(W),山(M),城镇(T),城堡(C)或为空(.)。所以象限看起来像 . . W . . . . . . . . M W W . . . . . . . M . . W . . . T . M M . W . . . . . . . . M . W W …

5
完美玩Wythoff的Nim
您的目标是为Wythoff的Nim游戏编写一个完美的玩家。 威索夫的尼姆规则 Wythoff的Nim是确定性的两人游戏,有两堆相同的计数器。玩家轮流进行以下操作之一: 从第一堆中删除一个或多个计数器 从第二堆中删除一个或多个计数器 从第一堆和第二堆中删除相同数量的计数器(一个或多个)。 当然,筹码不能为负,但可以为0。无论哪个玩家移除最后一个计数器,整体都会获胜。 对于更注重几何的人,这里是您可以在此applet上玩的等效游戏。单个女王从四分之一无限棋盘的某个正方形开始,该正方形的角在左下角。玩家交替移动皇后,其移动方式类似于国际象棋皇后,但仅限于三个方向: 下 剩下 斜向左下 将女王移到角落的人都将获胜。 将女王的坐标(带有角(0,0))与各个桩的大小相关联,很容易看出两个游戏是相同的。 完美发挥 (如果您熟悉完美比赛和获胜手法的概念,则可以跳过此步骤。) 由于Wythoff的Nim是一种有限的确定性游戏,因此它具有完美玩法的概念。完美的玩家是一种始终会从理论上获胜的位置获胜的策略,这意味着存在一种能够确保获胜的策略的位置。 作为获胜策略,只要将刚移动的玩家始终移动到理论获胜位置即可,因此该玩家不会继续前进。这些获胜职位中的第一个(也称为冷职位)是(0,0), (1,2), (2,1), (3,5), (5,3)。有关为Wythoff的Nim寻找获胜策略的算法的解释以及生成获胜位置的公式,请参阅Wikipedia文章。 计划要求 编写程序或函数时,将一个位置作为输入,并以该位置之后的位置形式输出获胜的位置。最少的字节数获胜。 如果不存在获胜举动,即该头寸是理论上的亏损,则您的程序应表明是这样,否则将被没收。 您的程序必须在合理的时间内运行。因此,指数递归游戏树搜索将无法满足要求。如果您想对策略进行预计算和硬编码,那很好。 输入值 一对(i,j)非负数,代表堆大小,每个最多为99。它可以是两个数字,一个元组,一个列表或您喜欢的任何容器。 输出量 移动后打印或输出位置,再次以两个数字或一个容器的形式输出。这必须是合法转移到获胜职位。如果有多个这样的举动,那么任何一个都可以,但是只有一个。 如果没有获胜的举动,则必须在输出中指出。只要不是合法位置,并且对于每一个丢失的输入都是相同的,则任何输出False(None,,0或)(-1,-1)都可以。 运行示例 f(5,0) = (0,0) f(2,2) = (1,2) # Or (2,1) or (0,0) f(1,2) = False f(13,9) = (13,8) # Or …

17
查找序列中具有最大1的子字符串
介绍 我想找到最子串1的在序列0的和1的。 输入值 您的程序有两个输入,即序列和子字符串长度。 该序列是任意数量的0“和1”: 01001010101101111011101001010100010101101010101010101101101010010110110110 的子串长度是任意的正的非零整数: 5 输出量 您的程序应输出给定长度的第一个子串的起始索引,该子串包含最多1的。使用以上输入,输出为: 10 字符串中的第一个字符从索引处开始0。 计分 最短的代码胜出! 规则 您的程序必须始终为任何有效输入输出正确的索引。 您可以从默认选项为正的任何答案中选择输入/输出方法。请指定您在答案中选择的方法。

2
拒绝的好时机
设置 假设你给ñ保险丝,1≤ ñ ≤5,每一个都是一米长,其中每个保险丝具有的相关燃烧率ñ每米d小时。 保险丝可以在一端或两端点亮,然后在一端或两端熄灭,重新点亮,重新熄灭等,直到保险丝完全耗尽为止。您可以立即点亮和熄灭保险丝,并且可以观察到保险丝完全耗尽(烧毁)的确切时间。 保险丝不能切断,也不能在除其末端以外的任何地方点亮。 通过测量任意两个保险丝点亮/消耗事件之间的时间,这样的设置允许无限精确的计时系统。例如,给定两个保险丝,其每小时的燃烧速度为1米,则您可以精确地测量45分钟(3/4小时) 同时:在两端点亮第一个保险丝,在一端点亮第二个保险丝,并标记时间间隔的开始 消耗第一根保险丝的瞬间(30分钟后)点亮第二根保险丝的第二端 在消耗第二根保险丝的瞬间(15分钟后)标记时间间隔的结束 挑战 给定小时数t的分数,以及代表n个保险丝的确切烧毁率的n 个分数的集合,编写一个程序或函数,如果可以通过系统性地熔断保险丝来精确地测量t小时,则输出或返回真实值。否则为假值。 程序的输入可以是以下任意一项: 形式的命令行参数 TN/TD N1/D1 N2/D2 N3/D3 ... TN/TD N1/D1 N2/D2 N3/D3 ...读取stdin或等效形式的字符串 TN/TD N1/D1 N2/D2 N3/D3 ...作为函数参数传递的形式的字符串 ["TN/TD", "N1/D1", "N2/D2", "N3/D3", ...]作为函数参数传递的字符串数组 在所有情况下,t = TN/ TD,其中TN,TD∈[1,10000]。 同样地,在所有的情况下:燃烧速率为熔丝我 = Ñ 我 / d 我 = N<i>/ D<i>,其中N<i>,D<i>∈[1,10]∀ 我。 …

1
为老板编写英文
您的老板最近了解了这种有趣的编程语言,称为英语。他有这个“革命性”的想法,他想和您一起编码以使编码生产率提高一倍!由于他不是一个精通技术的人,他希望您为此编写一个编译器,以便他也可以编码! 现在,您是个懒惰的程序员,显然不会编写程序来编译这种可笑的复杂语言。相反,您将确保老板的代码中始终存在错误,以使他永远不会进入实际的编译过程,并且卡在修正语法错误而不是编码上。 挑战在于编写一个可以从终端运行的程序,并接受文件路径作为参数。该程序必须: 通过输入错字来修改文件输入。 由于遇到您输入的错字,假装编译失败。 在相同文件的副本上运行该程序不应连续两次引入相同的错字。 为了说明这一挑战,请在此文件上运行程序: Take an array as input. Sort the array. Output the array. 应该按照 Error on line 1: 'Take an arqay as input.' ^ arqay is not a valid identifier. 现在,您告诉程序进行编译的文件应如下所示: Take an arqay as input. Sort the array. Output the array. 以下是有关程序规格的更多详细信息: 您的程序可以假定将老板输入的程序中的任何字符换成其他随机字符都会导致语法错误。您的程序不应使用非字母字符在老板代码中创建错误。您的老板永远不会使用数字或符号,而他会发现有什么问题。您的程序只应在老板程序中的单词上引入错误。不要更改句子或标点符号中的空格。您的程序不应更改老板尝试编译的程序的大小写,这意味着诸如此类arQay的错误是无效的。这可以防止这样的错误take,而不是Take发生或Array代替array。您的程序应通过首先指出错误所在的行来输出错误: Error …
16 code-golf 

10
撤消平方根
您的工作是将小数转换回整数的平方根之和。结果必须具有至少6个有效十进制数字的精度。 输入: 一个数字表示平方根数,一个十进制表示近似数。 输入示例: 2 3.414213562373095 输出:整数分隔的空格,当平方根和加起来时,它们近似于原始十进制,至少精确到6个有效十进制数字。 解决方案中不允许零。 如果有多种解决方案,则只需打印一种。 输出示例(任意顺序): 4 2 这是因为Math.sqrt(4) + Math.sqrt(2) == 3.414213562373095。 这是代码高尔夫。最短的代码(带有可选的奖金)获胜! 总会有一个解决方案,但是如果在没有整数的解决方案的情况下您的程序输出“ No”,则表示-10。此外,如果您的程序打印所有解决方案(用换行符,分号或其他分隔符),而不是仅打印一个,则为-10。 测试用例: 3 7.923668178593959 --> 6 7 8 2 2.8284271247461903 --> 2 2 5 5.0 --> 1 1 1 1 1 5 13.0 --> 4 4 9 9 9 --> 81 …

14
外观:重新讨论Conway
到现在为止,您应该都熟悉Conway序列(又名“观望”序列): 1 11 21 1211 111221 312211 etc 您也可以以任意数字作为起点。让它f(s)成为序列的下一个元素。现在,对于每个给定的s我们都可以找到f(s)。相反的是不是微不足道的:它是不是每一个y可能找到的前身s这样f(s) = y。例如,因为y = 1我们找不到前任。但是,如果长度y是偶数,则可以将其划分为成对的数字,以描述前任的每个部分: 513211 divides in 51,32,11 so: 51 comes from 11111 32 comes from 222 11 comes from 1 put together: 111112221 因此,通过这种方式,我们可以为每个偶数长度定义一个唯一的前任y。 注意:用s这种方法定义的“前任” 通常不满足f(s) = y。 目标 编写一个接受数字串作为输入的函数/程序片段 如果输入字符串的长度为奇数,则计算Conway序列的下一个元素 如果输入字符串长度为偶数,则按上述定义计算输入字符串的前任。 以字节为单位的最短代码获胜。 基于外观序列的最新问题: 看并说顺序 无指向的说出顺序 快速查找外观序列的第n个术语的长度
16 code-golf 

5
蒙德里安绘画描述语言
挑战在于为Mondrian绘画描述语言(MPDL)编写解释器。 语言定义 该语言在矩形堆栈上运行。矩形由其左上坐标和右下坐标定义。坐标必须是整数。使用具有属性的单个矩形初始化堆栈(1,1,254,254) 每个命令具有以下格式: <character><integer> 有以下三个命令: v<integer>:在参数中指示的位置(以百分比表示)上对堆栈中的最新矩形执行垂直分割。将源矩形从堆栈中删除,并替换为拆分产生的两个新矩形。左边的矩形被压入堆栈,然后是右边的矩形。由于矩形坐标是整数,因此分数应四舍五入为最大的较小整数。 h<integer>:水平分割。顶部矩形被压入堆栈,然后底部矩形被压入堆栈。 c<integer>:从堆栈中删除最新的矩形,并将其绘制为参数指定的颜色。1 =白色,2 =红色,3 =蓝色,4 =黄色 挑战 编写一个程序,将绘制说明作为参数,并创建绘制矩形的256x256位图表示形式。矩形必须以3像素的黑线分隔。一个或两个像素矩形应使其非黑色像素被边框黑色像素隐藏。 输入可以作为参数或文件读取,由您决定。命令应以空格分隔。您可以假定输入文件的语法正确,并且没有尾部或前导空格,制表符等。输出可以直接显示在屏幕上,也可以保存到文件,由您自己决定。 最短的代码获胜。 测试 以下来源: v25 h71 v93 h50 c4 c1 c1 c2 h71 c3 h44 c1 c1 应产生红色,蓝色和黄色的成分II:

2
用尺子和罗盘构造n-gons
任务是仅使用指南针和未标记的标尺绘制n边的规则多边形。 输入(n)是以下10个数字之一:3、4、5、6、8、10、12、15、16、17 方法:因为只有标尺和罗盘,所以只能绘制点,线和圆。 只能画一条线: 通过两个现有点。 只能画一个圆: 以一个点为中心,周长穿过第二个点。 只能画一个点: 在两条线的交点, 在直线和圆的交点处, 在两个圆的交点处, 一开始,您可能会画2点以开始。 通过此过程(并且仅通过此过程),您必须绘制所请求的n-gon的n条线以及达到该阶段所需的所有工作。 编辑:必须计算交点的位置,但是可以通过语言提供的任何方式绘制直线和圆。 输出是n边正多边形的图像,显​​示其工作状态。 图形上对图像大小,格式,线条粗细或此处未提及的其他内容没有任何限制。但是,必须有可能在视觉上区分不同的线,圆及其交点。另外: 构成n形边的n条线必须与“工作”颜色不同(即,任何点,圆或其他线),并且背景颜色也必须再次不同。 工作可以离开绘图区域的边界(点除外),这些点必须全部在图像的可见范围内。 圆可以是一个完整的圆,也可以是一个圆弧(只要它显示所需的相交点即可)。 一条线是无限的(即离开绘图区域),或者在它经过的两个点处被切除。编辑:可以画任何长度的线。只能在绘制的线在视觉上相交的地方创建点。 可以根据需要绘制点,包括不标记点。 评分是双重的,提交支持的每个输入获得1分,最多10分。在平局的情况下,最短的字节数为准。 可以在最少的步骤中构造n-gon或能够在给定范围之外构造n-gon的提交将获得认可,但对您的得分没有帮助。 维基百科的背景信息


8
四面体表面积
挑战 这个挑战非常简单。给定四个3维点,计算它们形成的四面体的表面积。这是代码高尔夫球,因此最短的代码获胜。存在标准漏洞,并增加了规定,在给出四点的情况下,禁止执行此任务的任何内置功能。 您可以假设所有四个点都是不同的,并且将通过STDIN给出,每行1个点。每个点将由三个16位无符号整数组成。如果使每个点更简单,则可以修改每个点的确切格式,例如三个空格分隔的整数。但是,必须将每个点放在单独的线上。输出应通过STDOUT进行,至少要保留两位小数。 对于不知道的人,四面体是一个3维立体,由4个三角形的面组成。 例 # input (format is up to you, see clarification above) [23822, 47484, 57901] [3305, 23847, 42159] [19804, 11366, 14013] [52278, 28626, 52757] # output 2932496435.95 如果您发现我的数学错误,请留下笔记。
16 code-golf  math  3d 

9
生成霍夫施塔特的人形图序列
在Gödel,Escher,Bach中,Douglas Hofstadter引入了一个整数序列,该序列通常被称为数字图形序列: 2, 4, 5, 6, 8, 9, 10, 11, 13, 14, 15, 16, 17, 19, 20, 21, 22, 23, 24, 25, ... 作为挑战的一部分,您可能会喜欢自己确定序列的定义,但是,如果您不能或不想弄清楚它的定义,可以在OEIS上找到它作为序列A030124,在Wikipedia上找到一个稍微清晰的定义。 编写一个程序或函数,该程序或函数n通过STDIN,ARGV或函数参数给出,n以任何合理的列表格式将序列的第一个数字的列表打印到STDOUT。 这是代码高尔夫,最短的解决方案以字节为单位。

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.