N bölümlerini hesaplayın


22

Buradaki zorluk basit: bir tamsayı verilen N , meblağlar da o pozitif sayının her listede çıktıya N . Örneğin, giriş 5 ise, çıkış yapmalısınız

[1, 1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 4]
[2, 3]
[5]

Bu listelerin belirli bir sırada çıktısı olması veya her listenin içindeki sayıları içermesi gerekmez. Örneğin, bu aynı zamanda '5' için kabul edilebilir bir çıktı olacaktır:

[1, 1, 1, 2]
[5]
[3, 1, 1]
[2, 1, 2]
[4, 1]
[1, 1, 1, 1, 1]
[2, 3]

Girişin pozitif bir tamsayı olacağını güvenle kabul edebilir ve bu numarayı herhangi bir makul formatta alabilirsiniz.

Sen olabilir değil bunu herhangi yerleşik işlevlerini kullanın.

Programınız başarısız olursa veya büyük N için çok uzun sürüyorsa, bu tamamdır, ancak en azından ilk 15 için doğru çıktıyı üretmelisiniz.

Standart boşluklar uygulanır ve bayt cinsinden en kısa cevap kazanır!

Test 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]]

Süper büyük test durumu: 15 bunun çıktısını almalı

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

Bu yazının altındaki Yığın Parçacığı, cevapları a) dil başına en kısa çözümün bir listesi olarak ve b) genel bir lider tablosu olarak oluşturur.

Cevabınızın göründüğünden emin olmak için, lütfen aşağıdaki Markdown şablonunu kullanarak cevabınızı bir başlık ile başlatın:

## Language Name, N bytes

Gönderinizin Nbüyüklüğü nerede ? Puanınızı artırmak varsa, olabilir onları içinden vurarak, başlığa eski hesapları tutmak. Örneğin:

## Ruby, <s>104</s> <s>101</s> 96 bytes



2
Size tarafından ne anlama geldiğini açıklayabilir misiniz sap ?
Dennis,

@flawr Ben katılmıyorum - tüm bölümleri bulmak, katı bölümler bulmaktan yeterince farklı. Ancak, bu bir dupe hedef olabilir.
Mego

Sırasız bölümler aradığımı ve parça sayısının sınırlandırılmamasının bunu farklı kıldığını düşünüyorum.
xnor

Eğer derken ne demek istediğine açıklık getirebilir buitin ?
Leaky Nun

Yanıtlar:


6

Pyth, 10 9 bayt

{SMlMM./U

Bunun hile yapıp yapmadığından pek emin değilsiniz, ancak kurallar yalnızca birinin tamsayı bölümünü kullanamayacağını söyledi (sorunun kendisinde açıkça belirtilmemiştir, ancak soruda OP'nin yaptığı yorum tamsayı bölümünü belirtir). "Ana" listeyle eşleşen listenin dilimlerini oluşturan dize listesi bölümünü kullanıyorum . Dizeleri yerine listeleri kullanma fikri için @Maltysen'e teşekkür etmem gerektiğine inanıyorum.

n = 15 makinemde bir saniyeden daha az sürüyor.

Veri akışı sözde kodunda:

              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

Burada çevrimiçi deneyin.


{mSlMd./*Nbir bayt kaydeder
Leaky Nun

Dize bölümü yerine liste bölümlemesi kullanıyorsanız 7 bayta gidebilirsiniz: pyth.herokuapp.com/?code=sMM.%2Fm1&input=5&debug=0
Maltysen

@LeakyNun Peki aslında denedim ve bir bayt kaydetmedi. Tho yorumunuzu gördüğümde, cevabımın aslında 10 bayt olduğunu öğrendim, bu yüzden aslında yanlış sayıldım (unutulan gedit blokları 1'den başlıyor).
busukxuan

@Maltysen Her bir alt listeyi sıralamanız ve ardından veri tekilleştirmeniz gerekir.
busukxuan

@Maltysen Haklıydınız, listeleri kullanmak onu kısaltır. Bağlandığınız kodlara sıralama eklemeyi ve veri tekilleştirmeyi denedim ve yardımcı olmadı, ancak hepsi sizin için * N'yi U ile değiştirme fikrine sahip olduğum için teşekkürler. Teşekkürler!
busukxuan

6

Pyth, 18 bayt

L?b{SM+R-bsdsyMb]Y

Çevrimiçi deneyin! ( ySonunda işlevi çağırmak için kullanılır)

Bu oldukça hızlı.

Bu özyineleme kullanır. Girilirse b, benim yöntem gelen bölümleri üretecektir 0için b-1ve ardından her doğru bölümleri oluşturur.

Örneğin, ne zaman b=4:

  • b=0 verir [[]]
  • b=1 verir [[1]]
  • b=2 verir [[2], [1, 1]]
  • b=3 verir [[3], [1, 2], [1, 1, 1]]

Sonra her bölüme b=0 ekleyiniz 4(toplamı 4 yapmak); her bölüme b=1ekleyiniz 3(toplamı yapmak için 4); vb.

Bu esas olarak böyle çalışır.

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 [[]].

5

MATL , 20 bayt

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

Çevrimiçi deneyin!

Giriş için 15 için çevrimiçi derleyicide yaklaşık 2 saniye sürer.

açıklama

Bu, bölüm noktaları oluşturarak ve sonra bölüm uzunluklarına dönüştürerek çalışır . Bununla demek istediğim şu. N = 5 girişi göz önüne alındığında , olası bir bölüm [2 2 1]. Bu, ardışık farklar sağlayacak şekilde bölümleme noktaları [0 2 4 5] ile temsil edilir. bölüm noktalarının (veya uzunlukları) giriş numarasının sonuçtaki bölümünü verir.

Bütün bölümleme noktaları 0 ile başlayıp N ile bitiyor . Ara noktaların k sayısı 0 ile N1 arasındadır . İçin N ve k verilen ara noktalar numaralarının bir kombinasyonu olarak oluşturulabilir [1, 2, ..., N -1] alınan k aynı anda.

Birkaç bölme noktası dizisi aynı sonucu farklı bir düzende ortaya çıkarabilir. Örneğin, bölme noktaları [0 1 3 5], bölme uzunluklarını [1 2 2], yani önceki [2 2 1] ile yalnızca farklı bir sırada verir. Her bölüm uzunluğu dizisini sıralayarak ve kopyaları kaldırarak bu dikkate alınmalıdır .

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

1
Güzel, bölünme noktaları kavramı bunu çözmenin çok akıllıca bir yoludur.
Nick,

@Nick Teşekkürler! Ve bu siteye (aktif olmak) hoş geldiniz! :-)
Luis Mendo


5

J, 49 42 36 35 32 bayt

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

Şimdi taktik!

Tamsayı bölümünü oluşturur. n 1'den için tamsayı bölümleri oluşturarak n . N sonucunu hesaplarBir milisaniyede = 15 .

[[1]]Karşılık gelen ilk tamsayı bölümü ile başlayarakN = 1'e , iki işlemden elde edilen sonuçları birleştirerek bir sonraki tamsayı bölümünü oluşturun: her bölüme 1 eklenmesi; Her bölümdeki en küçük değerin 1 arttırılması. Tabii ki, yinelenen bölümler kaldırılacak. N = 2 tamsayılı bölümü almak için

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

kullanım

   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

açıklama

J düzensiz dizileri desteklemediğinden, her bölüm kutu içine alınmalı, böylece diğer bölümlere eklendiklerinde sıfır dolgulu olmayacaklardır.

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

4

Python, 65 bayt

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)]

Bu işlev bir bölüm biriktirir ve çıktıları yazdırır, seçimlere göre dallar. Bu bölüme kaç tane 1 ekleyeceğine, kaç tane iki tane olacağına vb. Karar verir. Her değer iiçin ya

  • Büyüklükte bir kısmını ekler ive düşmektedir niçin n-i, ya da
  • Devam eder i+1

Eğer i>no zaman başka parça yapılamaz, bu yüzden durur. Eğer ndüşer0 , bölme başarılı ve böylece basılmış olmasıdır.

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

Bölüm listesi veren bir özyinelemeli yöntem. Python 3 kodunda olduğu gibi, parça boyutunu sayar ive her adımda boyutta başka bir parça eklenip eklenmeyeceğine karar verir.i yoksa durma .

Bunların ikisi de n=15neredeyse anında yapıyor.


3

Javascript, 194 bayt

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);

Sigara minified

Bir dize sıralama ve karşılaştırarak benzersiz bulma oldukça kesmek, ama muhtemelen yer kazandırır.

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);

4
Quite a hack but saves spaceBu tam olarak bu sitenin konusu. : D
DJMcMayhem

2

Python 3.5, 82 72 bayt

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

Bir dizi tup döndürür. n = 15 anında biter.

Repl.it üzerinde test edin .


2

Haskell, 44 bayt

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

Yardımcı fonksiyon n%mait bölümleri verir nbölüme ≥mana fonksiyonu kullanılarak, m=1. Her birinci girişin dalları jile m≤j≤nkalan bölümünde recursing, n-jen azından olan bölüme j. Temel durum n==0sadece boş bölümleri veriyor.



1

Jöle , 9 bayt

b1ŒṖḅ1Ṣ€Q

Çevrimiçi deneyin!

Nasıl çalışır

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.

1

J, 39 bayt

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

Bu bir tamsayı alan ve bir dizi kutulu dizi döndüren tek boyutlu bir fiildir. Burada dene. Kullanımı:

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

15 numaralı girişte, makinemde yaklaşık bir saniye çalışıyor.

açıklama

Bu zorluk hemen Catalog ( {) ve Cut ( ;.) için bir iş gibi görünüyordu . Algoritmanın ana hatları:

  • Tüm 0-1 uzunluk dizilerini üret n.
  • Her biri için aptal bir uzunlukta kesin.n için 1'ler boyunca uzunluk dizisi ve her bir parçanın uzunluğunu listeleyin.
  • Uzunlukları sıralayın ve tekrarlanan dizileri sonuçtan kaldırın.

Anlaşılan Luis Mendo da aynı fikirde .

Kod açıklaması:

[:~.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.

;.Yine kesim çok güzel kullanımı .
mil:

1

Brachylog , 33 bayt ( Yarışmıyor )

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

Bu bir hata düzeltmesi nedeniyle rekabet etmiyor.

Bu 15benim makinede için yaklaşık 1 saniye sürer . Bunun için 20ve daha büyükOut of global stack istisna .

açıklama

Bu, hiçbir şekilde yerleşik bir bölümlendirme kullanmaz ve bunun yerine +kısıtlamaların yayılması yoluyla her iki şekilde de çalışan gerçeği kullanır .

  • Ana tahmin:

    :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
    
  • Tahmin 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
    

1

Mathematica, 62 54 bayt

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

Bir tamsayı bölümleri n çözülmesi ile bulunabilir n (negatif olmayan tamsayılar -tuples c 1 , c 2 , ..., c n ) bu şekilde C 1 + 2 C 2 + ... + n C , n = n . n'ninFrobeniusSolve tüm tam sayılarını bulmak için kendi değerlerinin o kadar çok kopyasını oluşturmak için kullanılan bu denklemin tüm çözümlerini bulabilir .


... ve bu nasıl yerleşik değil?
Leaky Nun

@LeakyNun FrobeniusSolvetüm çözümler bulur bölümleri tamsayı bulmazsa negatif olmayan tamsayılar x1 ... xN formunun denklemlerine a1 x1 + a2 x2 + ... aN xN = bverilmiş a1 ... aNve b.
mil:

0

JavaScript (Firefox 30-57) 79 ES6, 65 bayt

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

@ Xnor'ın Python çözümünün limanı. (Ben üzerine recurse olabilir fark etmişti Keşke myanı sıra n...)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.