Twoim wyzwaniem jest prosta: Biorąc pod uwagę liczbę całkowitą N , ouput każdej listy liczb całkowitych dodatnich tym sum do N . Na przykład, jeśli wartością wejściową było 5, powinieneś wyjść
[1, 1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 4]
[2, 3]
[5]
Listy te nie muszą być wyprowadzane w określonej kolejności, podobnie jak liczby wewnątrz każdej listy. Na przykład byłby to również akceptowalny wynik dla „5”:
[1, 1, 1, 2]
[5]
[3, 1, 1]
[2, 1, 2]
[4, 1]
[1, 1, 1, 1, 1]
[2, 3]
Możesz bezpiecznie założyć, że wejście będzie dodatnią liczbą całkowitą, i możesz przyjąć tę liczbę w dowolnym rozsądnym formacie.
Być może nie korzystać z żadnych funkcji wbudowanych, które to zrobić.
Jeśli twój program zawiedzie lub zajmuje zbyt dużo czasu dla dużej N, jest to OK, ale musisz przynajmniej wygenerować poprawne wyjście dla pierwszych 15.
Obowiązują standardowe luki, a najkrótsza odpowiedź w bajtach wygrywa!
Przetestuj IO
1:
[[1]]
2:
[[1, 1], [2]]
3:
[[1, 1, 1], [1, 2], [3]]
4:
[[1, 1, 1, 1], [1, 1, 2], [1, 3], [2, 2], [4]]
5:
[[1, 1, 1, 1, 1], [1, 1, 1, 2], [1, 1, 3], [1, 2, 2], [1, 4], [2, 3], [5]]
7:
[[1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 3], [1, 1, 1, 2, 2], [1, 1, 1, 4], [1, 1, 2, 3], [1, 1, 5], [1, 2, 2, 2], [1, 2, 4], [1, 3, 3], [1, 6], [2, 2, 3], [2, 5], [3, 4], [7]]
10:
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 1, 1, 1, 3], [1, 1, 1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 1, 1, 4], [1, 1, 1, 1, 1, 2, 3], [1, 1, 1, 1, 1, 5], [1, 1, 1, 1, 2, 2, 2], [1, 1, 1, 1, 2, 4], [1, 1, 1, 1, 3, 3], [1, 1, 1, 1, 6], [1, 1, 1, 2, 2, 3], [1, 1, 1, 2, 5], [1, 1, 1, 3, 4], [1, 1, 1, 7], [1, 1, 2, 2, 2, 2], [1, 1, 2, 2, 4], [1, 1, 2, 3, 3], [1, 1, 2, 6], [1, 1, 3, 5], [1, 1, 4, 4], [1, 1, 8], [1, 2, 2, 2, 3], [1, 2, 2, 5], [1, 2, 3, 4], [1, 2, 7], [1, 3, 3, 3], [1, 3, 6], [1, 4, 5], [1, 9], [2, 2, 2, 2, 2], [2, 2, 2, 4], [2, 2, 3, 3], [2, 2, 6], [2, 3, 5], [2, 4, 4], [2, 8], [3, 3, 4], [3, 7], [4, 6], [5, 5], [10]]
Bardzo duży przypadek testowy: 15 powinno to wypisać
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5], [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4], [1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3], [1, 1, 1, 1, 1, 1, 1, 1, 1, 6], [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3], [1, 1, 1, 1, 1, 1, 1, 1, 2, 5], [1, 1, 1, 1, 1, 1, 1, 1, 3, 4], [1, 1, 1, 1, 1, 1, 1, 1, 7], [1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 2, 2, 4], [1, 1, 1, 1, 1, 1, 1, 2, 3, 3], [1, 1, 1, 1, 1, 1, 1, 2, 6], [1, 1, 1, 1, 1, 1, 1, 3, 5], [1, 1, 1, 1, 1, 1, 1, 4, 4], [1, 1, 1, 1, 1, 1, 1, 8], [1, 1, 1, 1, 1, 1, 2, 2, 2, 3], [1, 1, 1, 1, 1, 1, 2, 2, 5], [1, 1, 1, 1, 1, 1, 2, 3, 4], [1, 1, 1, 1, 1, 1, 2, 7], [1, 1, 1, 1, 1, 1, 3, 3, 3], [1, 1, 1, 1, 1, 1, 3, 6], [1, 1, 1, 1, 1, 1, 4, 5], [1, 1, 1, 1, 1, 1, 9], [1, 1, 1, 1, 1, 2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 2, 2, 2, 4], [1, 1, 1, 1, 1, 2, 2, 3, 3], [1, 1, 1, 1, 1, 2, 2, 6], [1, 1, 1, 1, 1, 2, 3, 5], [1, 1, 1, 1, 1, 2, 4, 4], [1, 1, 1, 1, 1, 2, 8], [1, 1, 1, 1, 1, 3, 3, 4], [1, 1, 1, 1, 1, 3, 7], [1, 1, 1, 1, 1, 4, 6], [1, 1, 1, 1, 1, 5, 5], [1, 1, 1, 1, 1, 10], [1, 1, 1, 1, 2, 2, 2, 2, 3], [1, 1, 1, 1, 2, 2, 2, 5], [1, 1, 1, 1, 2, 2, 3, 4], [1, 1, 1, 1, 2, 2, 7], [1, 1, 1, 1, 2, 3, 3, 3], [1, 1, 1, 1, 2, 3, 6], [1, 1, 1, 1, 2, 4, 5], [1, 1, 1, 1, 2, 9], [1, 1, 1, 1, 3, 3, 5], [1, 1, 1, 1, 3, 4, 4], [1, 1, 1, 1, 3, 8], [1, 1, 1, 1, 4, 7], [1, 1, 1, 1, 5, 6], [1, 1, 1, 1, 11], [1, 1, 1, 2, 2, 2, 2, 2, 2], [1, 1, 1, 2, 2, 2, 2, 4], [1, 1, 1, 2, 2, 2, 3, 3], [1, 1, 1, 2, 2, 2, 6], [1, 1, 1, 2, 2, 3, 5], [1, 1, 1, 2, 2, 4, 4], [1, 1, 1, 2, 2, 8], [1, 1, 1, 2, 3, 3, 4], [1, 1, 1, 2, 3, 7], [1, 1, 1, 2, 4, 6], [1, 1, 1, 2, 5, 5], [1, 1, 1, 2, 10], [1, 1, 1, 3, 3, 3, 3], [1, 1, 1, 3, 3, 6], [1, 1, 1, 3, 4, 5], [1, 1, 1, 3, 9], [1, 1, 1, 4, 4, 4], [1, 1, 1, 4, 8], [1, 1, 1, 5, 7], [1, 1, 1, 6, 6], [1, 1, 1, 12], [1, 1, 2, 2, 2, 2, 2, 3], [1, 1, 2, 2, 2, 2, 5], [1, 1, 2, 2, 2, 3, 4], [1, 1, 2, 2, 2, 7], [1, 1, 2, 2, 3, 3, 3], [1, 1, 2, 2, 3, 6], [1, 1, 2, 2, 4, 5], [1, 1, 2, 2, 9], [1, 1, 2, 3, 3, 5], [1, 1, 2, 3, 4, 4], [1, 1, 2, 3, 8], [1, 1, 2, 4, 7], [1, 1, 2, 5, 6], [1, 1, 2, 11], [1, 1, 3, 3, 3, 4], [1, 1, 3, 3, 7], [1, 1, 3, 4, 6], [1, 1, 3, 5, 5], [1, 1, 3, 10], [1, 1, 4, 4, 5], [1, 1, 4, 9], [1, 1, 5, 8], [1, 1, 6, 7], [1, 1, 13], [1, 2, 2, 2, 2, 2, 2, 2], [1, 2, 2, 2, 2, 2, 4], [1, 2, 2, 2, 2, 3, 3], [1, 2, 2, 2, 2, 6], [1, 2, 2, 2, 3, 5], [1, 2, 2, 2, 4, 4], [1, 2, 2, 2, 8], [1, 2, 2, 3, 3, 4], [1, 2, 2, 3, 7], [1, 2, 2, 4, 6], [1, 2, 2, 5, 5], [1, 2, 2, 10], [1, 2, 3, 3, 3, 3], [1, 2, 3, 3, 6], [1, 2, 3, 4, 5], [1, 2, 3, 9], [1, 2, 4, 4, 4], [1, 2, 4, 8], [1, 2, 5, 7], [1, 2, 6, 6], [1, 2, 12], [1, 3, 3, 3, 5], [1, 3, 3, 4, 4], [1, 3, 3, 8], [1, 3, 4, 7], [1, 3, 5, 6], [1, 3, 11], [1, 4, 4, 6], [1, 4, 5, 5], [1, 4, 10], [1, 5, 9], [1, 6, 8], [1, 7, 7], [1, 14], [2, 2, 2, 2, 2, 2, 3], [2, 2, 2, 2, 2, 5], [2, 2, 2, 2, 3, 4], [2, 2, 2, 2, 7], [2, 2, 2, 3, 3, 3], [2, 2, 2, 3, 6], [2, 2, 2, 4, 5], [2, 2, 2, 9], [2, 2, 3, 3, 5], [2, 2, 3, 4, 4], [2, 2, 3, 8], [2, 2, 4, 7], [2, 2, 5, 6], [2, 2, 11], [2, 3, 3, 3, 4], [2, 3, 3, 7], [2, 3, 4, 6], [2, 3, 5, 5], [2, 3, 10], [2, 4, 4, 5], [2, 4, 9], [2, 5, 8], [2, 6, 7], [2, 13], [3, 3, 3, 3, 3], [3, 3, 3, 6], [3, 3, 4, 5], [3, 3, 9], [3, 4, 4, 4], [3, 4, 8], [3, 5, 7], [3, 6, 6], [3, 12], [4, 4, 7], [4, 5, 6], [4, 11], [5, 5, 5], [5, 10], [6, 9], [7, 8], [15]]
Katalog
Fragment kodu na dole tego postu generuje katalog na podstawie odpowiedzi a) jako listy najkrótszych rozwiązań według języka oraz b) jako ogólnej tabeli wyników.
Aby upewnić się, że Twoja odpowiedź się pojawi, zacznij od nagłówka, korzystając z następującego szablonu Markdown:
## Language Name, N bytes
gdzie N
jest rozmiar twojego zgłoszenia. Jeśli poprawić swój wynik, to może zachować stare porachunki w nagłówku, uderzając je przez. Na przykład:
## Ruby, <s>104</s> <s>101</s> 96 bytes
źródło
Odpowiedzi:
Pyth,
109 bajtówNie jestem pewien, czy to nie oszustwo, ale reguły mówiły tylko, że nie można używać partycji całkowitych (nie jest to wyraźnie określone w samym pytaniu, ale komentarz OP w pytaniu mówi o partycji całkowitej). Korzystam z partycji listy
ciągów, która tworzy wycinki listy łączące się w listę „macierzystą”. Uważam, że muszę podziękować @Maltysen za pomysł używania list zamiast ciągów znaków.n = 15 zajmuje mniej niż sekundę na moim komputerze.
W pseudokodzie przepływu danych:
Wypróbuj online tutaj.
źródło
{mSlMd./*N
zapisuje bajtPyth, 18 bajtów
Wypróbuj online! (Na
y
końcu służy się do wywołania funkcji)To jest dość szybkie.
Używa rekurencji. Jeśli dane wejściowe są
b
, moja metoda wygeneruje partycje od0
dob-1
, a następnie wygeneruje prawidłowe partycje z każdej.Na przykład, gdy
b=4
:b=0
daje[[]]
b=1
daje[[1]]
b=2
daje[[2], [1, 1]]
b=3
daje[[3], [1, 2], [1, 1, 1]]
Następnie do każdej partycji
b=0
, należy dołączyć4
(aby suma 4); do każdej partycji wb=1
, dołącz3
(do sumy4
); itp.Tak to głównie działa.
źródło
MATL , 20 bajtów
Wypróbuj online!
Do wprowadzenia
15
zajmuje około 2 sekund w kompilatorze online.Wyjaśnienie
Działa to poprzez generowanie punktów podziału, a następnie konwersję na długości podziału . Mam na myśli to, co następuje. Przy danych wejściowych N = 5 możliwa partycja to [2 2 1]. Jest to reprezentowane przez punkty podziału [0 2 4 5], takie jak kolejne różnice (lub długości) punktów podziału dają wynikowy podział numeru wejściowego.
Wszystkie tablice punktów działowych zaczynają się od 0 i kończy z N . Liczba k punktów pośrednich waha się od 0 do N -1. Dla podanych N i k punkty pośrednie można wygenerować jako kombinację liczb [1, 2, ..., N -1] wziętych k jednocześnie.
Kilka układów punktów podziału może dać ten sam wynik w innej kolejności. Na przykład punkty podziału [0 1 3 5] dawałyby długości podziału [1 2 2], tj. Takie same jak poprzednie [2 2 1] tylko w innej kolejności. Należy to wziąć pod uwagę, sortując każdą tablicę długości partycji i usuwając duplikaty .
źródło
Haskell, 53 bajty
źródło
J,
4942363532 bajtówTeraz jest milczący!
Tworzy partycję całkowitą n , konstruując partycje całkowite od 1 do n . Oblicza wynik dla n = 15 w ciągu milisekundy.
Zaczynając od początkowej partycji całkowitej,
[[1]]
która odpowiada n = 1, konstruuj następną partycję całkowitą, łącząc wyniki z dwóch operacji: dodając 1 do każdej partycji; zwiększenie najmniejszej wartości o 1 w każdej partycji. Oczywiście zduplikowane partycje zostaną usunięte. Aby uzyskać partycję całkowitą n = 2 i kolejne,Stosowanie
Wyjaśnienie
Ponieważ J nie obsługuje poszarpanych tablic, każda partycja musi być zapakowana, aby nie były wypełnione zerami po dołączeniu do innych partycji.
źródło
Python, 65 bajtów
Python 3
Ta funkcja gromadzi partycję i drukuje dane wyjściowe, rozgałęziając opcje. Decyduje o tym, ile jednych należy wstawić do partycji, ile dwójek itd. Dla każdej wartości
i
teżi
i zmniejsza sięn
don-i
lubi+1
Jeśli
i>n
, to nie można już wyprodukować więcej części, więc zatrzymuje się. Jeślin
do0
tego dojdzie, partycja zakończy się powodzeniem i tak zostanie wydrukowana.Python 2
Metoda rekurencyjna, która generuje listę partycji. Podobnie jak w przypadku kodu Python 3, zlicza rozmiar części
i
i na każdym kroku decyduje, czy dodać kolejną część rozmiaru,i
czy zatrzymać.Oba robią
n=15
prawie natychmiast.źródło
JavaScript, 194 bajty
Nie zminimalizowane
Znalezienie unikatów poprzez sortowanie i porównywanie z ciągiem jest dość włamaniem, ale prawdopodobnie oszczędza miejsce.
źródło
Quite a hack but saves space
Właśnie o to chodzi w tej witrynie. : DPython 3.5,
8272 bajtyZwraca zestaw krotek. n = 15 kończy się natychmiast.
Przetestować go na repl.it .
źródło
Haskell, 44 bajty
Funkcja pomocnicza
n%m
dzieli partycjen
na części≥m
, używając głównej funkcjim=1
. To gałęzie każdego pierwszego wpisuj
zm≤j≤n
, recursing na pozostałej podziałun-j
na części, które są co najmniejj
. Podstawowa skrzynkan==0
daje tylko pustą partycję.źródło
Pyth, 17 bajtów
Definiuje funkcję o nazwie
y
. Wypróbuj online .źródło
Galareta , 9 bajtów
Wypróbuj online!
Jak to działa
źródło
J, 39 bajtów
Jest to czasownik monadyczny, który przyjmuje liczbę całkowitą i zwraca tablicę tablic pudełkowych. Wypróbuj tutaj.Stosowanie:
Na wejściu 15 działa przez około sekundę na moim komputerze.
Wyjaśnienie
To wyzwanie od razu wyglądało jak zadanie dla Catalog (
{
) i Cut (;.
). Zarys algorytmu jest następujący:n
.n
tablicę długości wzdłuż 1s i wypisz długości każdej części.Najwyraźniej Luis Mendo miał ten sam pomysł .
Objaśnienie kodu:
źródło
;.
ponownie.Brachylog , 33 bajty (niekonkurujące)
Jest to niekonkurencyjne ze względu na naprawę błędu.
15
Na moim komputerze zajmuje to około 1 sekundy . Dla20
i więcej to zawiesza się zOut of global stack
wyjątkiem.Wyjaśnienie
Nie używa to żadnego wbudowanego partycjonowania, a zamiast tego wykorzystuje fakt, który
+
działa w obie strony poprzez propagację ograniczeń.Główny predykat:
Predykat 1:
źródło
Mathematica,
6254 bajtyPodziały liczby całkowitej n można znaleźć, rozwiązując dla n -liczb całkowitych nieujemnych liczb całkowitych ( c 1 , c 2 , ..., c n ) tak, że c 1 + 2 c 2 + ... + n c n = n .
FrobeniusSolve
jest w stanie znaleźć wszystkie rozwiązania tego równania, które są używane do utworzenia tylu kopii ich odpowiednich wartości, aby znaleźć wszystkie całkowite partycje n .źródło
FrobeniusSolve
nie znajduje partycji całkowitych, znajduje wszystkie rozwiązania liczb całkowitych nieujemnychx1 ... xN
w równaniach oa1 x1 + a2 x2 + ... aN xN = b
podanej formiea1 ... aN
ib
.JavaScript
(Firefox 30-57) 79ES6, 65 bajtówPort rozwiązania Python @ xnor. (Gdybym tylko zauważył, że możesz powrócić
m
tak samo jakn
...)źródło