자바 스크립트 (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()배열을 내재적으로 복사하여 11 바이트를 절약했습니다 .asplice()
@Neil 의 변환 제안 덕분에 3 바이트가 절약 [...Array(10)]되었습니다 [...''+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
)
설명
이 함수는 2 단계 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)=>...@Neil0 이를 통해 인수를 반복하는 것으로 생각할 수 있는 가장 짧은 방법이었습니다 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, 등