JavaScript (ES6), 153 142 139 byte
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)
Accetta input come stringa. Comportamento indefinito per input non valido, anche se dovrebbe terminare senza errori su qualsiasi stringa che mi viene in mente. Tuttavia, non necessariamente prima della morte per calore dell'universo, in particolare per le corde lunghe.
dimostrazione
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>
miglioramenti
Salvato 11 byte refactoring delle reduce()chiamate in map()chiamate e copiando implicitamente l'array anel parametro della funzione, anziché all'interno del contesto della splice()chiamata.
Parati 3 byte grazie @Neil suggerimento s' per convertire [...Array(10)]a [...''+1e9].
Codice non minificato
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
)
Spiegazione
La funzione utilizza un livello map()a due per sommare la quantità di permutazioni che superano il test di primalità, che è stato preso in prestito e modificato da questa risposta .
(Risposta originale)
reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)
Ad esempio, per calcolare la somma di un array, si passa un initialValuedi 0e si restituisce un aggregateuguale a accumulator + currentValue. Modificando leggermente questo approccio, calcoliamo invece il numero di permutazioni che superano il test di primalità:
reduce(
(passedSoFar, currentDecimal, currentIndex, digitArray) =>
isValidPermutation() ?
passedSoFar + prime(getPermutation()) :
passedSoFar
, 0
)
Questo è essenzialmente l'interno reduce(), che itera tutte le permutazioni digitArraycambiando ognuna decimalin una specifica permutatedDigit. Abbiamo quindi bisogno di un esterno reduce()per iterare tutte le possibili permutatedDigitcon cui sostituirle decimal, il che è giusto 0-9.
Anomalie nell'attuazione
[...''+1e9].map((u,j)=>...era la via più breve @Neil potrebbe pensare di iterare un argomento 0attraverso 9. Sarebbe preferibile farlo con u, ma unon è utile per ciascun elemento dell'array, in questo caso.
i+jnei controlli delle condizioni ternarie per assicurarsi che 0non sia possibile una permutazione della cifra iniziale, come da specifica della sfida. j!=cassicura che l'originale nnon sia un candidato per passare il test di primalità.
(a.splice(i,1,j),a.join``)è un po 'un casino. splice()sostituisce la cifra decimal == icon il permutatedDigit == j, ma da allorasplice() restituisce gli elementi rimossi (in questo caso, sarebbe uguale a [a[i]]) invece dell'array modificato, dobbiamo usare l'operatore virgola per passare l'array modificato aal test di primalità, ma non primajoin() inserirlo in una stringa numerica.
Infine, eval()è quello di salvare un byte poiché, rispetto all'approccio più canonico, è più breve:
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
Il riferimento al test principale pviene inizializzato in un argomento non utilizzato alla map()chiamata.
nper cui è l'output0. Penso di sin = 200. Penso anche che vengono in grappoli:200,202,204,206,208,320,322,...,328,510,...,518,620,...628,840,...,848, ecc