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 a
aparece 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 é uma competição de código-golfe - a resposta mais curta vence.