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)
Acepta entradas como una cadena. Comportamiento indefinido para entrada no válida, aunque debería terminar sin error en cualquier cadena que se me ocurra. Sin embargo, no necesariamente antes de la muerte por calor del universo, particularmente para cuerdas largas.
Manifestación
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>
Mejoras
Ahorró 11 bytes refactorizando las reduce()
llamadas en map()
llamadas y copiando implícitamente la matriz a
en el parámetro de la función, en lugar de hacerlo dentro del contexto de la splice()
llamada.
Guardado 3 bytes gracias a @Neil sugerencia 's para convertir [...Array(10)]
a [...''+1e9]
.
Código no 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
)
Explicación
La función utiliza dos niveles map()
para sumar la cantidad de permutaciones que pasan la prueba de primalidad, que se tomó prestada y modificada de esta respuesta .
(Respuesta original)
reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)
Entonces, por ejemplo, para calcular la suma de una matriz, pasaría un initialValue
de 0
y devolvería un aggregate
igual a accumulator + currentValue
. Modificando ligeramente este enfoque, calculamos el número de permutaciones que pasan la prueba de primalidad:
reduce(
(passedSoFar, currentDecimal, currentIndex, digitArray) =>
isValidPermutation() ?
passedSoFar + prime(getPermutation()) :
passedSoFar
, 0
)
Eso es esencialmente lo interno reduce()
, que itera todas las permutaciones de la digitArray
al cambiar cada decimal
una a una específica permutatedDigit
. Luego necesitamos un exterior reduce()
para iterar todos los posibles permutatedDigit
con los que reemplazar cada uno decimal
, lo cual es justo 0-9
.
Anormalidades en la implementación
[...''+1e9].map((u,j)=>...
era el camino más corto @Neil podía pensar en iterar un argumento 0
a través 9
. Sería preferible hacerlo u
, pero u
no es útil para cada elemento de la matriz, en este caso.
i+j
en la condición ternaria, verifica que 0
no haya una permutación posible del dígito inicial, según la especificación de desafío. j!=c
asegura que el original n
no sea candidato para pasar la prueba de primalidad.
(a.splice(i,1,j),a.join``)
Es un desastre. splice()
reemplaza el dígito en decimal == i
con el permutatedDigit == j
, pero como splice()
devuelve los elementos eliminados (en este caso, sería igual a [a[i]]
) en lugar de la matriz modificada, debemos usar el operador de coma para pasar la matriz modificada a
a la prueba de primalidad, pero no antes de join()
iniciarla en una cadena de números.
Por último, eval()
es guardar un byte ya que, en comparación con el enfoque más canónico, es más corto:
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
La referencia a la prueba principal p
se inicializa en un argumento no utilizado para la map()
llamada.
n
para el que es la salida0
. Creo que esn = 200
. También creo que vienen en racimos:200,202,204,206,208
,320,322,...,328
,510,...,518
,620,...628
,840,...,848
, etc