Problem
Rozważ kwadratową siatkę 3 na 3 liczb całkowitych nieujemnych. Dla każdego wiersza i
ustawiana jest suma liczb całkowitych r_i
. Podobnie dla każdej kolumny j
ustawiana jest suma liczb całkowitych w tej kolumnie c_j
.
Zadanie polega na napisaniu kodu wyliczającego wszystkie możliwe różne liczby całkowite do siatki, biorąc pod uwagę ograniczenia sumy wierszy i kolumn. Twój kod powinien wyświetlać jedno zadanie na raz.
Wejście
Twój kod powinien przyjąć 3 nieujemne liczby całkowite określające ograniczenia wiersza i 3 nieujemne liczby całkowite określające ograniczenia kolumny. Możesz założyć, że są one poprawne, tzn. Że ograniczenia sumy lub wiersza są równe sumie ograniczeń kolumny. Twój kod może to zrobić w dowolny dogodny sposób.
Wynik
Twój kod powinien wypisywać różne siatki 2D, które oblicza, w dowolnym formacie czytelnym dla człowieka. Im ładniejsza, tym lepiej. Dane wyjściowe nie mogą zawierać zduplikowanych siatek.
Przykład
Jeśli wszystkie ograniczenia wierszy i kolumn są dokładnie takie same, 1
istnieją tylko 6
inne możliwości. W pierwszym rzędzie możesz umieścić a 1
w dowolnej z pierwszych trzech kolumn, w drugim rzędzie są teraz 2
alternatywy, a ostatni rząd jest teraz całkowicie określony przez poprzednie dwa. Wszystko inne w siatce powinno być ustawione na 0
.
Powiedzmy, że dane wejściowe dotyczą 2 1 0
wierszy i 1 1 1
kolumn. Używając pięknego formatu wyjściowego APL, możliwe są następujące liczby całkowite:
┌─────┬─────┬─────┐
│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│
└─────┴─────┴─────┘
Powiedzmy teraz, że dane wejściowe dotyczą 1 2 3
wierszy i 3 2 1
kolumn. Możliwe siatki liczb całkowitych to:
┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐
│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│
└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘
źródło
Łuska ,
2017 bajtów-3 bajty dzięki @ H.PWiz
Pobiera dane wejściowe jako listę
xs
kodującą ograniczenia[r_1,r_2,r_3,c_1,c_2,c_3]
, spróbuj online!Wyjaśnienie
Podejście brutalnej siły: P Wygeneruj wszystkie siatki 3x3 z wpisami
[0..max xs]
:źródło
Brachylog , 17 bajtów
Wypróbuj online!
OSTRZEŻENIE: Brzydkie wyjście! Nie szukaj, to wciąż jest czytelne dla człowieka, nie muszę rozliczać się z tego, ile. ;)
Z jakiegoś powodu musi być znacznie dłuższy niż to, co miałbym sens (13 bajtów):
Ta ostatnia wersja, jeśli zadziała, pobierałaby dane wejściowe z danych wyjściowych (tj. Argument wiersza poleceń).
źródło
Python 2 ,
149145142141138136 bajtówWypróbuj online!
Pobiera dane wejściowe jako listę list:
[[r1, c1], [r2, c2], [r3, c3]]
źródło
Haskell,
94888479 bajtówSumuje wiersze i kolumny jako pojedynczą płaską 6-elementową listę
[r1,r2,r3,c1,c2,c3]
.Wypróbuj online!
Ponieważ elementy testowanych macierzy dochodzą do sumy
r
, kod nie kończy się w rozsądnym czasie dla dużych sum wierszy / kolumn. Oto wersja, która zwiększa się do maksimum,r
jest szybsza, ale o 4 bajty dłuższa: Wypróbuj online!źródło
Mathematica, 81 bajtów
znajduje wszystkie macierze 3x3 z elementami 0..Max i wybiera odpowiednie,
co oznacza, że
(Max+1)^9
macierze muszą zostać sprawdzoneWypróbuj online!
źródło
Grid
również współpracuj z TIO, używającToString
. Wypróbuj online!R ,
115110 bajtówWypróbuj online!
Pobiera dane wejściowe jako
c(r1,r2,r3,c1,c2,c3)
pojedynczyvector
i wypisuje macierze na standardowe wyjście.Jest dość podobny do odpowiedzi APL Uriela , ale generuje siatki 3x3 nieco inaczej.
Pozwalając
M=max(S)
, generuje wektor0:M
, a następnierep
je 9 razy, czyli[0..M, 0...M, ..., 0...M]
dziewięć razy. Następnie wybiera wszystkie kombinacje tego nowego wektora pobranego 9 na raz, używającmatrix, 3, 3
do konwersji każdej 9 kombinacji na3x3
macierz i zmuszającsimplify=F
do zwrócenia listy zamiast tablicy. Następnie ujednolica tę listę i zapisuje ją jakom
.Następnie filtruje
m
te, w których sumy wierszy / kolumn są identyczne z danymi wejściowymi, drukując te, które są, i nie robiąc nic dla tych, które nie są.Ponieważ oblicza
choose(9*(M+1),9)
różne możliwe siatki (więcej niż(M+1)^9
możliwości), zabraknie pamięci / czasu szybciej niż bardziej wydajna (ale mniej golfowa) odpowiedź poniżej:R , 159 bajtów
Wypróbuj online!
źródło
MATL ,
3522 bajtów-13 bajtów dzięki Luisowi Mendo
Wypróbuj online!
Link jest wersją kodu, która drukuje się trochę ładniej; ta wersja po prostu wydrukuje wszystkie macierze z jedną nową linią między nimi.
Pobiera dane wejściowe jako
[c1 c2 c3 r1 r2 r3]
.Oczywiście, to oblicza kartezjański moc
X^
o0...max(input)
z wykładnikiem9
i transpozycji!
. Następnie zapętla się"
nad kolumnami, przekształcając każdą z nich@
w matrycę 3x33e
, kopiująct
, transponując!
i konkatenując w poziomieh
. Następnie oblicza sumy kolumns
, co da wektor[c1 c2 c3 r1 r2 r3]
. Robimy elementarną równość względem danych wejściowychG=
, a jeśli?
wszystkie są niezerowe, odzyskujemy prawidłową macierz, wybierając dane wejściowe do funkcji!
za pomocą4M
.źródło
Partia, 367 bajtów
Lewy górny kwadrat 2 × 2 wymusza wynik, więc najlepszym podejściem jest wygenerowanie wszystkich wartości dla lewej górnej liczby całkowitej, wszystkich prawidłowych wartości dla sumy lewej górnej i górnej środkowej liczby całkowitej, wszystkich prawidłowych wartości dla sumy górnej lewą i środkową lewą liczbą całkowitą i oblicz zakres prawidłowych wartości dla środkowej liczby całkowitej, a następnie, po przejściu przez wszystkie odpowiednie zakresy, oblicz pozostałe wartości z ograniczeń.
źródło
Python 2 , 118 bajtów
Wypróbuj online!
Python 2 , 123 bajty
Wypróbuj online!
źródło