Problema
Considere uma grade quadrada de 3 por 3 de números inteiros não negativos. Para cada linha, i
a soma dos números inteiros é configurada para ser r_i
. Da mesma forma, para cada coluna, j
a soma dos números inteiros nessa coluna está configurada para ser c_j
.
A tarefa é escrever código para enumerar todas as possíveis atribuições diferentes de números inteiros para a grade, dadas as restrições de soma de linhas e colunas. Seu código deve gerar uma atribuição por vez.
Entrada
Seu código deve usar 3 números inteiros não negativos, especificando as restrições de linha e 3 números inteiros não negativos, especificando as restrições de coluna. Você pode assumir que eles são válidos, ou seja, que as restrições de soma ou linha são iguais à soma das restrições de coluna. Seu código pode fazer isso da maneira que for mais conveniente.
Resultado
Seu código deve gerar as diferentes grades 2D que ele calcula em qualquer formato legível por humanos de sua escolha. Quanto mais bonito, melhor, é claro. A saída não deve conter grades duplicadas.
Exemplo
Se todas as restrições de linha e coluna forem exatamente, 1
então existem apenas 6
possibilidades diferentes. Para a primeira linha, você pode colocar um 1
em qualquer uma das três primeiras colunas, para a segunda linha agora existem 2
alternativas e a última linha agora é completamente determinada pelas duas anteriores. Tudo o resto na grade deve ser definido como 0
.
Digamos que a entrada seja 2 1 0
para as linhas e 1 1 1
para as colunas. Usando o adorável formato de saída da APL, as possíveis grades inteiras são:
┌─────┬─────┬─────┐
│0 1 1│1 0 1│1 1 0│
│1 0 0│0 1 0│0 0 1│
│0 0 0│0 0 0│0 0 0│
└─────┴─────┴─────┘
Agora diga que a entrada é 1 2 3
para as linhas e 3 2 1
para as colunas. As possíveis grades inteiras são:
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│0 0 1│0 0 1│0 0 1│0 1 0│0 1 0│0 1 0│0 1 0│1 0 0│1 0 0│1 0 0│1 0 0│1 0 0│
│0 2 0│1 1 0│2 0 0│0 1 1│1 0 1│1 1 0│2 0 0│0 1 1│0 2 0│1 0 1│1 1 0│2 0 0│
│3 0 0│2 1 0│1 2 0│3 0 0│2 1 0│2 0 1│1 1 1│2 1 0│2 0 1│1 2 0│1 1 1│0 2 1│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
fonte
Casca ,
2017 bytes-3 bytes graças a @ H.PWiz
Aceita entrada como uma lista que
xs
codifica as restrições[r_1,r_2,r_3,c_1,c_2,c_3]
, tente online!Explicação
Abordagem de força bruta: P Gere todas as grades 3x3 com as entradas
[0..max xs]
:fonte
Braquilog , 17 bytes
Experimente online!
AVISO: SAÍDA FEIA! Não se preocupe, ainda é legível por humanos, não sou obrigado a dar conta de quanto. ;)
Por alguma razão, deve ser muito mais longo do que o que eu esperaria fazer sentido (13 bytes):
Esta última versão, se funcionasse, teria recebido a entrada da saída (ou seja, argumento da linha de comando).
fonte
Python 2 ,
149145142141138136 bytesExperimente online!
Recebe entrada como uma lista de listas:
[[r1, c1], [r2, c2], [r3, c3]]
fonte
Haskell,
94888479 bytesToma as somas das linhas e colunas como uma única lista plana de 6 elementos
[r1,r2,r3,c1,c2,c3]
.Experimente online!
Como os elementos das matrizes a serem testadas chegam à soma de
r
, o código não termina em tempo razoável para somas grandes de linhas / colunas. Aqui está uma versão que vai até o máximor
mais rápido, mas com 4 bytes a mais: Experimente online!fonte
Mathematica, 81 bytes
encontra todas as matrizes 3x3 com elementos 0..Max e seleciona as corretas,
isso significa que as
(Max+1)^9
matrizes precisam ser verificadasExperimente online!
fonte
Grid
também trabalho com TIO, usandoToString
. Experimente online!R ,
115110 bytesExperimente online!
Recebe a entrada como
c(r1,r2,r3,c1,c2,c3)
uma únicavector
e imprime as matrizes em stdout.É bastante semelhante à resposta do APL de Uriel , mas gera as grades 3x3 de maneira um pouco diferente.
Deixando
M=max(S)
, gera o vetor0:M
e orep
come 9 vezes, ou seja,[0..M, 0...M, ..., 0...M]
nove vezes. Em seguida, ele seleciona todas as combinações desse novo vetor tiradas 9 de cada vez, usandomatrix, 3, 3
para converter cada combinação 9 em uma3x3
matriz e forçandosimplify=F
a retornar uma lista em vez de uma matriz. Em seguida, unifica essa lista e a salva comom
.Em seguida, filtra
m
para aqueles em que as somas de linha / coluna são idênticas à entrada, imprimindo as que estão e não fazendo nada para as que não são.Como calcula
choose(9*(M+1),9)
diferentes grades possíveis (mais do que as(M+1)^9
possibilidades), a memória / tempo fica mais rápida do que a resposta mais eficiente (mas com menos golfe) abaixo:R , 159 bytes
Experimente online!
fonte
MATL ,
3522 bytes-13 bytes graças a Luis Mendo
Experimente online!
Link é para uma versão do código que imprime um pouco mais bem; esta versão apenas imprimirá todas as matrizes com uma única nova linha entre elas.
Toma entrada como
[c1 c2 c3 r1 r2 r3]
.Obviamente, isso calcula o poder cartesiano
X^
de0...max(input)
com expoente9
e de transposição!
. Em seguida, percorre"
as colunas, remodelando cada@
uma como uma matriz 3x33e
, duplicandot
, transpondo!
e concatenando horizontalmenteh
. Em seguida, calcula as somas da colunas
, o que resultará no vetor[c1 c2 c3 r1 r2 r3]
. Fazemos igualdade elementar para a entradaG=
e, se?
todos forem diferentes de zero, recuperamos a matriz correta selecionando a entrada para a função!
usando4M
.fonte
Lote, 367 bytes
O quadrado 2 × 2 superior esquerdo força o resultado, portanto, a melhor abordagem é gerar todos os valores para o número inteiro superior esquerdo, todos os valores válidos para a soma do número inteiro superior esquerdo e superior médio, todos os valores válidos para a soma do número superior inteiro esquerdo e médio esquerdo e calcule o intervalo de valores válidos para o número inteiro médio; depois de percorrer todos os intervalos apropriados, calcule os valores restantes a partir das restrições.
fonte
Python 2 , 118 bytes
Experimente online!
Python 2 , 123 bytes
Experimente online!
fonte