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 a
in 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 initialValue
von 0
und geben ein aggregate
Gleich 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, digitArray
indem jedes decimal
auf 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 0
durch 9
. In diesem Fall ist dies vorzuziehen u
, jedoch u
nicht für jedes Element im Array sinnvoll.
i+j
In der ternären Bedingung wird überprüft, ob 0
es sich um eine mögliche Permutation der führenden Ziffer gemäß der Challenge-Spezifikation handelt. j!=c
stellt sicher, dass das Original n
kein Kandidat für den Primalitätstest ist.
(a.splice(i,1,j),a.join``)
ist eine Art Durcheinander. splice()
Ersetzt die Ziffer decimal == i
mit 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 a
an 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 p
wird in einem nicht verwendeten Argument zum map()
Aufruf initialisiert .
n
fü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,...,848
etc.