按照我自己的说法,“龙虾数”是一个包含了它的所有主要因素的数字。“龙虾”的描述灵感来自最近的问题"龙虾速度“。基本思想是,每一个素因子都可以由龙虾咀嚼这个数字的数字,直到你只剩下这个因子。
51375是龙虾的一个数字,因为它的主要因素是[3,5,137],它可以由龙虾组成:[**3**, 5**** / ****5, *137*]。另一个龙虾数量是62379,因为因子[3,29,239]可以形成[**3**,*2**9,*23*9]。
给定一个数字作为输入,返回它是否是龙虾号。这是一个布尔输出,如1或0,或真或假。
精明的读者可能会意识到素数是解决这一需求的一个微不足道的解决方案,但由于他们不允许龙虾吃任何数字,他们就出局了。您的程序不能将素数标识为龙虾数。
这类似于OEIS A035140,但有一个附加要求,即因子的每个数字必须至少以相同的次数出现在数字中,并以正确的顺序出现。换句话说,132不是龙虾的数字,因为它的因素是[2,3,11],而11不能仅仅通过咀嚼132来制造。312也不是龙虾数,因为它的因素是[2,3,13],而13是不正常的。
我相信“数学”的定义是:“确定数n是否是一个复合数,使得n的所有素因子都是n的子序列”。
59177 -> True
62379 -> True
7 -> False
121 -> True
187 -> False
312 -> False一如既往,标准漏洞是被禁止的。
我注意到,我给出的不需要处理0或1作为输入的原始推理是错误的。但是,此时需要适当的输出将使许多答案失效。因此,让我们知道,0和1都不是龙虾号,但是您也不需要将它们作为输入来处理(它们不是有效的测试用例)。如果您的代码确实正确地处理了它们,那么您可以给自己颁发龙虾代言人徽章™。
发布于 2021-01-24 15:16:16
发布于 2021-01-25 04:46:56
通过退出代码输出:如果是龙虾号,则为0,否则为1。
n=m=input()
i=1
while~-m:
i+=1
while m%i<1:m/=reduce(lambda s,c:s[c==s[:1]:],`n`,`i`)or i%n确定子序列的算法从@xnor的回答借用到字符串X是字符串Y的子序列吗?。当子序列检查失败时,将引发TypeError,并且i%n将导致在素数输入上发生ZeroDivisionError。
使用exec可以保存一个字节,而代价是对大型输入进行分段故障。
n=m=input()
i=1
exec"i+=1\nwhile m%i<1:m/=reduce(lambda s,c:s[c==s[:1]:],`n`,`i`)or i%n\n"*n发布于 2021-01-24 15:11:23
DŒPḌḟiⱮÆfẠDŒPḌḟiⱮÆfẠ - Main link. Takes an integer n on the left
D - Digits of n
ŒP - Powerset of the digits
Ḍ - Convert back to integers
ḟ - Remove n from this list
Æf - Yield the prime factors of n
Ɱ - Over each prime factor:
i - Index of the factor in the powerset, or 0
Ạ - All are true?https://codegolf.stackexchange.com/questions/217960
复制相似问题