的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+j
0
根据挑战说明,检查三元条件以确保不是前导数字的可能排列。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
,等