Expandir o Problema da Aluna de Kirkman


22

Para aqueles que não estão familiarizados, o Problema de Aluna de Kirkman é o seguinte:

Quinze jovens de uma escola saem três lado a lado por sete dias seguidos: é necessário organizá-las diariamente, para que ninguém duas ande duas vezes lado a lado.

Podemos ver isso como uma lista aninhada 3 por 5 (ou matriz):

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

Essencialmente, o objetivo do problema original é descobrir 7 maneiras diferentes de organizar a matriz acima, para que duas letras nunca compartilhem uma linha mais de uma vez . No MathWorld (link acima), encontramos esta solução:

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

Agora, e se houvesse um número diferente de alunas? Poderia haver um oitavo dia? Este é o nosso desafio.

Nesse caso, não †† , mas não necessariamente para outras dimensões da matriz
†† Podemos mostrar isso facilmente, pois aaparece em uma linha com todas as outras letras.


O desafio:

Dada uma entrada de dimensões (linhas, do que as colunas) de uma matriz de estudantes (isto é 3 x 5, 4 x 4, ou [7,6], [10,10], etc.), de saída o maior conjunto possível de 'dias' que se ajustam aos requisitos especificados acima.

Entrada:
As dimensões da matriz da estudante (qualquer formulário de entrada razoável que você desejar).

Saída:
a maior série possível de matrizes que atendem aos requisitos acima (qualquer forma razoável).

Casos de teste:

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. 

* Obrigado a @Frozenfrank por corrigir o caso de teste 3 : se houver apenas uma coluna, poderá haver apenas um dia, pois a ordem das linhas não importa.

Esta é competição de - a resposta mais curta vence.


Isso está relacionado a planos projetivos finitos de alguma forma ou estou pensando em um problema diferente?
Neil

@ Neil Eu não tenho idéia. Receio não estar qualificado para responder a isso. ;-)
Scott Milner

Existe limite de tempo?
Artyer 10/05

@Artyer Não, mas eu gostaria de ser capaz de testar o código ...
Scott Milner

2
@ Neil que foi uma divertida leitura da Wikipedia.
Magic Octopus Urn

Respostas:


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]


isto é para 26 senhoras max

EDIT
Fiz algumas alterações e acho que funciona! O código agora está definido para resolver [5,4] (que é o "problema dos golfistas sociais") e obtém o resultado em alguns segundos. No entanto, o problema [5,3] é mais difícil e você terá que esperar 10 a 20 minutos, mas terá a combinação certa por todos os dias. Para casos mais fáceis, é muito rápido.

de qualquer maneira, você pode experimentar e ver os resultados.
Experimente online aqui,
copie e cole usando ctrl-v,
pressione shift + enter para executar o código.
Você pode alterar a entrada no início do código -> Inp = {5,4},
execute o codifique várias vezes para obter permutações diferentes


Embora isso seja impressionante e faça muito progresso na solução do problema, ele ainda está incompleto. Embora funcione para casos de teste menores, não foi possível resolver outros maiores, incluindo o [5,3]caso de teste em que esse problema se baseia. Além disso, isso pode ser jogado mais; existem vários nomes de variáveis ​​maiores do que precisam e algumas funções podem ser abreviadas com uma @notação de infixo. Espero que você continue trabalhando!
Scott Milner

obrigado por verificar. Vou tentar fazer este trabalho em primeiro lugar e, em seguida, golf-lo ...
J42161217

1
Você deve ser capaz de economizar muitos bytes, tornando os nomes das variáveis ​​letras únicas e atribuindo algumas funções que você usa mais de uma vez às variáveis ​​e substituindo as funções por essas variáveis ​​:) #
318

2
@numbermaniac Apenas substituindo nomes de variáveis, eu consegui fazer isso 914. Deveria ser jogável até 850.
Scott Milner

3
Corrigi o caso de teste. Antes de tudo, quero que isso funcione. É por isso que ainda não joguei golfe. Obrigado por todos os seus comentários. Eu acho que agora está pronto.
J42161217
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.