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ę a
w 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ć initialValue
z 0
, i zwróci aggregate
ró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ą decimal
z 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 0
za 9
. Byłoby to wskazane u
, ale u
w tym przypadku nie jest przydatne dla każdego elementu w tablicy.
i+j
w warunkach trójskładnikowych sprawdza, 0
czy nie jest możliwa permutacja cyfry wiodącej, zgodnie ze specyfikacją wyzwania. j!=c
zapewnia, że oryginał n
nie jest kandydatem do przejścia testu pierwotności.
(a.splice(i,1,j),a.join``)
jest trochę bałaganu. splice()
zamienia cyfrę at decimal == i
na 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ę a
do 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 p
jest inicjowane nieużywanym argumentem map()
wywołania.
n
dla 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.