JavaScript (ES6), 153 142 139 octets
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)
Accepte les entrées en tant que chaîne. Comportement non défini pour une entrée non valide, même s'il doit se terminer sans erreur sur toutes les chaînes auxquelles je peux penser. Pas nécessairement avant la chaleur-mort de l'univers, surtout pour les longues ficelles.
Démo
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>
Améliorations
Vous avez enregistré 11 octets en reformulant les reduce()appels en map()appels et en copiant implicitement le tableau adans le paramètre de fonction, au lieu de dans le contexte de l' splice()appel.
Sauvegardé de 3 octets grâce à la suggestion de @Neil de convertir [...Array(10)]en [...''+1e9].
Code non miné
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
)
Explication
La fonction utilise un niveau map()à deux niveaux pour additionner le nombre de permutations satisfaisant au test de primalité, emprunté et modifié à partir de cette réponse .
(Réponse originale)
reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)
Ainsi, par exemple, pour calculer la somme d'un tableau, vous devez passer un initialValueof 0et renvoyer un aggregateégal à accumulator + currentValue. En modifiant légèrement cette approche, nous calculons plutôt le nombre de permutations satisfaisant le test de primalité:
reduce(
(passedSoFar, currentDecimal, currentIndex, digitArray) =>
isValidPermutation() ?
passedSoFar + prime(getPermutation()) :
passedSoFar
, 0
)
C’est essentiellement l’intérieur reduce(), qui répète toutes les permutations du digitArrayen changeant chacune decimalen un spécifique permutatedDigit. Nous avons ensuite besoin d’un extérieur reduce()pour itérer tous les possibles permutatedDigitavec lesquels remplacer chacun decimal, ce qui est juste 0-9.
Anomalies dans la mise en œuvre
[...''+1e9].map((u,j)=>...était le chemin le plus court @Neil pourrait penser à itérer un argument 0par 9. Dans ce cas, il serait préférable de le faire avec u, mais cela un’est pas utile pour chaque élément du tableau.
i+jdans la condition ternaire vérifie qu'il 0n'y a pas de permutation possible du premier chiffre, conformément à la spécification de défi. j!=cgarantit que l'original nn'est pas candidat pour passer le test de primalité.
(a.splice(i,1,j),a.join``) C'est un peu le bordel. splice()remplace le chiffre at decimal == ipar le permutatedDigit == j, mais puisque splice()renvoie les éléments supprimés (dans ce cas, serait égal à [a[i]]) au lieu du tableau modifié, nous devons utiliser l'opérateur virgule pour transmettre le tableau modifié aau test de primalité, mais pas avant join(). dans une chaîne numérique.
Enfin, le eval() s'agit de sauvegarder un octet puisque, comparé à l'approche plus canonique, il est plus court:
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
La référence au premier test p est initialisée dans un argument inutilisé de l' map()appel.
npour lequel la sortie est0. Je pense que c'estn = 200. Je pense aussi qu'ils viennent en grappes:200,202,204,206,208,320,322,...,328,510,...,518,620,...628,840,...,848, etc.