자바 스크립트 (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 바이트를 절약했습니다 .a
splice()
@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
, 등