Problem
Betrachten Sie ein Quadrat aus nicht negativen ganzen Zahlen im Verhältnis 3 zu 3. Für jede Zeile wird i
die Summe der ganzen Zahlen auf gesetzt r_i
. In ähnlicher Weise wird für jede Spalte j
die Summe der Ganzzahlen in dieser Spalte auf gesetzt c_j
.
Die Aufgabe besteht darin, Code zu schreiben, um alle möglichen unterschiedlichen Zuordnungen von Ganzzahlen zu dem Raster unter Berücksichtigung der Summenbedingungen für Zeilen und Spalten aufzulisten. Ihr Code sollte jeweils eine Zuweisung ausgeben.
Eingang
Ihr Code sollte 3 nicht negative Ganzzahlen, die die Zeilenbeschränkungen angeben, und 3 nicht negative Ganzzahlen, die die Spaltenbeschränkungen angeben, enthalten. Sie können davon ausgehen, dass diese gültig sind, dh dass die Summen- oder Zeileneinschränkungen der Summe der Spalteneinschränkungen entsprechen. Ihr Code kann dies auf jede bequeme Weise tun.
Ausgabe
Ihr Code sollte die verschiedenen 2D-Gitter, die er berechnet, in einem von Menschen lesbaren Format Ihrer Wahl ausgeben. Je schöner, desto besser natürlich. Die Ausgabe darf keine doppelten Raster enthalten.
Beispiel
Wenn alle Zeilen- und Spalteneinschränkungen exakt sind, 1
gibt es nur 6
verschiedene Möglichkeiten. Für die erste Reihe können Sie eine 1
in eine der ersten drei Spalten einfügen, für die zweite Reihe gibt es jetzt 2
Alternativen und die letzte Reihe ist jetzt vollständig durch die beiden vorhergehenden bestimmt. Alles andere im Raster sollte auf eingestellt sein 0
.
Angenommen, die Eingabe gilt 2 1 0
für die Zeilen und 1 1 1
für die Spalten. Unter Verwendung des schönen Ausgabeformats von APL sind die möglichen Ganzzahlgitter:
┌─────┬─────┬─────┐
│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│
└─────┴─────┴─────┘
Sagen wir nun, die Eingabe gilt 1 2 3
für die Zeilen und 3 2 1
für die Spalten. Die möglichen Ganzzahlgitter sind:
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│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│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
quelle
Schale ,
2017 Bytes-3 Bytes dank @ H.PWiz
Nimmt die Eingabe als Liste
xs
, die die Einschränkungen codiert[r_1,r_2,r_3,c_1,c_2,c_3]
, und probiert es online aus!Erläuterung
Brute-Force-Ansatz: P Generiere alle 3x3-Gitter mit Einträgen
[0..max xs]
:quelle
Brachylog , 17 Bytes
Probieren Sie es online!
WARNUNG: HÄSSLICHE AUSGABE! Nicht ausflippen, es ist immer noch lesbar, ich muss nicht erklären, wie viel. ;)
Aus irgendeinem Grund muss es viel länger dauern als erwartet (13 Bytes):
Diese letztere Version hätte, wenn es funktioniert hätte, stattdessen Eingaben von der Ausgabe (dh Befehlszeilenargument) genommen.
quelle
Python 2 ,
149145142141138136 BytesProbieren Sie es online!
Nimmt Eingaben als Liste von Listen entgegen:
[[r1, c1], [r2, c2], [r3, c3]]
quelle
Haskell,
94888479 BytesNimmt die Summen der Zeilen und Spalten als einzelne flache Liste mit 6 Elementen
[r1,r2,r3,c1,c2,c3]
.Probieren Sie es online!
Da die Elemente der zu testenden Matrizen die Summe von erreichen
r
, endet der Code bei großen Zeilen- / Spaltensummen nicht in angemessener Zeit. Hier ist eine Version, die bis zu dem Maximumr
schneller ist, aber 4 Bytes länger: Probieren Sie es online aus!quelle
Mathematica, 81 Bytes
findet alle 3x3 Matrizen mit den Elementen 0..Max und wählt die richtigen aus
dies bedeutet, dass
(Max+1)^9
Matrizen überprüft werden müssenProbieren Sie es online!
quelle
Grid
Auch mit TIO arbeiten, verwendenToString
. Probieren Sie es online!R ,
115–110BytesProbieren Sie es online!
Nimmt die Eingabe als
c(r1,r2,r3,c1,c2,c3)
Singlevector
und druckt die Matrizen auf Standardausgabe.Es ist der APL-Antwort von Uriel ziemlich ähnlich, generiert jedoch die 3x3-Gitter etwas anders.
Lässt
M=max(S)
es den Vektor erzeugen0:M
undrep
isst ihn dann neunmal, dh[0..M, 0...M, ..., 0...M]
neunmal. Dann werden alle Kombinationen dieses neuen Vektors ausgewählt, die jeweils 9 Mal aufgenommen wurden, wobeimatrix, 3, 3
jede 9-Kombination in eine3x3
Matrix konvertiert wird undsimplify=F
eine Liste anstelle eines Arrays zurückgegeben wird. Diese Liste wird dann vereinheitlicht und als gespeichertm
.Dann wird
m
nach denjenigen gefiltert, bei denen die Zeilen- / Spaltensummen mit der Eingabe identisch sind, und diejenigen gedruckt, die vorhanden sind, und für diejenigen, die nicht vorhanden sind, wird nichts unternommen.Da es
choose(9*(M+1),9)
verschiedene mögliche Gitter berechnet (mehr als das(M+1)^9
Möglichkeiten), geht ihm der Speicherplatz / die Zeit schneller aus als die effizientere (aber weniger golfige) Antwort unten:R , 159 Bytes
Probieren Sie es online!
quelle
MATL ,
3522 Bytes-13 Bytes dank Luis Mendo
Probieren Sie es online!
Der Link verweist auf eine Version des Codes, die etwas besser gedruckt wird. Diese Version druckt nur alle Matrizen mit einer einzelnen Zeile dazwischen.
Übernimmt die Eingabe als
[c1 c2 c3 r1 r2 r3]
.Offensichtlich berechnet dies die kartesische Potenz
X^
von0...max(input)
Exponent9
und Transponieren!
. Anschließend werden"
die Spalten durchlaufen und jeweils@
als 3x3-Matrix umgeformt3e
, dupliziertt
, transponiert!
und horizontal verketteth
. Dann berechnet es die Spaltensummens
, die den Vektor ergeben[c1 c2 c3 r1 r2 r3]
. Wir führen eine elementweise Gleichheit mit der Eingabe durchG=
, und wenn?
alle ungleich Null sind, stellen wir die richtige Matrix wieder her, indem wir die Eingabe für die Funktion!
mit auswählen4M
.quelle
Batch, 367 Bytes
Das 2 × 2-Quadrat oben links erzwingt das Ergebnis. Daher ist es am besten, alle Werte für die Ganzzahl oben links, alle gültigen Werte für die Summe der Ganzzahl oben links und oben in der Mitte sowie alle gültigen Werte für die Summe der Ganzzahl oben links zu generieren Ganzzahl links und Mitte links, und berechnen Sie den Bereich der gültigen Werte für die Ganzzahl Mitte. Nachdem Sie alle entsprechenden Bereiche durchlaufen haben, berechnen Sie die verbleibenden Werte aus den Einschränkungen.
quelle
Python 2 , 118 Bytes
Probieren Sie es online!
Python 2 , 123 Bytes
Probieren Sie es online!
quelle