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 a
dans 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 initialValue
of 0
et 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 digitArray
en changeant chacune decimal
en un spécifique permutatedDigit
. Nous avons ensuite besoin d’un extérieur reduce()
pour itérer tous les possibles permutatedDigit
avec 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 0
par 9
. Dans ce cas, il serait préférable de le faire avec u
, mais cela u
n’est pas utile pour chaque élément du tableau.
i+j
dans la condition ternaire vérifie qu'il 0
n'y a pas de permutation possible du premier chiffre, conformément à la spécification de défi. j!=c
garantit que l'original n
n'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 == i
par 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é a
au 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.
n
pour 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.