JavaScript (ES6), 153 142 139 bytes
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)
Aceita entrada como uma sequência. Comportamento indefinido para entrada inválida, embora deva terminar sem erro em qualquer string que eu possa pensar. Não necessariamente antes da morte por calor do universo, principalmente para cordas longas.
Demo
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>
Melhorias
Salva 11 bytes refatorando as reduce()
chamadas em map()
chamadas e copiando implicitamente a matriz a
no parâmetro function, em vez de dentro do contexto dosplice()
chamada.
Economizou 3 bytes graças à sugestão de @Neil de converter [...Array(10)]
para[...''+1e9]
.
Código não minificado
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
)
Explicação
A função usa um nível de dois níveis map()
para somar a quantidade de permutações que passam no teste de primalidade, que foi emprestado e modificado a partir desta resposta .
(Resposta original)
reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)
Por exemplo, para calcular a soma de uma matriz, você passaria um initialValue
de 0
e retornaria um aggregate
igual a accumulator + currentValue
. Modificando essa abordagem levemente, calculamos o número de permutações que passam no teste de primalidade:
reduce(
(passedSoFar, currentDecimal, currentIndex, digitArray) =>
isValidPermutation() ?
passedSoFar + prime(getPermutation()) :
passedSoFar
, 0
)
Isso é essencialmente o interior reduce()
, que itera todas as permutações do digitArray
alterando cada decimal
um para um específico permutatedDigit
. Precisamos, então, de um externo reduce()
para iterar todos os possíveis permutatedDigit
com os quais substituir cada um decimal
, o que é justo 0-9
.
Anormalidades na implementação
[...''+1e9].map((u,j)=>...
era o caminho mais curto @Neil poderia pensar para iterate um argumento 0
através 9
. Seria preferível fazê-lo com u
, mas u
não é útil para cada elemento da matriz, neste caso.
i+j
na condição ternária, verifica 0
se não é uma permutação possível do dígito inicial, conforme a especificação do desafio. j!=c
garante que o original n
não seja um candidato para passar no teste de primalidade.
(a.splice(i,1,j),a.join``)
é uma bagunça. splice()
substitui o dígito por decimal == i
com permutatedDigit == j
, mas como splice()
retorna os elementos removidos (nesse caso, seria igual a [a[i]]
) em vez da matriz modificada, devemos usar o operador vírgula para passar a matriz modificada a
para o teste de primalidade, mas não antes de join()
inseri-la em uma sequência numérica.
Por fim, o eval()
é salvar um byte, pois, comparado à abordagem mais canônica, é mais curto:
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
A referência ao teste principal p
é inicializada em um argumento não utilizado para a map()
chamada.
n
para o qual a saída é0
. Eu acho que én = 200
. Eu também acho que eles vêm em cachos:200,202,204,206,208
,320,322,...,328
,510,...,518
,620,...628
,840,...,848
, etc.