Pozitif bir tamsayının katı bölümleri


14

OEIS A000009 sayar sıkı bölümleri tamsayılar. Bir katı bölüm negatif olmayan tamsayı n(tekrarlanmayacağını izin böylece ve sipariş önemli değil) pozitif tamsayılar bir dizi için bu toplamı n.

Örneğin, 5 üç katı bölümleri vardır: 5, 4,1, ve 3,2.

10'un on bölümü vardır:

10
9,1
8,2
7,3
6,4
7,2,1
6,3,1
5,4,1
5,3,2
4,3,2,1

Meydan okuma

Negatif olmayan bir tam sayı n<1000 olduğunda, sahip olduğu katı bölümlerin sayısını çıktılayın.

Test senaryoları:

0 -> 1

42 -> 1426

OEIS'ten 0 ila 55 arasındaki katı bölüm numaralarının listesi:

[1,1,1,2,2,3,4,5,6,8,10,12,15,18,22,27,32,38,46,54,64,76,89,104,122,142,165,192,222,256,296,340,390,448,512,585,668,760,864,982,1113,1260,1426,1610,1816,2048,2304,2590,2910,3264,3658,4097,4582,5120,5718,6378]

Bu , bu nedenle bayttaki en kısa çözüm kazanır.

Yanıtlar:


4

Mathematica, 11 bayt

PartitionsQ

Test durumu

PartitionsQ@Range[10]
(* {1,1,2,2,3,4,5,6,8,10} *)

3

Pyth, 7 bayt

l{I#./Q

Çevrimiçi deneyin. Test odası.

  • Girişi alın ( Q).
  • Bölümlerini bulun ( ./).
  • #Bölümü {değiştirmeden ( I) uniquify ( ) öğesine filtre uygulayın . Bu, kopyaları olan bölümleri kaldırır.
  • Sonucun uzunluğunu bulun ( l).

3

Haskell, 39 bayt

f n=sum[1|x<-mapM(:[0])[1..n],sum x==n]

İşlev (:[0])bir sayıyı klisteye dönüştürür [k,0]. Yani,

mapM(:[0])[1..n]

0 'ın atlanmış elemanlar için [1,0],[2,0],...,[n,0]tüm alt kümelerini veren Kartezyen çarpımını hesaplar [1..n]. Katı bölümleri, nbu tür listelere toplamla karşılık gelir n. Bu tür öğeler, daha kısa bir liste kavrayışı ile sayılır length.filter.


Parlak! Kendi cevabımda subsequences(+ import) yerine yeni bir şey arıyordum , ancak şimdiye kadar başarılı olamadım.
nimi

2

ES6, 64 bayt

f=(n,k=0)=>[...Array(n)].reduce((t,_,i)=>n-i>i&i>k?t+f(n-i,i):t,1)

Özyinelemeli deneme çıkarma ile çalışır. ken son çıkarılan sayıdır ve çıkarılacak bir sonraki sayı daha büyük olmalıdır (ancak daha büyük bir sayı çıkarılamayacak kadar büyük olmamalıdır). 1 eklenir, çünkü her zaman nkendini çıkarabilirsiniz . (Ayrıca bu özyinelemeli olduğu için tüm değişkenlerimin yerel olmasına dikkat etmeliyim.)


2

Python, 68 bayt

p=lambda n,d=0:sum(p(n-k,n-2*k+1)for k in range(1,n-d+1))if n else 1

Negatif olmayan tamsayıyı geçen anonim işlevi nargüman olarak çağırmanız yeterlidir ... ve evrenin sonunu bekleyin.


bunu yapmak n>0, bir bayt kaydetmek ve daha hızlı gitmek (negatif sayılar üzerinde recurse inanıyorum): P
st0le

Ayrıca, bu tür memoize hızlandırır
st0le

If if return sum(...)if n else 1
ifadenizi

@randomra Tabii ki, elbette ...
Bob

1

Python 2, 49 bayt

f=lambda n,k=1:n/k and f(n-k,k+1)+f(n,k+1)or n==0

Her potansiyel summand yineleme dalları karasından 1için no dahil edilmelidir karar vermek. Dahil edilen her bir summand istenen toplamdan çıkarılır nve sonunda n=0kalırsa bu yol sayılır.


1

Haskell, 43 bayt

0%0=1
_%0=0
n%k=n%(k-1)+(n-k)%(k-1)
f n=n%n

İkili işlev , maksimum parçası olan parçalara n%kkatı bölüm sayısını sayar , bu nedenle istenen işlevdir . Her bir değer azalır ki içerilebilir ile , ya da dışarıda, ve her iki durumda da, yeni maksimum Özyinelemeyi veren, düşük bir tanesidir .nkf n=n%nknkkn%k=n%(k-1)+(n-k)%(k-1)


n%k|q<-k-1=n%q+(n-k)%q3. sıradaki bir baytı tıraş eder.
Izaak Weiss

0

Julia, 53 bayt

n->endof(collect(filter(p->p==∪(p),partitions(n))))

Bu, bir tamsayıyı kabul eden ve bir tam sayı döndüren anonim bir işlevdir. Bunu çağırmak için bir değişkene atayın.

Tamsayı bölümlerini partitions, filteryalnızca farklı summand'lara sahip olanları collectbir diziye kullanarak alırız ve kullanarak son dizini (yani uzunluk) buluruz endof.


0

Haskell, 58 bayt

import Data.List
h x=sum[1|i<-subsequences[1..x],sum i==x]

Kullanım örneği: map h [0..10]-> [1,1,1,2,2,3,4,5,6,8,10].

Basit bir kaba kuvvet yaklaşımı. Öğesinin tüm alt kümelerinin toplamlarını kontrol edin 1..x. Bu için çalışır x == 0, tüm alt diziler yüzünden de [1..0]vardır [[]]ve toplamı []olduğunu 0.


0

05AB1E , 8 bayt

ÅœʒDÙQ}g

Çevrimiçi deneyin veya tüm test senaryolarını doğrulayın .

Açıklama:

Ŝ          # Get all integer partitions of the (implicit) input
            #  i.e. 5 → [[1,1,1,1,1],[1,1,1,2],[1,1,3],[1,2,2],[1,4],[2,3],[5]]
  ʒ   }     # Filter by:
   D        #  Duplicate the current partition
    Ù       #  Uniquify (removing any duplicated values from) this copied partition
            #   i.e. [1,1,1,1,1] → [1]
            #   i.e. [1,4] → [1,4]
     Q      #  Check if it's still the same
            #   i.e. [1,1,1,1,1] and [1] → 0 (falsey)
            #   i.e. [1,4] and [1,4] → 1 (truthy)
       g    # Then take the length of the filtered list (and implicitly output it)
            #  i.e. [[1,4],[2,5],[5]] → 3

0

05AB1E , 5 bayt

LæOQO

Çevrimiçi deneyin!

Not: Bu son derece yavaştır ve yaklaşık 20'den büyük girişler için zaman aşımı olacaktır.

Açıklama:

L         # range 1..input
 æ        # list of subsets
  O       # sum each subset
   Q      # equal? (1 for each sum that equals the input, 0 otherwise)
    O     # sum the booleans
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.