カークマンの女子高生問題を展開


22

なじみのない人のために、カークマンの女子高生問題は次のようになります。

学校の15人の若い女性は、連続して7日間、3人並んで歩きます。2人が2度並んで歩かないように、毎日手配する必要があります。

私たちは、ネストされたようにこれを見て可能性が35リスト(または行列):

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

基本的に、元の問題の目標は、2つの文字が1行を複数回共有しないように、上記のマトリックスを配置する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]]

さて、女子学生の数が異なる場合はどうなりますか?8日目がありますか?これが私たちの挑戦です。

ここでない††、必ずしもではないが、他の配列の次元のために
††我々は簡単にするため、これを表示することができ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. 

* テストケース3を修正してくれた@Frozenfrankに感謝します。列が1つしかない場合、行の順序は重要ではないため、1日しかありません。

これは競争です。最短の回答が勝ちます。


これは何らかの形で有限射影平面に関連していますか、それとも別の問題を考えていますか?
ニール

@Neil私には手がかりがありません。私はそれに答える資格がないのではないかと心配しています。;-)
スコットミルナー

制限時間はありますか?
アーティア

@Artyerありませんが、私はコードをテストできるようにしたいと思います...
スコット・ミルナー

2
@Neilは、楽しいウィキペディアの読み物でした。
魔法のタコUr

回答:


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]この問題全体の基になっているテストケースを含め、より大きなテストケースは解決できませんでした。さらに、これはもっとゴルフすることができます。必要以上に大きい変数名がいくつかあり、一部の関数は短縮@表記または中置表記で短縮できます。しかし、あなたが働き続けることを願っています!
スコットミルナー

チェックしてくれてありがとう。最初にこの作品を作り、それからゴルフを作ろうとします
...-J42161217

1
変数名を1文字にし、複数回使用する一部の関数を変数に割り当て、関数をそれらの変数で置き換えることで、多くのバイトを節約できるはずです:)
numbermaniac

2
@numbermaniac変数名を置き換えるだけで、それを取得することができました914。それは周りの850にgolfableダウンする必要があります
スコット・ミルナー

3
テストケースを修正しました。まず、これを機能させたいです。だから私はまだゴルフをしていません。コメントありがとうございます。今では準備ができていると思います。
J42161217
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.