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 a
dalam 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 initialValue
dari 0
, dan mengembalikan aggregate
sama 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 digitArray
dengan mengubah masing decimal
- masing ke spesifik permutatedDigit
. Kita kemudian membutuhkan bagian luar reduce()
untuk mengulangi semua kemungkinan permutatedDigit
untuk mengganti masing-masing decimal
, yang adil 0-9
.
Kelainan dalam implementasi
[...''+1e9].map((u,j)=>...
adalah cara terpendek @Neil bisa memikirkan untuk mengulangi argumen 0
melalui 9
. Akan lebih baik untuk melakukannya dengan u
, tetapi u
tidak berguna untuk setiap elemen dalam array, dalam hal ini.
i+j
dalam kondisi terner memeriksa untuk memastikan bahwa 0
tidak ada permutasi yang mungkin dari digit terdepan, sesuai spesifikasi tantangan. j!=c
memastikan bahwa dokumen asli n
bukan kandidat untuk menjalani tes primality.
(a.splice(i,1,j),a.join``)
agak berantakan. splice()
mengganti digit pada decimal == i
dengan 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 a
ke 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 p
diinisialisasi dalam argumen yang tidak digunakan untuk map()
panggilan.
n
untuk 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