的JavaScript(ES6),153个 142 139字节
n=>([...n].map((c,i,[...a])=>[...''+1e9].map((u,j)=>s+=j+i&&j!=c?p((a.splice(i,1,j),a.join``)):0),s=0,p=q=>eval('for(k=q;q%--k;);k==1')),s)
接受输入为字符串。无效输入的不确定行为,尽管它应该在我能想到的任何字符串上终止而没有错误。虽然不一定在宇宙热死之前,特别是对于长弦。
演示版
f=
n=>([...n].map((c,i,[...a])=>[...''+1e9].map((u,j)=>s+=j+i&&j!=c?p((a.splice(i,1,j),a.join``)):0),s=0,p=q=>eval('for(k=q;q%--k;);k==1')),s)
console.log([...''+1e19].map((_,i)=>f(i+1+'')).join())
i.onchange=()=>console.log(f(i.value))
<input id=i>
改进措施
通过将reduce()调用重构为map()调用,并通过a在函数参数中而不是在splice()调用上下文中隐式复制数组,可以节省11个字节。
由于@Neil的建议将其转换[...Array(10)]为,因此节省了3个字节[...''+1e9]。
未缩小的代码
input => (
[...input].map(
(char, decimal, [...charArray]) =>
[...'' + 1e9].map(
(unused, digit) => sum +=
digit + decimal && digit != char ?
prime(
(
charArray.splice(decimal, 1, digit)
, charArray.join``
)
) :
0
)
, sum = 0
, prime = test => eval('for(factor = test; test % --factor;); factor == 1')
)
, sum
)
说明
该函数使用两级map()求和来对通过素数检验的排列数量求和,该数是从此答案中借用和修改的。
(原始答案)
reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)
因此,例如,计算一个数组的总和,你会通过一个initialValue中0,并返回一个aggregate等于accumulator + currentValue。稍微修改此方法,我们改为计算通过素数测试的排列数:
reduce(
(passedSoFar, currentDecimal, currentIndex, digitArray) =>
isValidPermutation() ?
passedSoFar + prime(getPermutation()) :
passedSoFar
, 0
)
那本质上是内部的reduce(),digitArray通过将每个改变decimal为一个具体的来迭代的所有排列permutatedDigit。然后,我们需要一个外部reduce()变量来迭代所有可能permutatedDigit的变量,以替换每个变量decimal,这就是0-9。
实施中的异常
[...''+1e9].map((u,j)=>...是最短的路@Neil可以争论想到的迭代0通过9。最好使用进行操作u,但u在这种情况下,对数组中的每个元素都没有用。
i+j0根据挑战说明,检查三元条件以确保不是前导数字的可能排列。j!=c确保原件n不是通过素数测试的候选人。
(a.splice(i,1,j),a.join``)有点混乱。splice()替换位在decimal == i与permutatedDigit == j,但因为splice()返回的移除的元件(在这种情况下,将等于[a[i]]),而不是修改后的数组,就必须使用逗号运算符通过修改后的数组a的素性测试,而不是之前join()荷兰国际集团它变成一个数字字符串。
最后,eval()就是要保存一个字节,因为与更规范的方法相比,它更短:
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
初始测试的引用p在map()调用的未使用参数中初始化。
n输出的最小值0。我认为是n = 200。我也认为他们在束:200,202,204,206,208,320,322,...,328,510,...,518,620,...628,840,...,848,等