分解游戏


13

输入值

单个整数。1x1015

输出量

具有乘积的不同正整数的最大数量。x

例子

输入:1099511627776。输出:9.一种可能的最佳因子列表是:(1、2、4、8、16、32、64、128、4096)。

输入:127381。输出4。一种可能的最佳因子列表是:(1、17、59、127)。

与这个老问题有关


9
您能否再添加一些测试用例?(最好是合理的大小。)
Arnauld,

8
鉴于您对大多数答案的评论:如果您正在寻找有效的代码,则绝对不应将其标记为code-golf。您可以考虑fastest-code或考虑fastest-algorithm即将到来的挑战。如果您确实希望所有答案都在指定范围内的有限时间内生效,则应明确提及。(我建议使用较小的范围,以免与code-golf整个范围冲突。)
Arnauld,

@Arnauld不,我要小心使其成为代码高尔夫球,因此没有人被评判为。如果代码可以在指定的输入范围内运行,那就太酷了。
阿努什


1
因为x=1, 2, ...我得到f(x)=1, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 3, 3, 2, 4, 2, 3, 3, 3, 2, 4, 2, 3, 3, 3, 3, 4, 2, 3了我在OEIS中找不到的东西。很显然,记录将显示阶乘数x。例如最小x,从而f(x)=1313!。我想f仅取决于素数分解的指数。因此,f(13^4*19^7*29^2)我们可以将其简化为f(2^7*3^4*5^2)
杰普·斯蒂格·尼尔森

Answers:


5

Wolfram语言(Mathematica),52字节

Max[Length/@Cases[Subsets@Divisors@#,{a__}/;1a==#]]&

在线尝试!

@attinat节省了4个字节

这也是一个153字节的版本,用于计算109951162777610^15

Max[Length/@Table[s=RandomSample@Flatten[Table@@@FactorInteger[#]];Last@Select[Times@@@TakeList[s,#]&/@IntegerPartitions@Length@s,DuplicateFreeQ],5!]]+1&      

在线尝试!

的结果10^1512

{1,2,4,5,10,16,25,40,50,100,125,250}


崩溃与1099511627776
Anush

7
@Anush不会崩溃。只需要内存。您没有说任何有关内存限制的信息。这是代码高尔夫球
J42161217 '19

是的,我意识到。如果您可以在问题中指定的输入范围内实际运行代码,那就太好了。
阿努什

6
@Anush这是代码高尔夫球。不好的答案。请指定您的条件。答案是否有效。我认为这里的问题是问题……也许您应该将其更改为“最充分的算法”
J42161217

3
@Anush我对我的答案进行了编辑,并添加了一个新的版本,该版本在您需要检查时确实非常快捷高效
J42161217 '19


3

05AB1E,9个字节

效率很低。对于除数较大的数字,将在TIO上超时。

ÑæʒPQ}€gZ

在线尝试!

说明

Ñ          # push a list of divisors of the input
 æ         # push the powerset of that list
  ʒPQ}     # filter, keep only the lists whose product is the input
      €g   # get the length of each
        Z  # take the maximum

您的TIO代码似乎输出3而不是
9。– Anush

@Anush:这是与您的示例不同的数字(由于多种因素,一次超时)。我可能应该使用一个更明显的例子。
艾米尼亚(Emigna)

€gZéθg相同的字节数有效。
Grimmy

@格里米:是的。它不会造成太大的差别,因为它是过滤器,在这里是最大的坏人,但是效率更高一点也不无害:)
Emigna

2

Perl 6、38个字节

{$!=$_;+grep {$!%%$_&&($!/=$_)},1..$_}

在线尝试!

采用贪婪的方法来选择除数。


不会以1099511627776结尾
-Anush

6
@Anush嗯,它最终终止了。通常,如果程序的算法可以与任何输入配合使用,并且给出了所需的尽可能多的内存和时间,则答案是有效的。由于这是代码高尔夫,因此我针对代码长度(而非算法复杂性)进行了优化
乔·金

2

Javascript(ES6),39个字节

f=(n,i=0)=>n%++i?n>i&&f(n,i):1+f(n/i,i)

可能到处都有一些字节可以保存。仅将贪婪算法用于这些因素。


2

果冻,9字节

ŒPP=³ƊƇẈṀ

在线尝试!

-1字节感谢某人

-2个字节,感谢ErikTheOutgolfer


在为OEIS超级搜索者准备输入内容时,我创建了一个11字节的可打高尔夫球果冻程序(使用不同的方法),并且不太可能发布果冻答案,因此我假装我从您的解决方案中打了一个字节:(ÆE×8‘½’:2S‘它可以使用OEIS“公式”部分中A003056的功能)。免责声明:这可能是错误的,但它适用于测试用例。
我的代名词是monicareinstate,

它似乎并没有以1099511627776结尾
Anush

@someone不适用于36岁,但谢谢
HyperNeutrino

@Anush是的,它真的很慢,因为我对它进行了代码编码,未针对效率进行优化
HyperNeutrino

1
ÆDx21


2

Brachylog,8个字节

f;?⟨⊇×⟩l

在线尝试!

(幼稚的方法,{~×≠l}ᶠ⌉在用消除它们之前会生成无数个带有1的解,因此实际上无法终止。但这不是问题,因为它是相同的字节数!)

通过输入变量获取输入,并通过输出变量获取输出。TIO的标头包含大多数代码的副本,目的是向您显示因素列表,但是如果没有它,此方法也可以很好地工作。由于先给出较大的子列表,因此该谓词实际上与大多数其他答案具有相同的作用,但是由于回溯,因此无需显式生成和过滤因子的完整幂集。

            The output
       l    is the length of
    ⊇       a sublist (the largest satisfying these constraints)
f           of the factors of
            the input
 ; ⟨  ⟩     which
     ×      with its elements multiplied together
  ?         is the input.


1

盖亚10 9个字节

Π=
dz↑⁇(l

在线尝试!

遵循与其他地方相同的“算法”-过滤除数幂集最长的乘积,其乘积等于该数字并返回其长度。

	| helper function
Π=	| is prod(list)==n (implicit)?
	|
	| main function; implicitly takes n
dz	| divisor powerset (in decreasing order of size)
  ↑⁇	| filter by helper function
    (l	| take the first element and take the length (implicitly output)

0

,15字节

p}_`nq#:;qQ@s~Q

TIO链接即将推出(当丹尼斯拉出时)

基本上是@Emigna的05AB1E解决方案的端口。

说明

                - Implicit Q = first input
p               - Print...
 }              - The last element of...
  _             - Sorted...
   `nq          - Lengths of... (map q => q.len)
           @s   - Items in powerset of
             ~Q - Proper divisors of Q
      #         - Where... (filter)
        ;q      - Product of subset
       :        - Equals...
          Q     - Q

0

C#(Visual C#交互式编译器),54字节

int f(int n,int i=0)=>n%++i<1?1+f(n/i,i):n>i?f(n,i):0;

使用与@vrugtehagel和@JoKing的答案相同的方法。

在线尝试!


假设我正确实现了您的逻辑,那么是一个53字节的解决方案(我无法摆脱“ return”关键字):在线尝试!
我的代名词是monicareinstate '19

1
@someone谢谢,但是根据meta,函数必须是可重用的。另外,我不知道在函数外进行声明是否省略尾部分号是否可以接受,可能会在其上发布元信息。
无知的体现,

0

Ruby,34个字节

显然,在该数量上会超时,但如果在另一台计算机上有足够的时间,最终将超时。

->n{(1..n).count{|e|n%e<1?n/=e:p}}

在线尝试!

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.