Espandi il problema della studentessa di Kirkman


22

Per quelli di voi che non hanno familiarità, Kirkman's Schoolgirl Problem è il seguente:

Quindici giovani donne in una scuola escono tre di seguito per sette giorni consecutivi: è necessario organizzarle quotidianamente in modo che nessuna due passi due volte di seguito.

Potremmo guardare a questo come un nidificato 3 da 5 lista (o matrice):

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

In sostanza, l'obiettivo del problema originale è quello di capire 7 modi diversi per disporre la matrice sopra in modo che due lettere non condividano mai una riga più di una volta . Da MathWorld (collegato sopra), troviamo questa soluzione:

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

E se ci fosse un numero diverso di studentesse? Potrebbe esserci un ottavo giorno? Questa è la nostra sfida.

In questo caso no †† , ma non necessariamente per altre dimensioni dell'array
†† Possiamo facilmente mostrarlo, poiché aappare in fila con ogni altra lettera.


La sfida:

Dato un input di dimensioni (righe, di colonne) di una matrice di studentesse (cioè 3 x 5, 4 x 4o [7,6], [10,10]ecc), uscita la più grande possibile di "giorni che si adattano ai requisiti sopra specificati.

Input:
le dimensioni dell'array schoolgirl (qualsiasi modulo di input ragionevole che desideri).

Output:
la più grande serie possibile di array che soddisfano i requisiti di cui sopra (qualsiasi forma ragionevole).

Casi 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. 

* Grazie a @Frozenfrank per aver corretto il caso di test 3 : se esiste solo una colonna, può esserci solo un giorno, poiché l'ordine delle righe non ha importanza.

Questa è competizione di : vince la risposta più breve.


Questo si riferisce in qualche modo a piani proiettivi finiti o sto pensando a un problema diverso?
Neil,

@Neil non ne ho idea. Temo di non essere qualificato per rispondere a questo. ;-)
Scott Milner,

C'è un limite di tempo?
Artyer,

@Artyer No, ma vorrei essere in grado di testare il codice ...
Scott Milner,

2
@Neil è stata una lettura divertente di Wikipedia.
Magic Octopus Urn,

Risposte:


12

Mathematica, 935 byte

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]


questo è per 26 donne max

EDIT
Ho apportato alcune modifiche e penso che funzioni! Il codice in questo momento è impostato per risolvere [5,4] (che è il "problema dei social golfisti") e ottiene il risultato in pochi secondi. Tuttavia [5,3] il problema è più duro e dovrai aspettare 10-20 minuti ma otterrai una combinazione giusta per tutti i giorni. Per i casi più facili è molto veloce.

comunque puoi provarlo e vedere i risultati
Provalo online qui
copia e incolla usando ctrl-v
premi
maiusc + invio per eseguire il codice puoi modificare l'input all'inizio del codice -> Inp = {5,4}
esegui il codice più volte per ottenere diverse permutazioni


Anche se questo è impressionante e fa molti progressi verso la risoluzione del problema, è ancora incompleto. Mentre funziona per casi di test più piccoli, non è stato in grado di risolverne di più grandi, incluso il [5,3]caso di test su cui si basa l'intero problema. Inoltre, questo può essere giocato a golf di più; ci sono molti nomi di variabili che sono più grandi di quanto devono essere e alcune funzioni possono essere abbreviate @o notate con infissione. Spero che continuerai a lavorare, però!
Scott Milner,

grazie per averlo verificato. Cercherò prima di fare questo lavoro e poi di
giocarci

1
Dovresti essere in grado di salvare molti byte rendendo i nomi delle variabili singole lettere e assegnando alcune funzioni che usi più di una volta alle variabili e sostituendo le funzioni con quelle variabili :)
numbermaniac

2
@numbermaniac Semplicemente sostituendo i nomi delle variabili, sono stato in grado di farlo 914. Dovrebbe essere golfabile fino a circa 850.
Scott Milner,

3
Ho risolto il caso di prova. Prima di tutto voglio che funzioni. Ecco perché non l'ho ancora giocato a golf. Grazie per tutti i tuoi commenti. Penso che ora sia pronto.
J42161217,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.