Erweitern Sie Kirkmans Schulmädchenproblem

22

Für diejenigen von Ihnen, die nicht vertraut sind, lautet Kirkmans Schulmädchen-Problem wie folgt:

Fünfzehn junge Damen in einer Schule gehen sieben Tage hintereinander drei Mal hintereinander aus dem Haus. Es ist erforderlich, sie täglich so zu arrangieren, dass keine zwei Frauen zweimal hintereinander gehen.

Wir könnten wie ein verschachtelten Blick auf diesem 3 von 5 Liste (oder Matrix):

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

Im Wesentlichen besteht das Ziel des ursprünglichen Problems darin, sieben verschiedene Möglichkeiten zum Anordnen der obigen Matrix herauszufinden, sodass zwei Buchstaben eine Zeile nie mehr als einmal teilen . Von MathWorld (oben verlinkt) finden wir diese Lösung:

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

Was wäre, wenn es eine andere Anzahl von Schulmädchen gäbe? Könnte es einen achten Tag geben? Das ist unsere Herausforderung.

In diesem Fall nicht †† , aber nicht unbedingt für andere Array-Dimensionen
†† Wir können dies leicht zeigen, da ain einer Reihe mit jedem anderen Buchstaben erscheint.


Die Herausforderung:

Angesichts eine Eingabe von Abmessungen (Zeilen als Spalten) aus einer Anordnung von Schülern (dh 3 x 5, 4 x 4oder [7,6], [10,10]usw.), Ausgang der größtmögliche Menge von ‚Tagen‘, die die Anforderungen passen oben spezifizierten.

Eingabe:
Die Abmessungen für das Schülerinnen-Array (jede sinnvolle Eingabeform, die Sie wünschen).

Ausgabe:
Die größtmögliche Reihe von Arrays, die die oben genannten Anforderungen erfüllen (jede sinnvolle Form).

Testfälle:

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. 

* Dank an @Frozenfrank für die Korrektur von Testfall 3 : Wenn es nur eine Spalte gibt, kann es nur einen Tag geben, da die Zeilenreihenfolge keine Rolle spielt.

Dies ist ein Wettbewerb - die kürzeste Antwort gewinnt.

Scott Milner
quelle
Bezieht sich das in irgendeiner Weise auf endliche projektive Ebenen oder denke ich über ein anderes Problem nach?
Neil
@Neil Ich habe keine Ahnung. Ich fürchte, ich bin nicht qualifiziert, das zu beantworten. ;-)
Scott Milner
Gibt es eine zeitliche Begrenzung?
Artyer
@Artyer Nein, aber ich möchte den Code testen können ...
Scott Milner
2
@Neil das war ein lustiges wikipedia gelesen.
Magic Octopus Urn

Antworten:

12

Mathematica, 935 Bytes

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]


Dies ist für 26 Damen max

BEARBEITEN
Ich habe einige Änderungen vorgenommen und denke, dass es funktioniert! Der aktuelle Code ist auf Lösung eingestellt [5,4] (das ist das "Problem der Social Golfer") und liefert das Ergebnis in wenigen Sekunden. Das [5,3] -Problem ist jedoch schwieriger und Sie müssen 10-20 Minuten warten, aber Sie erhalten für alle Tage die richtige Kombination. Für leichtere Fälle ist es sehr schnell.

trotzdem kann man es versuchen und sehen die Ergebnisse
Online ausprobieren hier
kopieren und Strg-V mit
drücken Shift + geben Sie den Code auszuführen
Sie den Eingang am Anfang des Codes ändern kann -> Inp = {5,4}
laufen die Code mehrmals, um verschiedene Permutationen zu erhalten

J42161217
quelle
Dies ist zwar beeindruckend und macht große Fortschritte bei der Lösung des Problems, es ist jedoch immer noch unvollständig. Während es für kleinere Testfälle funktioniert, konnte es keine größeren lösen, einschließlich des [5,3]Testfalls, auf dem dieses ganze Problem basiert. Darüber hinaus kann dies mehr golfen werden; Es gibt mehrere Variablennamen, die größer sind, als sie sein müssen, und einige Funktionen können mit @oder ohne Zusatznotation gekürzt werden. Ich hoffe, Sie werden trotzdem weiterarbeiten!
Scott Milner
Danke, dass du es überprüft hast. Ich werde versuchen, diese Arbeit zuerst zu machen und dann Golf zu spielen ...
J42161217
1
Sie sollten Ihre Variablennamen einzelne Buchstaben , indem sie, und Zuweisen einige Funktionen , die Sie mehr als einmal auf Variablen und ersetzt die Funktionen mit diesen Variablen :) viele Bytes speichern können
numbermaniac
2
@numbermaniac Durch einfaches Ersetzen von Variablennamen konnte ich das Problem beheben 914. Es sollte bis zu 850 golfen werden können.
Scott Milner
3
Ich habe den Testfall behoben. Zunächst möchte ich, dass dies funktioniert. Deshalb habe ich es noch nicht golfen. Vielen Dank für alle Ihre Kommentare. Ich denke jetzt ist es fertig.
J42161217