连接素数


26

挑战:

您将得到一个仅包含数字的字符串。您的任务是输出必须连接形成字符串的最小素数。如果这不可能,则输出0

测试用例:

输入->输出:

252 -> 3
235 -> 2
92 -> 0
31149 -> 2


可以有前导零吗?
Zgarb '16

是的,可以有前导零。
poi830 '16

我们可以列出数字吗?
LegionMammal978 '16

1
如果有前导零,会发生什么?
丹尼斯

Answers:


6

的JavaScript(ES6),123 121 120个字节

f=(s,v)=>(p=n=>--n-1?s%n&&p(n):1)(s)||[...s].map((_,i)=>!(n=i&&(a=f(s.slice(0,i)))&&(b=f(s.slice(i)))&&a+b)|n>v?0:v=n)|v

感谢@Neil,节省了一个字节!

说明

将单个字符串作为输入。由于采用了素数检查方法(递归试验划分),因此可以安全检查的最大数字为13840。由于超出了最大调用堆栈大小,因此超出此数目的某些数字将失败。但是,它可以在每种情况下立即完成。

f=(s,v)=>
  (p=n=>--n-1?s%n&&p(n):1)(s) // if s is prime, return 1
  ||[...s].map((_,i)=>        // else for each index in s, split s into 2
    !(n=i&&                   // v = return value (initialised to undefined)
      (a=f(s.slice(0,i)))&&
      (b=f(s.slice(i)))&&
      a+b
    )|n>v?0:v=n               // if i, a, b and n are all > 0 and !(n > v), v = n
  )|v                         // cast v to an integer and return it

// Test
var testCases = [ "252", "235", "92", "3149", "24747" ];
document.write("<pre>" + testCases.map(c => c + ": " + f(c)).join("\n"));


是我还是您可以更改i?(a=...)&&(b=...)&&a+b:0i&&(a=...)&&(b=...)&&a+b
尼尔

5

MATL26 24字节

0in:"GUtZq@Z^V10ZA=a?x@.

一些测试用例需要花费几秒钟。

在线尝试!

说明

0       % Push 0
in:     % Take input. Generate array [1,2,...,N] where N is input length
"       % For each. In each iteration the number of used primes is increased
  GU    %   Push input. Convert to number
  tZq   %   Duplicate. Array of primes smaller than the input
  @     %   Push number of primes to bes tested in this iteration
  Z^    %   Cartesian power
  V     %   Convert to 2D array. Each row is a combination of primes
  10ZA  %   Convert each row to base 10, disregarding spaces
  =a    %   Do any of the results equal the input number? 
  ?     %   If so
    x   %     Remove the 0 that's at the bottom of the stack
    .   %     Break for each loop
        %   Implicitly end if
        % Implicitly end for each
        % Implicitly display



2

击+的coreutils,169个 158 149字节

c()
{
test $1||echo a
for i in `seq ${#1}`
do factor ${1::$i}|grep -q ': \w*$'&&printf b%s\\n `c ${1:$i}`
done
}
c $1|sort|sed '/a/!d;s/..//;q'|wc -c

我们算一元,输出一行,b每个质数一个a,行末尾有一个终止符(这样就printf可以使用令牌)。

素数测试为factor $n | grep -q ': \w*$',它确定数字是否恰好具有一个素数。

我们递归划分输入;如果左半部分是质数,我们将每个值加一个来过滤右半部分的结果。返回a零长度输入将终止递归。

最后,我们将所有结果取整并排序以找出最短的结果(忽略那些没有a指示成功的结果);我们必须删除两个(对于插入的a和换行的),然后计算字符以得出结果。

测验

$ for i in 252 235 92 31149 111; do echo "$i:"$'\t'"$(./77623.sh $i)"; done
252:    3
235:    2
92:     0
31149:  2
111:    0

我添加111到测试中以表明1正确地将其视为非质数。


我打算提出这个建议。我的大部分修改现在可能已过时,但其他修改仍然可以使用。
丹尼斯

@Dennis-我喜欢c生成决赛0。不过,并不是很热衷于标准配置。如果愿意,欢迎您使用我的答案(的版本)作为自己的基础。
Toby Speight

2

Mathematica,142 135字节

Min[Length/@Select[Join@@@Permutations/@IntegerPartitions@Length[a=#],And@@PrimeQ@*FromDigits/@a~Internal`PartitionRagged~#&]]/.∞->0&

如您所见,Mathematica不是为此任务而构建的。接受数字列表。


可以And@@代替使用AllTrue吗?应保存4-5个字节。
CalculatorFeline

Flatten[#,1]=Join@@@#
CalculatorFeline

嗯...在133上给出了错误和错误的答案...您确实使用了所有测试用例,对吗?
CalculatorFeline

@CatsAreFluffy打高尔夫球并澄清。
LegionMammal978 '16
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.