Problème
Considérons une grille carrée de 3 x 3 d'entiers non négatifs. Pour chaque ligne, i
la somme des entiers est fixée à r_i
. De même, pour chaque colonne, j
la somme des entiers de cette colonne est définie sur c_j
.
La tâche consiste à écrire du code pour énumérer toutes les différentes affectations possibles d'entiers à la grille compte tenu des contraintes de somme des lignes et des colonnes. Votre code doit générer une affectation à la fois.
Contribution
Votre code doit prendre 3 entiers non négatifs spécifiant les contraintes de ligne et 3 entiers non négatifs spécifiant les contraintes de colonne. Vous pouvez supposer que celles-ci sont valides, c'est-à-dire que les contraintes de somme ou de ligne sont égales à la somme des contraintes de colonne. Votre code peut le faire de la manière qui vous convient.
Production
Votre code doit générer les différentes grilles 2D qu'il calcule dans n'importe quel format lisible par l'homme de votre choix. Plus c'est joli, mieux c'est. La sortie ne doit pas contenir de grilles en double.
Exemple
Si toutes les contraintes de ligne et de colonne sont exactement 1
alors il n'y a que 6
des possibilités différentes. Pour la première ligne, vous pouvez mettre un 1
dans l'une des trois premières colonnes, pour la deuxième ligne il y a maintenant des 2
alternatives et la dernière ligne est maintenant complètement déterminée par les deux précédentes. Tout le reste de la grille doit être défini sur0
.
Supposons que l'entrée 2 1 0
concerne les lignes et 1 1 1
les colonnes. En utilisant le joli format de sortie d'APL, les grilles d'entiers possibles sont:
┌─────┬─────┬─────┐
│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│
└─────┴─────┴─────┘
Supposons maintenant que l'entrée 1 2 3
concerne les lignes et 3 2 1
les colonnes. Les grilles entières possibles sont:
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│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│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
la source
Coque ,
2017 octets-3 octets grâce à @ H.PWiz
Prend l'entrée comme une liste
xs
codant les contraintes[r_1,r_2,r_3,c_1,c_2,c_3]
, essayez-le en ligne!Explication
Approche par force brute: P Générez toutes les grilles 3x3 avec des entrées
[0..max xs]
:la source
Brachylog , 17 octets
Essayez-le en ligne!
AVERTISSEMENT: PUISSANT SORTIE!Ne vous inquiétez pas, c'est toujours lisible par l'homme, je ne suis pas obligé de rendre compte de combien. ;)
Pour une raison quelconque, cela doit être beaucoup plus long que ce à quoi je m'attendrais pour avoir du sens (13 octets):
Cette dernière version, si elle fonctionnait, aurait plutôt pris l'entrée de la sortie (c'est-à-dire l'argument de ligne de commande).
la source
Python 2 ,
149145142141 141138136 octetsEssayez-le en ligne!
Prend la saisie sous forme de liste de listes:
[[r1, c1], [r2, c2], [r3, c3]]
la source
Haskell,
94888479 octetsPrend les sommes des lignes et des colonnes comme une seule liste plate à 6 éléments
[r1,r2,r3,c1,c2,c3]
.Essayez-le en ligne!
Comme les éléments des matrices à tester atteignent la somme de
r
, le code ne se termine pas dans un délai raisonnable pour les sommes de lignes / colonnes importantes. Voici une version qui monte au maximumr
qui est plus rapide, mais 4 octets de plus: essayez-la en ligne!la source
Mathematica, 81 octets
trouve toutes les matrices 3x3 avec les éléments 0..Max et sélectionne les bonnes,
cela signifie que les
(Max+1)^9
matrices doivent être vérifiéesEssayez-le en ligne!
la source
Grid
fonctionne également avec TIO, en utilisantToString
. Essayez-le en ligne!R ,
115110octetsEssayez-le en ligne!
Prend l'entrée comme
c(r1,r2,r3,c1,c2,c3)
un seulvector
et imprime les matrices sur la sortie standard.C'est assez similaire à la réponse APL d' Uriel , mais elle génère les grilles 3x3 quelque peu différemment.
Laissant
M=max(S)
, il génère le vecteur0:M
, puis lerep
mange 9 fois, soit[0..M, 0...M, ..., 0...M]
neuf fois. Ensuite, il sélectionne toutes les combinaisons de ce nouveau vecteur prises 9 à la fois, en utilisantmatrix, 3, 3
pour convertir chaque combinaison 9 en une3x3
matrice, et en forçantsimplify=F
à retourner une liste plutôt qu'un tableau. Il unifie ensuite cette liste et l'enregistre sousm
.Ensuite, il filtre
m
ceux dont les sommes de ligne / colonne sont identiques à l'entrée, en imprimant celles qui le sont et en ne faisant rien pour celles qui ne le sont pas.Puisqu'il calcule
choose(9*(M+1),9)
différentes grilles possibles (plus que les(M+1)^9
possibilités), il manquera de mémoire / temps plus rapidement que la réponse plus efficace (mais moins golfique) ci-dessous:R , 159 octets
Essayez-le en ligne!
la source
MATL ,
3522 octets-13 octets grâce à Luis Mendo
Essayez-le en ligne!
Le lien est vers une version du code qui s'imprime un peu mieux; cette version imprimera simplement toutes les matrices avec une seule nouvelle ligne entre elles.
Prend l'entrée comme
[c1 c2 c3 r1 r2 r3]
.Évidemment, cela calcule la puissance cartésienne
X^
de l'0...max(input)
exposant9
et de la transposition!
. Il boucle ensuite"
sur les colonnes, remodelant chacune@
comme une matrice 3x33e
, les dupliquantt
, les transposant!
et les concaténant horizontalementh
. Ensuite, il calcule les sommes des colonness
, ce qui donnera le vecteur[c1 c2 c3 r1 r2 r3]
. Nous faisons l'égalité élément par élément à l'entréeG=
, et si?
tous sont différents de zéro, nous récupérons la matrice correcte en sélectionnant l'entrée de la fonction!
à l'aide de4M
.la source
Lot, 367 octets
Le carré 2 × 2 en haut à gauche force le résultat, donc la meilleure approche consiste à générer toutes les valeurs pour l'entier supérieur gauche, toutes les valeurs valides pour la somme de l'entier supérieur gauche et supérieur, toutes les valeurs valides pour la somme du haut entier gauche et milieu gauche, puis calculez la plage de valeurs valides pour l'entier central, puis, après avoir parcouru toutes les plages appropriées, calculez les valeurs restantes à partir des contraintes.
la source
Python 2 , 118 octets
Essayez-le en ligne!
Python 2 , 123 octets
Essayez-le en ligne!
la source