Problema
Considere una cuadrícula de 3 por 3 de enteros no negativos. Para cada fila, i
la suma de los enteros se establece en r_i
. Del mismo modo, para cada columna, j
la suma de los enteros en esa columna se establece en c_j
.
La tarea es escribir código para enumerar todas las posibles asignaciones diferentes de enteros a la cuadrícula dadas las restricciones de suma de filas y columnas. Su código debe generar una asignación a la vez.
Entrada
Su código debe tomar 3 enteros no negativos que especifiquen las restricciones de fila y 3 enteros no negativos que especifiquen las restricciones de columna. Puede suponer que estos son válidos, es decir, que las restricciones de suma o fila son iguales a la suma de las restricciones de columna. Su código puede hacer esto de cualquier manera que sea conveniente.
Salida
Su código debe generar las diferentes cuadrículas 2d que calcula en cualquier formato legible por humanos que elija. Cuanto más bonita, mejor, por supuesto. La salida no debe contener cuadrículas duplicadas.
Ejemplo
Si todas las restricciones de fila y columna son exactamente, 1
entonces solo hay 6
diferentes posibilidades. Para la primera fila, puede poner una 1
en cualquiera de las primeras tres columnas, para la segunda fila ahora hay 2
alternativas y la última fila ahora está completamente determinada por las dos anteriores. Todo lo demás en la cuadrícula debe establecerse en 0
.
Digamos que la entrada es 2 1 0
para las filas y 1 1 1
para las columnas. Usando el formato de salida encantador de APL, las posibles cuadrículas de enteros son:
┌─────┬─────┬─────┐
│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│
└─────┴─────┴─────┘
Ahora digamos que la entrada es 1 2 3
para las filas y 3 2 1
para las columnas. Las posibles cuadrículas de enteros son:
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│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│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
fuente
Casco ,
2017 bytes-3 bytes gracias a @ H.PWiz
Toma datos como una lista que
xs
codifica las restricciones[r_1,r_2,r_3,c_1,c_2,c_3]
, ¡ pruébelo en línea!Explicación
Enfoque de fuerza bruta: P Genera todas las cuadrículas de 3x3 con entradas
[0..max xs]
:fuente
Brachylog , 17 bytes
Pruébalo en línea!
ADVERTENCIA: ¡SALIDA FEA! No te asustes, todavía es legible para los humanos, no estoy obligado a dar cuenta de cuánto. ;)
Por alguna razón, debe ser mucho más largo de lo que esperaría que tuviera sentido (13 bytes):
Esta última versión, si funcionó, habría tomado la entrada de la salida (es decir, argumento de línea de comandos) en su lugar.
fuente
Python 2 ,
149145142141138136 bytesPruébalo en línea!
Toma datos como una lista de listas:
[[r1, c1], [r2, c2], [r3, c3]]
fuente
Haskell,
94888479 bytesToma las sumas de las filas y columnas como una sola lista plana de 6 elementos
[r1,r2,r3,c1,c2,c3]
.Pruébalo en línea!
A medida que los elementos de las matrices para probar ascienden a la suma de
r
, el código no termina en un tiempo razonable para sumas grandes de fila / columna. Aquí hay una versión que sube al máximo de lar
cual es más rápida, pero 4 bytes más: ¡ Pruébelo en línea!fuente
Mathematica, 81 bytes
encuentra todas las matrices 3x3 con elementos 0..Max y selecciona las correctas,
esto significa que las
(Max+1)^9
matrices deben ser verificadasPruébalo en línea!
fuente
Grid
también trabajo con TIO, usandoToString
. Pruébalo en línea!R ,
115110 bytesPruébalo en línea!
Toma la entrada como
c(r1,r2,r3,c1,c2,c3)
una solavector
e imprime las matrices en stdout.Es bastante similar a la respuesta APL de Uriel , pero genera las cuadrículas de 3x3 de manera algo diferente.
Dejando
M=max(S)
, genera el vector0:M
, luego lorep
come 9 veces, es decir,[0..M, 0...M, ..., 0...M]
nueve veces. Luego selecciona todas las combinaciones de ese nuevo vector tomadas 9 a la vez, utilizandomatrix, 3, 3
para convertir cada combinación de 9 en una3x3
matriz y obligandosimplify=F
a devolver una lista en lugar de una matriz. Luego uniquifica esta lista y la guarda comom
.Luego filtra
m
para aquellos donde las sumas de fila / columna son idénticas a la entrada, imprime las que están y no hace nada por las que no lo son.Dado que calcula
choose(9*(M+1),9)
diferentes cuadrículas posibles (más que las(M+1)^9
posibilidades), se quedará sin memoria / tiempo más rápido que la respuesta más eficiente (pero menos golfosa) a continuación:R , 159 bytes
Pruébalo en línea!
fuente
MATL ,
3522 bytes-13 bytes gracias a Luis Mendo
Pruébalo en línea!
El enlace es a una versión del código que se imprime un poco mejor; Esta versión imprimirá todas las matrices con una sola línea nueva entre ellas.
Toma entrada como
[c1 c2 c3 r1 r2 r3]
.Obviamente, esto calcula el poder cartesiano
X^
de0...max(input)
con exponente9
y transposición!
. Luego recorre"
las columnas, rediseñando cada@
una como una matriz de 3x33e
, duplicándolast
, transponiéndolas!
y concatenándolas horizontalmenteh
. Luego calcula las sumas de columnass
, lo que dará como resultado el vector[c1 c2 c3 r1 r2 r3]
. Hacemos igualdad de elementos a la entradaG=
, y si?
todos son distintos de cero, recuperamos la matriz correcta seleccionando la entrada a la función!
mediante4M
.fuente
Lote, 367 bytes
El cuadrado superior izquierdo 2 × 2 fuerza el resultado, por lo que el mejor enfoque es generar todos los valores para el entero superior izquierdo, todos los valores válidos para la suma del entero superior izquierdo y medio superior, todos los valores válidos para la suma del top entero izquierdo y medio izquierdo, y calcule el rango de valores válidos para el entero medio, luego, tras recorrer todos los rangos apropiados, calcule los valores restantes a partir de las restricciones.
fuente
Python 2 , 118 bytes
Pruébalo en línea!
Python 2 , 123 bytes
Pruébalo en línea!
fuente