展开柯克曼的女学生问题


22

对于那些不熟悉的人,柯克曼的女学生问题如下:

一所学校的15位年轻女士连续三天并排走出家门,连续7天:要求每天安排她们,以便没有两个人能并排走两次。

我们可以将其视为嵌套的3 x 5列表(或矩阵):

[[a,b,c]
 [d,e,f]
 [g,h,i]
 [j,k,l]
 [m,n,o]]

本质上,原始问题的目标是找出安排上述矩阵的7种不同方式,以使两个字母永远不会共享同一行。从MathWorld(上面链接)中,我们找到了以下解决方案:

[[a,b,c]   [[a,d,h]   [[a,e,m]   [[a,f,i]   [[a,g,l]   [[a,j,n]   [[a,k,o]
 [d,e,f]    [b,e,k]    [b,h,n]    [b,l,o]    [b,d,j]    [b,i,m]    [b,f,g]
 [g,h,i]    [c,i,o]    [c,g,k]    [c,h,j]    [c,f,m]    [c,e,l]    [c,d,n]
 [j,k,l]    [f,l,n]    [d,i,l]    [d,k,m]    [e,h,o]    [d,o,g]    [e,i,j]
 [m,n,o]]   [g,j,m]]   [f,j,o]]   [e,g,n]]   [i,k,n]]   [f,h,k]]   [h,l,m]]

现在,如果有不同数量的女学生怎么办?可能会有第八天吗?这是我们的挑战。

在这种情况下,没有††,但不一定是其他数组尺寸
††我们可以很容易地显示出来,因为它a与其他字母排成一行。


挑战:

鉴于女生(即阵列的尺寸的输入(行,列比)3 x 54 x 4[7,6][10,10]等),输出最大可能组“天”适合上述规定的要求。

输入:
女生数组的尺寸(您希望的任何合理的输入形式)。

输出:
满足以上要求的最大可能数组系列(任何合理形式)。

测试用例:

Input:  [1,1]
Output: [[a]]

Input:  [1,2]
Output: [[a,b]]

Input:* [2,1]
Output: [[a]
         [b]]

Input:  [2,2]
Output: [[a,b]  [[a,c]  [[a,d]
         [c,d]]  [b,d]]  [b,c]]

Input:  [3,3]
Output: [[a,b,c]  [[a,d,g]  [[a,e,i]  [[a,f,h]
         [d,e,f]   [b,e,h]   [b,f,g]   [b,d,i]
         [g,h,i]]  [c,f,i]]  [c,d,h]]  [c,e,g]]

Input:  [5,3]
Output: [[a,b,c]   [[a,d,h]   [[a,e,m]   [[a,f,i]   [[a,g,l]   [[a,j,n]   [[a,k,o]
         [d,e,f]    [b,e,k]    [b,h,n]    [b,l,o]    [b,d,j]    [b,i,m]    [b,f,g]
         [g,h,i]    [c,i,o]    [c,g,k]    [c,h,j]    [c,f,m]    [c,e,l]    [c,d,n]
         [j,k,l]    [f,l,n]    [d,i,l]    [d,k,m]    [e,h,o]    [d,o,g]    [e,i,j]
         [m,n,o]]   [g,j,m]]   [f,j,o]]   [e,g,n]]   [i,k,n]]   [f,h,k]]   [h,l,m]]

There may be more than one correct answer. 

*感谢@Frozenfrank纠正测试用例3:如果只有一列,则只能有一天,因为行顺序无关紧要。

这是竞赛-最短答案胜出。


这是否以任何方式与有限的射影平面有关,还是我在考虑其他问题?
尼尔

@尼尔,我不知道。恐怕我没有资格回答。;-)
斯科特·米尔纳

有时间限制吗?
Artyer

@Artyer不行,但我希望能够测试代码...
Scott Milner

2
@Neil是有趣的维基百科阅读。
魔术章鱼缸

Answers:


12

Mathematica,935个字节

Inp={5,4};L=Length;T=Table;ST[t_,k_,n_]:=Binomial[n-1,t-1]/Binomial[k-1,t-1];H=ToExpression@Alphabet[];Lo=Inp[[1]]*Inp[[2]];H=H[[;;Lo]];Final={};ST[2,3,12]=4;ST[2,4,20]=5;If[Inp[[2]]==1,Column[Partition[H,{1}]],CA=Lo*Floor@ST[2,Inp[[2]],Lo];While[L@Flatten@Final!=CA,Final={};uu=0;S=Normal[Association[T[ToRules[H[[Z]]==Prime[Z]],{Z,L@H}]]];PA=Union[Sort/@Permutations[H,{Inp[[2]]}]];PT=Partition[H,Inp[[2]]];While[L@PA!=0,AppendTo[Final,PT];Test=Flatten@T[Times@@@Subsets[PT[[X]],{2}]/.S,{X, L@PT}];POK=T[Times@@@Subsets[PA[[Y]],{2}]/.S,{Y,L@PA}];Fin=Select[POK,L@Intersection[Test,#]==0&];Facfin=T[FactorInteger[Fin[[V]]],{V,L@Fin}];end=T[Union@Flatten@T[First/@#[[W]],{W,L@#}]&[Facfin[[F]]],{F,L@Facfin}]/.Map[Reverse,S];PA=end;PT=DeleteDuplicates[RandomSample@end,Intersection@##=!={}&];If[L@Flatten@PT<L@H,While[uu<1000,PT=DeleteDuplicates[RandomSample@end,Intersection@##=!={}&];If[L@Flatten@PT==L@H,Break[],uu++]]]]];Grid@Final]


这是最多26位女士

编辑
我进行了一些更改,我认为它可以工作!现在,将代码设置为解决[5,4](这是“社交高尔夫球手问题”),并在几秒钟内得到结果。但是,[5,3]问题更加棘手,您将不得不等待 10-20分钟,但是您将在整天中得到正确的组合。对于较简单的情况,它非常快。

无论如何,您都可以尝试并查看结果
在这里在线尝试
使用ctrl-v复制并粘贴,
按shift + enter运行代码,
您可以在代码开头更改输入-> Inp = {5,4}
运行多次编码以获得不同的排列


尽管这令人印象深刻,并且在解决问题上取得了很大进展,但仍然不完整。虽然它适用于较小的测试用例,但无法解决任何较大的[5,3]测试用例,包括整个问题都基于的测试用例。另外,可以打更多的高尔夫球。有几个变量名,它们的大小比需要的大。有些函数可以用@或缩写表示法来缩短。不过,我希望您能继续工作!
Scott Milner

感谢您检查。我将尝试先完成这项工作,然后
再打

1
通过使变量名成为单个字母,并将不止一次使用的某些函数分配给变量并将这些函数替换为这些变量,您应该能够节省大量字节:)
numbermaniac

2
@numbermaniac通过仅替换变量名,我就可以将其简化为914。它应该可以打到850左右。
斯科特米尔纳

3
我修复了测试用例。首先,我要这个工作。这就是为什么我还没有打高尔夫球的原因。感谢您的所有评论。我认为现在已经准备好了。
J42161217 '17
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.