因子总数


12

给定n> 1的正整数,确定乘以n大于1的整数可以得到多少个数字。例如,如果n = 24,则可以通过以下方式将n表示为乘积

24 = 24             -> 24            = 24
24 = 12 * 2         -> 12 + 2        = 14
24 = 6 * 2 * 2      -> 6 + 2 + 2     = 10
24 = 6 * 4          -> 6 + 4         = 10
24 = 3 * 2 * 2 * 2  -> 3 + 2 + 2 + 2 = 9
24 = 3 * 4 * 2      -> 3 + 4 + 2     = 9
24 = 3 * 8          -> 3 + 8         = 11

我们可以这样得到以下数字:

24, 14, 11, 10, 9

这是总共5个数字,所以我们的结果是5。

任务

编写一个程序或函数,将n作为输入并返回可以通过这种方式获得的结果数。

这是一个问题,因此答案将以字节计分,而字节越少越好。

OEIS序列

OEIS A069016


1
建议的测试用例240
Jonathan Allan

由于36引起了很多争论,我建议将其作为测试案例。
user41805

3
@WheatWizard 12 * 3
商业猫

1
我有2,2,3,3 -> 102,6,3 -> 112,2,9 -> 1312,3 -> 152,18 -> 2036 -> 36
商业猫

2
36应该是7,因为也(2*3)+(2*3)=12应该在列表中。
乔纳森·艾伦,

Answers:


6

Brachylog,8个字节

{~×≜+}ᶜ¹

在线尝试!

说明

{    }ᶜ¹  Count unique results of this predicate:
 ~×       Create list of numbers whose product is the input.
   ≜      Label the list, forcing it to take a concrete value.
    +     Take its sum.

我不完全确定为什么只生成具有大于1的元素的列表,但似乎这样做了,在此挑战中效果很好。


它只会生成元素大于1的列表,因为否则会存在无数个列表,这在此类挑战中通常是不利的。
致命的

4

盖亚9 14 13个字节

乔纳森·艾伦(Jonathan Allan)修复了5个字节的错误,然后打了1个字节。

ḍfḍ¦e¦Π¦¦Σ¦ul

在线尝试!或尝试作为测试套件

说明

ḍ              Prime factors
 f             Permutations
  ḍ¦           Get the partitions of each permutation
    e¦         Dump each list of partitions (1-level flatten the list)
      Π¦¦      Product of each partition
         Σ¦    Sum each group of products
           u   Deduplicate
            l  Length

您能否提供一个TIO链接,其中包含数字1至36(含1和36)的相应输出?
user41805

这就像果冻的答案一样
Egg the Outgolfer

1
OP说36的输出应该是5,而不是6
user41805 '17

1
根据OEIS,36给出的是7而不是5,但是您给出的是6
user41805

1
显然盖亚(Gaia)退出了[6 6]
user41805 '17

2

果冻 11 15  14 字节

+4字节修复
对称错误(也许是更好的方法?)- 1字节,通过滥用对称性

ÆfŒ!ŒṖ€ẎP€S€QL

单链链接,接受并返回正整数

在线尝试!或查看测试套件

怎么样?

正在更新...

ÆfŒ!ŒṖ€ẎP€S€QL - Link: number, n      e.g. 30
Æf             - prime factors of n        [2,3,5]
  Œ!           - all permutations          [[2,3,5],[2,5,3],[3,2,5],[3,5,2],[5,2,3],[5,3,2]]
    ŒṖ€        - all partitions for €ach   [[[[2],[3],[5]],[[2],[3,5]],[[2,3],[5]],[[2,3,5]]],[[[2],[5],[3]],[[2],[5,3]],[[2,5],[3]],[[2,5,3]]],[[[3],[2],[5]],[[3],[2,5]],[[3,2],[5]],[[3,2,5]]],[[[3],[5],[2]],[[3],[5,2]],[[3,5],[2]],[[3,5,2]]],[[[5],[2],[3]],[[5],[2,3]],[[5,2],[3]],[[5,2,3]]],[[[5],[3],[2]],[[5],[3,2]],[[5,3],[2]],[[5,3,2]]]]
       Ẏ       - tighten                   [[[2],[3],[5]],[[2],[3,5]],[[2,3],[5]],[[2,3,5]],[[2],[5],[3]],[[2],[5,3]],[[2,5],[3]],[[2,5,3]],[[3],[2],[5]],[[3],[2,5]],[[3,2],[5]],[[3,2,5]],[[3],[5],[2]],[[3],[5,2]],[[3,5],[2]],[[3,5,2]],[[5],[2],[3]],[[5],[2,3]],[[5,2],[3]],[[5,2,3]],[[5],[3],[2]],[[5],[3,2]],[[5,3],[2]],[[5,3,2]]]
        P€     - product for €ach          [[30],[6,5],[10,3],[2,3,5],[30],[10,3],[6,5],[2,5,3],[30],[6,5],[15,2],[3,2,5],[30],[15,2],[6,5],[3,5,2],[30],[10,3],[15,2],[5,2,3],[30],[15,2],[10,3],[5,3,2]]
               -   ...this abuses the symmetry saving a byte over P€€
          S€   - sum €ach                  [30,11,13,10,30,13,11,10,30,11,17,10,30,17,11,10,30,13,17,10,30,17,13,10][10,17,11,30,10,17,13,30,10,13,11,30,10,13,17,30,10,11,13,30,10,11,17,30]
            Q  - de-duplicate              [30,11,13,10,17]
             L - length                    5

1

Python 2,206字节

k=lambda n,i=2:n/i*[k]and[k(n,i+1),[i]+k(n/i)][n%i<1]
def l(t):
 r=[sum(t)]
 for i,a in enumerate(t):
    for j in range(i+1,len(t)):r+=l(t[:i]+[a*t[j]]+t[i+1:j]+t[j+1:])
 return r
u=lambda n:len(set(l(k(n))))

在线尝试!

说明

    # Finds the prime factors
k=lambda n,i=2:n/i*[k]and[k(n,i+1),[i]+k(n/i)][n%i<1]
    # Function for finding all possible numbers with some repetition
def l(t):
    # Add the current sum
 r=[sum(t)]
    # For each number in the current factors
 for i,a in enumerate(t):
    # For all numbers further back in the current factors, find all possible numbers when we multiply together two of the factors
    for j in range(i+1,len(t)):r+=l(t[:i]+[a*t[j]]+t[i+1:j]+t[j+1:])
 return r
    # Length of set for distinct elements
u=lambda n:len(set(l(k(n))))


1

Mathematica,110个字节

If[#==1,1,Length@Union[Tr/@Select[Array[f~Tuples~{#}&,Length[f=Rest@Divisors[s=#]]]~Flatten~1,Times@@#==s&]]]&

1

JavaScript(ES6)107字节

f=(n,o,s=0,i=2,q=n/i)=>(o||(o={},o[n]=t=1),i<n?(q>(q|0)|o[e=s+i+q]||(o[e]=t+=1),f(q,o,s+i),f(n,o,s,i+1)):t)

取消高尔夫:

f=(n,                                 //input
   o,                                 //object to hold sums
   s=0,                               //sum accumulator
   i=2,                               //start with 2
   q=n/i                              //quotient
  )=>(
  o||(o={},o[n]=t=1),                 //if first call to function, initialize o[n]
                                      //t holds the number of unique sums
  i<n?(                               //we divide n by all numbers between 2 and n-1
    q>(q|0)|o[e=s+i+q]||(o[e]=t+=1),  //if q is integer and o[s+i+q] is uninitialized,
                                      //... make o[s+i+q] truthy and increment t
    f(q,o,s+i),                       //recurse using q and s+i
    f(n,o,s,i+1)                      //recurse using n with the next i
  ):t                                 //return t
)

测试用例:

为了验证该函数计算出正确的和,我们可以输出对象的键而不是t

f=(n,o,s=0,i=2,q=n/i)=>(o||(o={},o[n]=t=1),i<n?(q>(q|0)|o[e=s+i+q]||(o[e]=t+=1),f(q,o,s+i),f(n,o,s,i+1)):Object.keys(o))

console.log(f(24));  //9, 10, 11, 14, 24


1

Python 3,251字节

lambda n:1 if n==1else len(set(sum(z)for z in t(f(n))))
f=lambda n:[]if n==1else[[i]+f(n//i)for i in range(2,n+1)if n%i==0][0]
t=lambda l:[l] if len(l)==1else[[l[0]]+r for r in t(l[1:])]+[r[:i]+[l[0]*e]+r[i+1:]for r in t(l[1:])for i,e in enumerate(r)]

在线尝试!

设计是基本的:

  1. 将n分解为素数(素数可能出现几次:)16 -> [2,2,2,2]。那就是功能f

  2. 计算主要因子列表的分区,并将每个分区中的因子相乘。可以在/programming//a/30134039中找到分区,并且可以实时计算乘积。那就是功能t

  3. 最终函数获取n的每个分区的乘积并将其求和,获得不同值的数量。

的结果2310=2*3*5*7*1149

编辑:也许需要修复,但是我现在没有时间看(我很着急)。提示:结果是否正确2310=2*3*5*7*11?我不这么认为。

EDIT2:修复。看上面。先前的(越野车)版本是: 在线尝试!

f计算因子(,以(0, n)而不是(1, n)作为第一个元素。

Lambda将每个因子拆分为“子因子”,然后将这些“子因子”相加。




感谢@notjagan,但是初始代码是如此错误……
jferard

感谢@HalvardHummel,但与上述相同。
jferard '17年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.