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 a
nel 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 initialValue
di 0
e si restituisce un aggregate
uguale 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 digitArray
cambiando ognuna decimal
in una specifica permutatedDigit
. Abbiamo quindi bisogno di un esterno reduce()
per iterare tutte le possibili permutatedDigit
con 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 0
attraverso 9
. Sarebbe preferibile farlo con u
, ma u
non è utile per ciascun elemento dell'array, in questo caso.
i+j
nei controlli delle condizioni ternarie per assicurarsi che 0
non sia possibile una permutazione della cifra iniziale, come da specifica della sfida. j!=c
assicura che l'originale n
non 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 == i
con 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 a
al 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 p
viene inizializzato in un argomento non utilizzato alla map()
chiamata.
n
per 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