JavaScript (ES6), 153 142 139 bajtów
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)
Akceptuje dane wejściowe jako ciąg. Niezdefiniowane zachowanie dla niepoprawnych danych wejściowych, chociaż powinno zakończyć się bezbłędnie na dowolnym łańcuchu, jaki mogę wymyślić. Jednak niekoniecznie przed śmiercią we wszechświecie, szczególnie w przypadku długich łańcuchów.
Próbny
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>
Ulepszenia
Zaoszczędzono 11 bajtów, refaktoryzując reduce()wywołania na map()wywołania i niejawnie kopiując tablicę aw parametrze funkcji, zamiast w kontekście splice()wywołania.
Zapisany 3 bajty dzięki @Neil sugestia „s przekonwertować [...Array(10)]do [...''+1e9].
Kod nieuprawniony
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
)
Wyjaśnienie
Funkcja używa dwupoziomowego map()do zsumowania liczby permutacji, które przejdą test pierwotności, który został pożyczony i zmodyfikowany na podstawie tej odpowiedzi .
(Oryginalna odpowiedź)
reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)
Tak na przykład, aby obliczyć sumę tablicy, należy zdać initialValuez 0, i zwróci aggregaterówna accumulator + currentValue. Nieznacznie modyfikując to podejście, zamiast tego obliczamy liczbę permutacji, które przejdą test pierwotności:
reduce(
(passedSoFar, currentDecimal, currentIndex, digitArray) =>
isValidPermutation() ?
passedSoFar + prime(getPermutation()) :
passedSoFar
, 0
)
Jest to zasadniczo wewnętrzna reduce(), która iteruje wszystkie permutacje digitArray, zmieniając każdą decimalz nich na określoną permutatedDigit. Następnie potrzebujemy zewnętrznego, reduce()aby iterować wszystkie możliwe elementy permutatedDigit, które można zastąpić decimal, co jest słuszne 0-9.
Nieprawidłowości we wdrażaniu
[...''+1e9].map((u,j)=>...była najkrótsza droga @Neil mógł wymyślić iteracyjne argument 0za 9. Byłoby to wskazane u, ale uw tym przypadku nie jest przydatne dla każdego elementu w tablicy.
i+jw warunkach trójskładnikowych sprawdza, 0czy nie jest możliwa permutacja cyfry wiodącej, zgodnie ze specyfikacją wyzwania. j!=czapewnia, że oryginał nnie jest kandydatem do przejścia testu pierwotności.
(a.splice(i,1,j),a.join``)jest trochę bałaganu. splice()zamienia cyfrę at decimal == ina permutatedDigit == j, ale ponieważ splice()zwraca usunięte elementy (w tym przypadku byłyby równe [a[i]]) zamiast zmodyfikowanej tablicy, musimy użyć operatora przecinka, aby przekazać zmodyfikowaną tablicę ado testu pierwotności, ale nie przed join()jej wprowadzeniem na ciąg liczbowy.
Na koniec eval()należy zapisać bajt, ponieważ w porównaniu z podejściem bardziej kanonicznym jest krótszy:
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
Odwołanie do testu podstawowego pjest inicjowane nieużywanym argumentem map()wywołania.
ndla których jest wyjście0. Tak mi się wydajen = 200. Myślę, że również one są w pęczkach:200,202,204,206,208,320,322,...,328,510,...,518,620,...628,840,...,848, itd.