Développer le problème des écolières de Kirkman

22

Pour ceux d'entre vous qui ne sont pas familiers, le problème des écolières de Kirkman se présente comme suit:

Quinze jeunes filles d'une école en sortent trois de front pendant sept jours consécutifs: il faut les organiser quotidiennement pour que deux ne marchent pas deux fois de suite.

Nous pourrions regarder cela comme une liste (ou matrice) imbriquée 3 par 5 :

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

Essentiellement, l'objectif du problème d'origine est de trouver 7 façons différentes d'organiser la matrice ci-dessus afin que deux lettres ne partagent jamais une ligne plus d'une fois . De MathWorld (lié ci-dessus), nous trouvons cette solution:

[[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]]

Et si le nombre d'écolières était différent? Pourrait-il y avoir un huitième jour? C'est notre défi.

Dans ce cas, non †† , mais pas nécessairement pour les autres dimensions du tableau
†† Nous pouvons facilement le montrer, car il aapparaît dans une rangée avec une lettre sur deux.


Le défi:

Compte tenu des dimensions d' une entrée (lignes, que les colonnes) d'une matrice d'écolières (c. 3 x 5, 4 x 4ou [7,6], [10,10], etc.), la sortie la plus grande possible l' ensemble de « jours » qui correspondent aux exigences spécifiées ci - dessus.

Entrée:
Les dimensions du tableau d'écolière (toute forme d'entrée raisonnable que vous souhaitez).

Sortie:
La plus grande série possible de tableaux répondant aux exigences ci-dessus (toute forme raisonnable).

Cas de test:

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. 

* Merci à @Frozenfrank d' avoir corrigé le cas de test 3 : s'il n'y a qu'une seule colonne, il ne peut y en avoir qu'un, car l'ordre des lignes n'a pas d'importance.

C'est une compétition de - la réponse la plus courte l'emporte.

Scott Milner
la source
Est-ce que cela se rapporte aux plans projectifs finis de quelque façon que ce soit ou est-ce que je pense à un problème différent?
Neil
@Neil, je n'ai aucune idée. Je crains de ne pas être qualifié pour répondre à cela. ;-)
Scott Milner
Y a-t-il un délai?
Artyer
@Artyer Non, mais j'aimerais pouvoir tester le code ...
Scott Milner
2
@Neil qui était une lecture amusante de wikipedia.
Magic Octopus Urn

Réponses:

12

Mathematica, 935 octets

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]


c'est pour 26 dames max

EDIT
J'ai fait quelques changements et je pense que ça marche! Le code est actuellement réglé pour résoudre [5,4] (qui est le "problème des golfeurs sociaux") et obtient le résultat en quelques secondes. Cependant, le problème [5,3] est plus difficile et vous devrez attendre 10-20 minutes mais vous obtiendrez une bonne combinaison pour tous les jours. Pour les cas plus faciles, c'est très rapide.

Quoi qu'il en soit, vous pouvez l'essayer et voir les résultats
Essayez-le en ligne ici
copiez et collez en utilisant ctrl-v
appuyez sur Maj + Entrée pour exécuter le code,
vous pouvez modifier l'entrée au début du code -> Inp = {5,4}
exécutez le coder plusieurs fois pour obtenir différentes permutations

J42161217
la source
Bien que cela soit impressionnant et fasse beaucoup de progrès vers la résolution du problème, il est encore incomplet. Bien que cela fonctionne pour les cas de test plus petits, il n'a pas pu résoudre les plus grands, y compris le [5,3]cas de test sur lequel repose tout ce problème. De plus, cela peut être joué davantage; il existe plusieurs noms de variables qui sont plus grands qu'ils ne devraient l'être, et certaines fonctions peuvent être raccourcies avec @ou notation infixée. J'espère que vous continuerez à travailler!
Scott Milner
merci de l'avoir vérifié. J'essaierai de faire ce travail d'abord et ensuite de le
jouer au
1
Vous devriez être en mesure d'économiser beaucoup d'octets en faisant vos noms de variables lettres simples, et en affectant certaines fonctions que vous utilisez plus d'une fois aux variables et en remplaçant les fonctions par ces variables :)
numbermaniac
2
@numbermaniac En remplaçant simplement les noms de variables, j'ai pu le comprendre 914. Il devrait être jouable au golf à environ 850.
Scott Milner
3
J'ai corrigé le cas de test. Tout d'abord, je veux que cela fonctionne. C'est pourquoi je ne l'ai pas encore joué au golf. Merci pour tous vos commentaires. Je pense que maintenant c'est prêt.
J42161217