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)
Akzeptiert Eingaben als Zeichenfolge. Undefiniertes Verhalten bei ungültigen Eingaben, obwohl es bei jeder erdenklichen Zeichenfolge fehlerfrei enden sollte. Nicht unbedingt vor dem Hitzetod des Universums, besonders für lange Saiten.
Demo
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>
Verbesserungen
Sie haben 11 Byte eingespart, indem Sie die reduce()Aufrufe in map()Aufrufe umgestaltet und das Array implizit ain den Funktionsparameter anstatt in den Kontext des splice()Aufrufs kopiert haben .
Gespeichert 3 Bytes dank @Neil ‚s Vorschlag zu konvertieren [...Array(10)]zu [...''+1e9].
Unbegrenzter Code
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
)
Erläuterung
Die Funktion verwendet eine zweistufige map()Summe der Permutationen, die den Primalitätstest bestehen, der aus dieser Antwort ausgeliehen und geändert wurde .
(Originalantwort)
reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)
Um zum Beispiel die Summe eines Arrays zu berechnen, übergeben Sie ein initialValuevon 0und geben ein aggregateGleich zurück accumulator + currentValue. Wenn Sie diesen Ansatz leicht modifizieren, berechnen wir stattdessen die Anzahl der Permutationen, die den Primalitätstest bestehen:
reduce(
(passedSoFar, currentDecimal, currentIndex, digitArray) =>
isValidPermutation() ?
passedSoFar + prime(getPermutation()) :
passedSoFar
, 0
)
Das ist im Wesentlichen das Innere reduce(), das alle Permutationen des durchläuft, digitArrayindem jedes decimalauf ein bestimmtes geändert wird permutatedDigit. Wir brauchen dann ein Äußeres reduce(), um alle möglichen zu iterieren permutatedDigit, um jedes zu ersetzen decimal, was gerecht ist 0-9.
Unregelmäßigkeiten bei der Durchführung
[...''+1e9].map((u,j)=>...war der kürzeste Weg @Neil von iterieren ein Argument denken konnte 0durch 9. In diesem Fall ist dies vorzuziehen u, jedoch unicht für jedes Element im Array sinnvoll.
i+jIn der ternären Bedingung wird überprüft, ob 0es sich um eine mögliche Permutation der führenden Ziffer gemäß der Challenge-Spezifikation handelt. j!=cstellt sicher, dass das Original nkein Kandidat für den Primalitätstest ist.
(a.splice(i,1,j),a.join``)ist eine Art Durcheinander. splice()Ersetzt die Ziffer decimal == imit dem permutatedDigit == j, aber da splice()die entfernten Elemente (in diesem Fall wäre das gleich [a[i]]) anstelle des geänderten Arrays zurückgegeben werden, müssen wir den Kommaoperator verwenden, um das geänderte Array aan den Primitätstest zu übergeben, jedoch nicht bevor wir join()es übergeben in eine Zahlenfolge.
Schließlich soll eval()ein Byte gespeichert werden, da es im Vergleich zum kanonischeren Ansatz kürzer ist:
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
Der Verweis auf den Primetest pwird in einem nicht verwendeten Argument zum map()Aufruf initialisiert .
nfür das die Ausgabe ist0. Ich denke es istn = 200. Ich denke auch , sie kommen in Trauben:200,202,204,206,208,320,322,...,328,510,...,518,620,...628,840,...,848etc.