两个数字是否包含唯一的阶乘?


11

将两个数字分解为阶乘;如果它们共享任何一个,则返回一个false值。否则,返回真实值。(受到最近这个问题的启发)

换句话说,以最贪婪的方式将每个输入数字写为(正整数的)阶乘和。如果两个表示中都没有阶乘出现,则返回真实值,否则返回假值。

鉴于20和49:

20 = 3! + 3! + 3! + 2!
49 = 4! + 4! + 1!

在这两种表示中都没有阶乘出现,因此返回真实值。

鉴于32和132:

132 = 5! + 3! + 3!
 32 = 4! + 3! + 2!

3!在两种表示形式中均出现,因此返回假值。

输入输出

输入和输出可以通过任何标准方式进行

输入将始终是两个非负整数;这些整数没有您的语言要求的上限。

输出应为真值或假值。只要每个输出正确地为真/假,这些值对于不同的输入不一定必须是一致的。

测试用例

如果输入为0,则答案将始终是真实的。其他真实测试用例:

{6, 3}, {4, 61}, {73, 2}, {12, 1}, {240, 2}, {5, 264}, {2, 91}, {673, 18},
 {3, 12}, {72, 10}, {121, 26}, {127, 746}

如果两个输入都是奇数整数,或者两个输入都是相同的正整数,则输出将始终为false。其他虚假测试用例:

{8, 5}, {7, 5}, {27, 47}, {53, 11}, {13, 123}, {75, 77}, {163, 160}, {148, 53},
 {225, 178}, {285, 169}, {39, 51}, {207, 334}, {153, 21}, {390, 128}, {506, 584},
 {626, 370}, {819, 354}

这是,因此最少的字节获胜!


“以最贪婪的方式将每个输入数字写为阶乘(正整数)的和”,您不是说最懒惰的方式吗?
user41805

4
@KritixiLithos没有 他指的是称为贪婪算法的一类算法,该算法通过在每个步骤之后最大化一些指标来工作。在这种情况下,请尽其所能。
John Dvorak

Answers:


9

果冻,7个字节

Æ!ṠḄ&/¬

在线尝试!

这个怎么运作

Æ!ṠḄ&/¬  Main link. Argument: (x, y) (pair of integers)

Æ!       Convert x and y to factorial base.
  Ṡ      Apply the sign function to each digit.
   Ḅ     Unbinary; convert each resulting Boolean array from base 2 to integer.
    &/   Reduce the resulting pair of integers by bitwise AND.
      ¬  Take the logical NOT of the result.

Æ!在某些情况下似乎非常有用。
Magic Octopus Urn

尝试不带符号地直接对乘数基列表进行元素乘积,会得到什么?
格雷格·马丁

@GregMartin我不这么认为。必须将数字数组填充或截断为相同的长度,这可能会花费比保存的字节更多的字节。
丹尼斯



2

JavaScript(ES6),71个字节

(a,b,g=(n,e=1,f=1)=>n>=f&&g(n,++e,f*e)+((n/f|0)%e&&1<<e))=>!(g(a)&g(b))

JavaScript的整数限制为53位精度,这足以满足18!的要求!这意味着我可以使用18位的掩码来跟踪需要哪些阶乘。



0

Mathematica,73个字节

F[x_]:=First@IntegerPartitions[x,99,Range[99]!];!IntersectingQ[F@#,F@#2]&

输入表格

[x1,x2]


我在测试该错误时遇到了一些错误...
Scott Milner

只需在末尾输入[x1,x2]
J42161217,2015年

啊。我输入的是列表,而不是两个单独的整数。您可以使用±x_:=First@IntegerPartitions[x,99,Range[99]!];!IntersectingQ[±#,±#2]&[4,61](69字节)进一步打高尔夫球。在ISO 8859-1编码中,±是1个字节。
Scott Milner

0

C,122 119字节

G(q,i){return gamma(q+1)>i?gamma(q):G(q+1,i);}
Q(a,b,u,v){while(a&&b){a-=u=G(1,a);b-=v=G(1,b);if(a==b)exit();}exit(0);}

Q是主要功能。应该使用恰好两个正整数值来调用它。这将退出并退出代码0用于truthy和1对falsy。

尽管这在TIO上似乎不起作用,但在提供Homebrew的系统上也可以使用gcc 7.1.0

我已经有C一段时间没有打高尔夫球了,因此非常感谢打高尔夫球!

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.