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)
Menerima input sebagai string. Perilaku tidak terdefinisi untuk input tidak valid, meskipun harus diakhiri tanpa kesalahan pada string apa pun yang dapat saya pikirkan. Belum tentu sebelum kematian-panas alam semesta, terutama untuk string panjang.
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>
Perbaikan
Disimpan 11 byte dengan refactoring reduce()panggilan menjadi map()panggilan, dan dengan secara implisit menyalin array adalam parameter fungsi, bukan di dalam konteks splice()panggilan.
Disimpan 3 byte berkat saran @Neil untuk dikonversi [...Array(10)]ke [...''+1e9].
Kode tidak ditambang
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
)
Penjelasan
Fungsi ini menggunakan dua tingkat map()untuk menjumlahkan jumlah permutasi yang lulus tes primality, yang dipinjam dan dimodifikasi dari jawaban ini .
(Jawaban asli)
reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)
Jadi misalnya, untuk menghitung jumlah suatu array, Anda akan melewatkan initialValuedari 0, dan mengembalikan aggregatesama dengan accumulator + currentValue. Dengan sedikit memodifikasi pendekatan ini, kami menghitung jumlah permutasi yang lulus tes primality:
reduce(
(passedSoFar, currentDecimal, currentIndex, digitArray) =>
isValidPermutation() ?
passedSoFar + prime(getPermutation()) :
passedSoFar
, 0
)
Itu pada dasarnya adalah bagian dalam reduce(), yang mengulangi semua permutasi dari digitArraydengan mengubah masing decimal- masing ke spesifik permutatedDigit. Kita kemudian membutuhkan bagian luar reduce()untuk mengulangi semua kemungkinan permutatedDigituntuk mengganti masing-masing decimal, yang adil 0-9.
Kelainan dalam implementasi
[...''+1e9].map((u,j)=>...adalah cara terpendek @Neil bisa memikirkan untuk mengulangi argumen 0melalui 9. Akan lebih baik untuk melakukannya dengan u, tetapi utidak berguna untuk setiap elemen dalam array, dalam hal ini.
i+jdalam kondisi terner memeriksa untuk memastikan bahwa 0tidak ada permutasi yang mungkin dari digit terdepan, sesuai spesifikasi tantangan. j!=cmemastikan bahwa dokumen asli nbukan kandidat untuk menjalani tes primality.
(a.splice(i,1,j),a.join``)agak berantakan. splice()mengganti digit pada decimal == idengan permutatedDigit == j, tetapi karena splice()mengembalikan elemen yang dihapus (dalam hal ini, akan sama dengan [a[i]]) alih-alih array yang dimodifikasi, kita harus menggunakan operator koma untuk meneruskan array yang dimodifikasi ake tes primality, tetapi tidak sebelum join()memasukkannya menjadi string angka.
Terakhir, eval()adalah untuk menyimpan byte karena, dibandingkan dengan pendekatan yang lebih kanonik, lebih pendek:
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
Referensi ke tes utama pdiinisialisasi dalam argumen yang tidak digunakan untuk map()panggilan.
nuntuk outputnya0. Saya pikir itun = 200. Saya juga berpikir mereka datang dalam tandan:200,202,204,206,208,320,322,...,328,510,...,518,620,...628,840,...,848, dll