Questions tagged «combinatorics»

对于涉及组合学的挑战。

1
稳定的婚姻问题
背景 假设有2*n要结婚的人,并且进一步假设每个人n在以下约束下完全被其他人吸引: 吸引力是对称的 ; 即如果人A被人吸引B,则人B被人吸引A。 吸引力是反传递的 ; 也就是说,如果一个A人和一个人B都被一个人吸引C,那么一个A人和B另一个人就不会被彼此吸引。 因此,吸引力网络形成(无向)完整的二部图 Kn,n。我们还假设每个人都对他们吸引的人进行排名。这些可以表示为图中的边缘权重。 一个婚姻是一个配对(A,B)地方A和B被吸引到对方。如果存在另一场婚姻,婚姻中的婚姻是不稳定的,那么每一次婚姻中的一个人都可以与伴侣离婚并结婚,并且双方最终都会得到比其前夫更高的伴侣。 目标 您的任务是编写一个完整的程序或函数,以每个人的喜好作为输入并为每个人输出一个婚姻,以使每个婚姻稳定下来。 输入值 输入可以采用任何方便的格式;例如加权图,首选项的有序列表,字典/关联等。您可以选择将总人数作为输入,但不允许其他输入。 输出量 输出也可以采用任何方便的格式;例如,元组列表,最小边缘覆盖,与每个人的伴侣相关的功能等等。请注意,唯一的约束是每次婚姻都是稳定的,没有其他最优性要求。 笔记 您可以O(n^2)在Wikipedia或此Numberphile视频上找到更多信息和解决此问题的算法。但是,您可以自由使用任何算法。 禁止出现标准漏洞。 这是代码高尔夫球。最短答案(以字节为单位)获胜。

3
将样本转换为索引
我们将球放入固定数量的垃圾箱中。这些垃圾箱开始为空。 Empty bin (a=4): 0 0 0 0 然后我们一一将球加到垃圾箱中。 0 0 0 1 or 0 0 1 0 or 0 1 0 0 or 1 0 0 0 我们需要一种快速的方法来循环遍历垃圾箱的所有可能状态,没有重复且没有任何遗漏,并且我们不想列举所有可能的垃圾箱。因此,我们改为为每个bin配置分配一个索引。 我们通过以特定方式对可能的配置进行排序来分配索引: 按总和升序排序:因此,首先0 0 0 0添加可能的配置,然后添加1个球,然后添加2个,依此类推。 然后,从第一个容器到最后一个容器,以升序对每个和进行排序: 0 0 0 2 0 0 1 1 0 0 2 0 0 1 0 …

3
验证选票三角形
甲签号码,我们将标签乙,是的布置从1号的方法,通过B(B + 1)2号/成三角形,使得每个行和列是任何递增的顺序。前四个投票号码是: a(0) = 1 a(1) = 1 a(2) = 1 a(3) = 2 a(3)是2,这意味着有2种方式将数字从1排列到3(3+1)/2 = 6这样的三角形: 1 1 2 3 or 2 4 4 5 6 3 5 6 有关更多详细信息,请参见OEIS序列条目。 给定选票三角形,您的挑战是验证其正确性。如果满足选票三角形的条件(行数和列数增加),则应该输出其他几种方法(输入中的方法除外)以正确地布置三角形。如果输入三角形的构造不正确,则不应输出任何内容。 尾随换行符是允许的。 输入值 数字三角形,可能是也可能不是有效的选票三角形。例如: 1 2 3 4 5 6 1 10 5 9 8 2 7 6 …

3
广义生日问题
今晚,未婚夫带我出去吃饭庆祝我的生日。当我们外出时,我听说在一家50人的餐厅里,向5位不同的客人(包括我自己)唱着生日快乐。这让我感到奇怪-最初的生日问题(确定一个房间中2 N个人共享同一生日的概率)非常简单明了。但是,如何计算至少k有人中N有人共享同一生日的概率呢? 如果您想知道,那么在50个共有相同生日的人中,至少有5个人的概率约为1/10000。 挑战 给定两个整数N和k,其中N >= k > 0,输出k一组中至少N有人共享同一生日的概率。为简单起见,假设总是有365个可能的生日,并且所有日子都有相同的可能性。 对于k = 2,这归结为最初的生日问题,概率为1 - P(365, N)/(365)**N(其中P(n,k)是n个元素形成的k长度排列的数量)。对于的较大值k,Wolfram MathWorld的这篇文章可能会很有用。 规则 输出必须是确定性的,并且对于您选择的语言必须尽可能准确。这意味着没有蒙特卡洛估计或泊松近似。 N且k不得大于您选择的语言中可表示的最大整数。如果您选择的语言对整数没有硬性限制(除了内存限制),那么N它k可能会很大。 由浮点误差引起的精度误差可以忽略不计-您的解决方案应假定为完全精确,无限精度的浮点数。 测试用例 格式: k, N -> exact fraction (float approximation) 2, 4 -> 795341/48627125 (0.016355912466550306) 2, 10 -> 2689423743942044098153/22996713557917153515625 (0.11694817771107766) 2, 23 -> 38093904702297390785243708291056390518886454060947061/75091883268515350125426207425223147563269805908203125 (0.5072972343239854) 3, 3 -> 1/133225 (7.5060987051979735e-06) 3, …

23
多边形数
多边形数是ksize的一个点中的点数n。 您将得到n和k,并且您的任务是编写一个输出/打印相应编号的程序/功能。 计分 这是代码高尔夫球。以字节为单位的最短解决方案获胜。 例 的3RD六边形数(k=6, n=3)是28因为有28上面的点。 测试用例 可以从此Pyth测试套件生成。 用法:每个测试用例n在上,k下两行。 n k output 10 3 55 10 5 145 100 3 5050 1000 24 10990000 更多信息 在Wikipedia中:https://en.wikipedia.org/wiki/Polygonal_number 在Wolfram Mathworld中:http : //mathworld.wolfram.com/PolygonalNumber.html 在OEIS Wiki中:http : //oeis.org/wiki/Polygonal_numbers 各种n的n角数的OEIS序列:3 (A000217),4 (A000290),5 (A000326),6 (A000384),7 (A000566),8 (A000567),9 (A001106),10 (A001107),11 (A051682),12 (A051624),13 (A051865),14 (A051866),15 (A051867),16 (A051868),17 …

10
具有不可区分项目的排列
给定一个整数列表,输出整数的排列数量,其中不可区分的排列计数一次。如果有n整数,并且每组不可区分的数字都有length n_i,则为n! / (n_1! * n_2! * ...) 规则 输入将以某种形式的列表作为具有1到12个非负整数的函数或程序的参数。 输出将是打印或返回如上所述的排列数量。 没有标准漏洞或内置函数(生成排列,组合等)。允许析因。 测试用例 输入: 1, 3000, 2, 2, 8 1, 1, 1 2, 4, 3, 2, 3, 4, 4, 4, 4, 4, 1, 1 输出: 60 1 83160

3
计算Hankelable矩阵的数量
背景 二元汉克尔矩阵是具有仅包含0s和1s的恒定斜对角线(正倾斜对角线)的矩阵。例如,一个5x5二进制汉克矩阵看起来像 a b c d e b c d e f c d e f g d e f g h e f g h i 其中a, b, c, d, e, f, g, h, i要么0或1。 让我们定义一个矩阵中号为Hankelable如果有行和列的顺序的排列中号,使中号是汉克尔矩阵。这意味着可以对行顺序应用一种排列,对列应用一种可能的排列。 挑战 我们面临的挑战是要算多少Hankelable n通过n矩阵有全部n达到尽可能大的价值成为可能。 输出量 对于每个整数n从1个向上,输出的数目Hankelable n通过n基质与作为条目0或1。 对于n = 1,2,3,4,5答案应该是2,12,230,12076,1446672。(感谢orlp提供产生这些代码的代码。) 时限 我将在计算机上运行您的代码,并在1分钟后将其停止。输出正确答案的代码,最大n次取胜。时间限制是所有问题的答案,从n = 1最大的价值到n您给出的答案。 …

5
有多少种方法将N写入M个整数?
给定一个整数N,计算将其表示为M个整数> 1 的乘积的多少种方式。 输入只是N和M,输出是不同整数组的总数。意味着您可以多次使用整数,但是每个组必须是不同的(3 x 2 x 2如果2 x 2 x 3存在,则不计算在内)。 约束条件 1 < N <2 31 1 < M <30 例子 输入可以30 2给出输出3,因为它可以用三种方式表示: 2 x 15 3 x 10 5 x 6 Input 16 3提供output 1,因为只有一个不同的组: 2 x 2 x 4 输入2310 4给出输出10: 5 x 6 x 7 …

22
生成斯托尔序列
我正在学习Ruby,并编写了我的第一个平凡的代码来解决这个问题。 面临的挑战是,以产生第一Ñ所述的元件斯托尔序列,小号,其被定义如下: S [0] = 1 S [n]是无法表示为序列中两个不同的先前元素之和的最小数字。 因此,该序列以1、2、4、7和10开头。下一个元素为13,因为11(= 1 + 10)和12(= 2 + 10)是先前元素的总和,但13不是。 我正在寻找最短的代码。我自己使用Ruby,长度为108个字符,但是也许我会等着看别人提出什么之后再发布它?

1
我需要多少时间才能解锁Android手机?
情境 我正在使用模式匹配锁屏,可惜我忘记了我的模式。我想知道解锁需要多少时间。以下是我们将用于此挑战的Google锁定屏幕的规格。 每输入5个错误的代码,用户都必须等待30 seconds进一步的输入。 模式必须至少包含在内4 points(请参见下文) 一个点只能使用一次,但是您可以多次使用它(请参见下图): 在这里,即使我们再次针对该特定模式再次使用中心点,它也只会使用一次。 假设与事实 我们假设我们是超级英雄,并且可以在中绘制任何图案1 second,我们永远不需要吃饭或睡觉。是的,我们是超人。 我是一个非常不幸的人。“最坏的情况”是我的日常生活,因此我最后尝试的模式将是正确的模式。 我们必须要撒些什么? 对于不知道的人,Android(现在还有其他手机)提供了通过在9点矩阵上绘制图案来解锁手机的功能。这个矩阵可以描述如下: C(A) M(B) C(C) M(D) X(E) M(F) C(G) M(H) C(I) C代表“角点” M为“中间点” X为“中心点” 我给这些要点添加了标识符以使其更容易 允许的直接连接如下: 拐角点: 中点: 中心点 : 但是,正如steveverrill指出的那样,“一旦使用了中心(因此无法使用),则左下角和右上角之间的直接连接就变得明确无误,因此是可能的”。每个“中间点”都一样,例如,如果已经计算了点B,则可以在A和C之间建立直接连接。如果例如已经计算出F,则C和I之间的直接连接是可能的。等等... 规则 挑战的重点是返回多少时间(以人类可读的形式,也就是年/日/月/小时/小时/无论您发现什么时间)来解锁该死的手机。 您无法对可能的有效模式进行硬编码(傻瓜甚至不要使用Google),进行计算(实际上是有趣的部分,不是吗?) 最短的代码胜出 祝好运 !

3
建立3分频电路
TCS中的布尔电路基本上是由“与”,“或”,“非”门组成的DAG,通过“功能完备性”已知,它们可以计算所有可能的功能。例如,这是ALU中的基本原理。 挑战:创建一个电路以确定8位二进制数是否可以被3整除,并以某种方式可视化您的结果(即某种形式的图片) 选民的判断标准基于生成电路的代码是否能很好地推广到任意大小的数字,以及算法创建的可视化是否紧凑/平衡但仍然可读(即不允许人工可视化)。也就是说,可视化仅适用于n = 8,但理想情况下,代码将适用于所有'n'。获奖作品只是最高票数。 有点类似的问题:使用NAND逻辑门构建乘法器

12
高尔夫代码:发球(I)
挑战 在此任务中,您计算​​了将A球分配到B单元中的方式的数量,每个单元至少有一个球。 输入A和B在单行中用空格隔开,输入由EOF终止。 您可能想在这里检查解决方案。 输入值 0 0 1 0 12 4 6 3 18 17 20 19 15 13 18 9 20 20 17 14 9 2 14 13 18 11 输出量 1 0 14676024 540 54420176498688000 23112569077678080000 28332944640000 38528927611574400 2432902008176640000 21785854970880000 510 566658892800 334942064711654400 约束条件 每个A和B都是可以区分的。 0 <= A,B …

3
计算构成唯一集合的数组
这个问题具有类似的设置,以找到适合一组和的数组,尽管其目标完全不同。 考虑一个A长度数组n。该数组仅包含正整数。例如A = (1,1,2,2)。让我们将定义f(A)为的所有非空连续子数组之和的集合A。在这种情况下f(A) = {1,2,3,4,5,6}。产生步骤f(A) 如下: 的子阵列A是(1), (1), (2), (2), (1,1), (1,2), (2,2), (1,1,2), (1,2,2), (1,1,2,2)。它们各自的总和为1,1,2,2,2,3,4,4,5,6。因此,您从此列表中获得的集合是{1,2,3,4,5,6}。 如果没有其他相同长度的数组,则我们将数组称为A 唯一数组,除了反向数组。作为示例,但是没有其他长度数组会产生相同的和集。Bf(A) = f(B)Af((1,2,3)) = f((3,2,1)) = {1,2,3,5,6}3 我们将仅考虑元素为给定整数s或的数组s+1。例如,如果s=1数组仅包含1和2。 任务 任务,对于给定n和s是计算该长度的独特阵列的数量。您可以假设s介于1和之间9。 您不应该算数组的倒数以及数组本身。 例子 s = 1答案永远是n+1。 s = 2,从n = 1上往下数的答案是: 2,3,6,10,20,32,52,86 s = 8,从n = 1上往下数的答案是: 2,3,6,10,20,36,68,130 得分了 对于给定n的代码,您的代码应输出s从1到的所有值的答案9。您的分数是n在一分钟内完成的最高分。 测试中 我将需要在ubuntu机器上运行您的代码,因此请尽可能详细地说明如何编译和运行您的代码。 排行榜 …

3
Lyndon字分解
背景 一个林登字是一个非空字符串,它是严格按字典比所有其他的旋转小。可以将任何字符串唯一地分解为Lyndon单词的串联,这样这些子单词在字典上就不会增加;您的挑战是尽可能简洁地执行此操作。 细节 您应该实现一个函数或程序,该函数或程序枚举任何可打印ASCII字符串的Lyndon字分解,以便将结果子字符串输出为某种数组或流。字符应按其代码点进行比较,并允许使用所有标准输入和输出方法。与通常的代码高尔夫球一样,以字节为单位的最短程序获胜。 测试用例 '' [] 'C' ['C'] 'aaaaa' ['a', 'a', 'a', 'a', 'a'] 'K| ' ['K|', ' '] 'abaca' ['abac', 'a'] '9_-$' ['9_', '-', '$'] 'P&O(;' ['P', '&O(;'] 'xhya{Wd$' ['x', 'hy', 'a{', 'Wd', '$'] 'j`M?LO!!Y' ['j', '`', 'M', '?LO', '!!Y'] '!9!TZ' ['!9!TZ'] 'vMMe' ['v', 'MMe'] 'b5A9A9<5{0' ['b', '5A9A9<5{', …

27
数组元素之间的所有非有序对
任务: 返回具有数组元素之间所有可能对的数组。 例 从a=["a", "b", "c", "d"];归b=[["a","b"],["a","c"],["a","d"],["b","c"],["b","d"],["c","d"]]。 对可以是任意顺序,只要包括所有可能的组合,并且显然["b","d"]与相同即可["d","b"]。 输入值 由类中的char组成的唯一字符串元素数组[a-z]。 输出量 包含所有可能的输入数组元素对的2d数组。 测试用例 input=["a","b","c"]; //output=[["a","b"],["a","c"],["b","c"]] input=["a","b","c","d","e"]; //output=[["a","b"],["a","c"],["a","d"],["a","e"],["b","c"],["b","d"],["b","e"],["c","d"],["c","e"],["d","e"]] 注:我找不到一个重复这一挑战。如果有一个,请在评论中提醒我删除问题。

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.