Строгі розділи натурального числа


14

OEIS A000009 підраховує кількість строгих розділів цілих чисел. Суворе розбиття невід'ємного цілого числа nє безліч натуральних чисел (так що не повторення не допускається, і порядок не має значення) , що сума до n.

Наприклад, 5 має три розділи: строгі 5, 4,1і 3,2.

10 має десять розділів:

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

Виклик

Враховуючи невід’ємне ціле число n<1000, виведіть кількість суворих розділів.

Тестові приклади:

0 -> 1

42 -> 1426

Ось перелік чітких номерів розділів від 0 до 55 від OEIS:

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

Це , тому найкоротше рішення в байтах виграє.

Відповіді:


4

Математика, 11 байт

PartitionsQ

Тестовий випадок

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


3

Хаскелл, 39 байт

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

Функція (:[0])перетворює число kв список [k,0]. Так,

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

обчислює декартовий добуток [1,0],[2,0],...,[n,0], який дає всі підмножини [1..n]з 0 стоячи для опущених елементів. Суворі розділи nвідповідають таким спискам за сумою n. Такі елементи підраховуються за розумінням списку, яке коротше length.filter.


Блискуче! Я сам шукав заміни на subsequences(+ import) у своїй відповіді, але поки не досяг успіху.
німі

2

ES6, 64 байти

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

Працює шляхом рекурсивного пробного віднімання. k- це число, яке було останньо відняте, і наступне число, яке слід відняти, повинно бути більшим (але не таким великим, щоб не можна було відняти ще більше число). 1 додається, тому що ви завжди можете відняти nсебе. (Крім того, оскільки це рекурсивно, я повинен подбати про те, щоб усі мої змінні були локальними.)


2

Пітон, 68 байт

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

Просто зателефонуйте на анонімну функцію, передаючи невід'ємне ціле число nяк аргумент ... і дочекайтеся закінчення Всесвіту.


зробіть це n>0, ви економите байт та йдете швидше (я вважаю, ви повторюєте негативні цифри): P
st0le

Також запам'ятовування цього виду прискорює його
st0le

Не можете змінити заяву if на:return sum(...)if n else 1
andlrc

@randomra Звичайно, звичайно ...
Боб

1

Python 2, 49 байт

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

Рекурсія відділяється на кожну потенційну суму kвід 1того, nщоб вирішити, чи варто її включати. Кожна включена сума віднімається від бажаної суми n, і в кінці, якщо вона n=0залишається, цей шлях підраховується.


1

Haskell, 43 байти

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

Двійкова функція n%kпідраховує кількість строгих розділів nна частини з максимальною частиною k, тому потрібна функція є f n=n%n. Кожне значення kможе бути включене, яке зменшується nна kабо виключається, і в будь-якому випадку новий максимум kна один нижчий, що дає рекурсію n%k=n%(k-1)+(n-k)%(k-1).


n%k|q<-k-1=n%q+(n-k)%qголить байт з лінії 3.
Ізаак Вайс

0

Джулія, 53 байти

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

Це анонімна функція, яка приймає ціле число і повертає ціле число. Щоб викликати його, призначте його змінній.

Ми отримуємо цілі розділи , використовуючи partitions, filterтільки ті , з різними складовими, collectв масив, і знайти останній індекс (тобто довжину) з використанням endof.


0

Хаскелл, 58 байт

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

Приклад використання: map h [0..10]-> [1,1,1,2,2,3,4,5,6,8,10].

Це простий підхід грубої сили. Перевірте суми всіх подальших чисел 1..x. Це працює і для x == 0, тому що всі підпорядкування [1..0]є [[]]і сума []є 0.


0

05AB1E , 8 байт

ÅœʒDÙQ}g

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

Ŝ          # 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 байт

LæOQO

Спробуйте в Інтернеті!

Примітка: це надзвичайно повільно, і час очікує на введення більше 20.

Пояснення:

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.