Oblicz partycje N

22

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 Njest 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

DJMcMayhem
źródło
2
Czy możesz wyjaśnić, co rozumiesz przez „ uchwyt” ?
Dennis
@flawr Nie zgadzam się - znalezienie wszystkich partycji wystarczająco różni się od znalezienia ścisłych partycji. Jednak ten może być celem dupe.
Mego
Myślę, że szukanie nieuporządkowanych partycji i nieograniczanie liczby części czyni to wystarczająco innym.
xnor
Czy możesz wyjaśnić, co masz na myśli przez buitin ?
Leaky Nun

Odpowiedzi:

6

Pyth, 10 9 bajtów

{SMlMM./U

Nie 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:

              input       // initial data
        U     range       // makes a list of length equal to input
      ./      partition   // partitions string
   lMM        length      // length of each substring in each way to partition
 SM           sort        // sort each way to partition
{             deduplicate // removes all duplicate after sorting
              print       // implicit, output final result

Wypróbuj online tutaj.

busukxuan
źródło
{mSlMd./*Nzapisuje bajt
Leaky Nun
Możesz użyć 7 bajtów, jeśli używasz partycjonowania listy zamiast partycjonowania ciągów: pyth.herokuapp.com/?code=sMM.%2Fm1&input=5&debug=0
Maltysen
@LeakyNun Cóż, faktycznie próbowałem i nie uratowało bajtu. Kiedy zobaczyłem twój komentarz, dowiedziałem się, że moja odpowiedź to tak naprawdę 10 bajtów, więc właściwie się przeliczyłem (zapomniałem, że bloki gedit zaczynają się od 1).
busukxuan
@Maltysen Musisz posortować każdą podlistę, a następnie deduplikować.
busukxuan
@Maltysen Miałeś rację, korzystanie z list go skraca. Próbowałem dodać sort i deduplikację do kodu, z którym się łączyłeś, ale to nie pomogło, ale to dzięki tobie wpadłem na pomysł zastąpienia * N literą U. Dzięki!
busukxuan
6

Pyth, 18 bajtów

L?b{SM+R-bsdsyMb]Y

Wypróbuj online! (Na ykoń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 od 0do b-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 w b=1, dołącz 3(do sumy 4); itp.

Tak to głównie działa.

L?b{SM+R-bsdsyMb]Y

L                    define a function called "y" which takes an argument: "b"
 ?b                  test for truthiness of b (in this case, test if b>0).


   {SM+R-bsdsyMb     if truthy:

             yMb         call this function from 0 to b-1.
            s            unpack each list of partitions, generating only partitions.
      +R                 to each partition (d), append:
        -                    the difference of
         b                   b (the argument) and
          sd                 the sum of d (the partition).
    SM                   sort each partition.
   {                     remove duplicates.


                ]Y   if falsey:

                 Y       yield [].
                ]        yield [[]].
Leaky Nun
źródło
5

MATL , 20 bajtów

:"0Gq:@XNG3$Yc!dS!Xu

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 .

:        % Implicitly input N. Push [1 2 ... N]. These are the possible values of k,
         % except with N instead of 0
"        % For each
  0      %   Push 0
  Gq:    %   Push [1 ... N-1]. These the possible intermediate points
  @XN    %   Push k and produce the combinations. Each k produces a 2D array with
         %   each combination on a row. The value k=N produces an empty array
  G      %   Push N
  3$Yc   %   Prepend a column of zeros and append a column of N to the array
  !d     %   Transpose. Consecutive differences of each column
  S!     %   Sort each column. Transpose
  Xu     %   Keep only unique rows
         % Implicitly end for and display all arrays in the stack
Luis Mendo
źródło
1
Fajnie, koncepcja punktów podziału jest bardzo sprytnym sposobem na rozwiązanie tego.
Nick
@Nick Dziękuję! Witaj na (aktywnej) stronie! :-)
Luis Mendo
5

Haskell, 53 bajty

p=[[]]:[map(1:)q++[a+1:b|a:b<-q,all(a<)b]|q<-p]
(p!!)
Anders Kaseorg
źródło
5

J, 49 42 36 35 32 bajtów

a:1&([:~.@,(,;}./:~@,(+{.))&>)~]

Teraz 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,

Partition for n = 1
[[1]]

Partition for n = 2
[[1, 1]] join [[2]]
= [[1, 1], [2]]

Partition for n = 3
[[1, 2], [1, 1, 1]] join [[3], [1, 2]]
= [[3], [1, 2], [1, 1, 1]]

... and so on

Stosowanie

   f =: a:1&([:~.@,(,;}./:~@,(+{.))&>)~]
   f 1
┌─┐
│1│
└─┘
   f 2
┌───┬─┐
│1 1│2│
└───┴─┘
   f 3
┌─────┬───┬─┐
│1 1 1│1 2│3│
└─────┴───┴─┘
   f 5
┌─────────┬───────┬─────┬───┬─────┬───┬─┐
│1 1 1 1 1│1 1 1 2│1 2 2│2 3│1 1 3│1 4│5│
└─────────┴───────┴─────┴───┴─────┴───┴─┘
   # f 15
176

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.

a:1&([:~.@,(,;}./:~@,(+{.))&>)~]  Input: n
a:                                The empty box
                               ]  Get the input n
  1&(                        )~   Repeat n times with an initial array of one empty box
           (              )&>       Operate on each partition
                     (   )            Hook a partition
                       {.               Get its head (the smallest value)
  1                   +                 Add 1 to it
  1           }.                      Drop the first value in each partition
                    ,                 Join the previous two results
                /:~@                  Sort it
  1         ,                         Prepend a 1 to the initial partition
             ;                        Box the last two results and join them
     [:   ,                         Flatten the pairs of boxes
       ~.@                          Remove duplicates and return
                                  Return the final result where each box
                                  is a partition of n
mile
źródło
4

Python, 65 bajtów

Python 3

def f(n,i=1,l=[]):n or print(l);i>n or[f(n-i,i,[i]+l),f(n,i+1,l)]

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 iteż

  • Dodaje część rozmiaru ii zmniejsza się ndo n-ilub
  • Przechodzi do i+1

Jeśli i>n, to nie można już wyprodukować więcej części, więc zatrzymuje się. Jeśli ndo 0tego dojdzie, partycja zakończy się powodzeniem i tak zostanie wydrukowana.

Python 2

f=lambda n,i=1:n/i and[l+[i]for l in f(n-i,i)]+f(n,i+1)or[[]][n:]

Metoda rekurencyjna, która generuje listę partycji. Podobnie jak w przypadku kodu Python 3, zlicza rozmiar części ii na każdym kroku decyduje, czy dodać kolejną część rozmiaru, iczy zatrzymać.

Oba robią n=15prawie natychmiast.

xnor
źródło
3

JavaScript, 194 bajty

p=n=>{var a=[];for(var i=1;i<=n-i;i+=1){for(v of p(n-i)){v.push(i);a.push(v.sort())}}a.push([n]);return a};n=5;s=p(n).map(v=>JSON.stringify(v));s=s.filter((v,i)=>s.indexOf(v)==i);console.log(s);

Nie zminimalizowane

Znalezienie unikatów poprzez sortowanie i porównywanie z ciągiem jest dość włamaniem, ale prawdopodobnie oszczędza miejsce.

p = n => {
    var a = [];

    for (var i = 1; i <= n-i; i++)
    {
        for (v of p(n-i)) {
            v.push(i);
            a.push(v.sort());
        }
    }

    a.push([n]);

    return a;
}

n = 5;
s = p(n).map(v =>  JSON.stringify(v));
s = s.filter((v,i) => s.indexOf(v) == i);
console.log(s);
Nacięcie
źródło
4
Quite a hack but saves spaceWłaśnie o to chodzi w tej witrynie. : D
DJMcMayhem
2

Python 3.5, 82 72 bajty

f=lambda n:{(*sorted([*p,i]),)for i in range(1,n)for p in f(n-i)}|{(n,)}

Zwraca zestaw krotek. n = 15 kończy się natychmiast.

Przetestować go na repl.it .

Dennis
źródło
2

Haskell, 44 bajty

0%m=[[]]
n%m=[j:r|j<-[m..n],r<-(n-j)%j]
(%1)

Funkcja pomocnicza n%mdzieli partycje nna części ≥m, używając głównej funkcji m=1. To gałęzie każdego pierwszego wpisu jz m≤j≤n, recursing na pozostałej podziału n-jna części, które są co najmniej j. Podstawowa skrzynka n==0daje tylko pustą partycję.

xnor
źródło
1

Pyth, 17 bajtów

L|{SMs+LVrb0yMb]Y

Definiuje funkcję o nazwie y. Wypróbuj online .

Anders Kaseorg
źródło
1

Galareta , 9 bajtów

b1ŒṖḅ1Ṣ€Q

Wypróbuj online!

Jak to działa

b1ŒṖḅ1Ṣ€Q  Main link. Argument: n (integer)

b1         Convert n to unary, i.e., a list A of n 1's.
  ŒṖ       Generate all partitions of the list A.
    ḅ1     Convert each flat list from unary to integer.
      Ṣ€   Sort each resulting list.
        Q  Unique; deduplicate the lists.
Dennis
źródło
1

J, 39 bajtów

[:~.i.<@\:~@(#;.1~"1 0)1,@{@;(<1 0)#~<:

Jest to czasownik monadyczny, który przyjmuje liczbę całkowitą i zwraca tablicę tablic pudełkowych. Wypróbuj tutaj.Stosowanie:

   p =: [:~.i.<@\:~@(#;.1~"1 0)1,@{@;(<1 0)#~<:
   p 3
+-----+---+-+
|1 1 1|2 1|3|
+-----+---+-+

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:

  • Wyprodukuj wszystkie tablice długości 0-1 n .
  • Dla każdego z nich wytnij atrapęn tablicę długości wzdłuż 1s i wypisz długości każdej części.
  • Posortuj długości i usuń zduplikowane tablice z wyniku.

Najwyraźniej Luis Mendo miał ten sam pomysł .

Objaśnienie kodu:

[:~.i.<@\:~@(#;.1~"1 0)1,@{@;(<1 0)#~<:   Input is n.
                                     <:   n-1
                                   #~     copies of
                             (<1 0)       the boxed array [1 0].
                       1    ;             Prepend the boxed array [1].
                          {@              Catalog: produces all combinations of taking one
                                          item from each box, in a high-dimensional matrix.
                        ,@                Flatten the matrix. This results in a list of all
                                          boxed 0-1 arrays of length n that begin with a 1.
    i.                                    The array A =: 0, 1, ..., n-1.
            (     "1 0)                   For each of the boxed arrays B:
              ;.1~                          cut A along the occurrences of 1s in B,
             #                              take the length of each part,
        \:~@                                sort the lengths,
      <@                                    and put the result in a box.
[:~.                                      Remove duplicate boxes.
Zgarb
źródło
Bardzo miłe użycie cięcia ;.ponownie.
mile
1

Brachylog , 33 bajty (niekonkurujące)

:1f:oad.
:1eI,.##lI,.:{.>0}a+?,.=

Jest to niekonkurencyjne ze względu na naprawę błędu.

15Na moim komputerze zajmuje to około 1 sekundy . Dla 20i 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:

    :1f                       Find the list of all valid outputs of predicate 1
       :oa                    Sort each element of that list
          d.                  Output is that list of sorted lists minus all duplicates
    
  • Predykat 1:

    :1eI                      I is an integer between Input and 1
        .##lI,                Output is a list of length I
              .:{.>0}a        Elements of Output are integers greater than 0
                      +?,     The sum of the elements of Output is Input
                         .=   Assign values to the elements of Output
    
Fatalizować
źródło
1

Mathematica, 62 54 bajty

Inner[#2~Table~#&,FrobeniusSolve[r=Range@#,#],r,Join]&

Podział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 . FrobeniusSolvejest 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 .

mile
źródło
... a jak to nie jest wbudowane?
Leaky Nun
@LeakyNun FrobeniusSolvenie znajduje partycji całkowitych, znajduje wszystkie rozwiązania liczb całkowitych nieujemnych x1 ... xN w równaniach o a1 x1 + a2 x2 + ... aN xN = bpodanej formie a1 ... aNi b.
mile
0

JavaScript (Firefox 30-57) 79 ES6, 65 bajtów

f=(n,m=1,a=[])=>n?m>n?[]:[...f(n-m,m,[...a,m]),...f(n,m+1,a)]:[a]

Port rozwiązania Python @ xnor. (Gdybym tylko zauważył, że możesz powrócić mtak samo jak n...)

Neil
źródło