JavaScript (ES6), 153 142 139 bayt
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)
Girdiyi dizge olarak kabul eder. Geçersiz girdi için tanımsız davranış, ancak aklıma gelen herhangi bir dizgide hatasız sonlanması gerekiyor. Yine de, evrenin sıcağı ölümünden önce, özellikle de uzun ipler için.
gösteri
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>
İyileştirmeler
reduce()
Çağrıları çağrılara yeniden aktararak ve çağrının kapsamı içinde işlev parametresindeki map()
diziyi dolaylı olarak kopyalayarak 11 bayt kurtardı .a
splice()
Kaydedilen 3 sayesinde bayt @Neil dönüştürmek için 'ın önerisi [...Array(10)]
için [...''+1e9]
.
Unifified kod
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
)
açıklama
İşlev map()
, bu cevaptan ödünç alınan ve değiştirilen ilkellik testini geçen permütasyon miktarını toplamak için iki seviyeli bir kullanım kullanır .
(Orijinal cevap)
reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)
Yani, örneğin, bir dizinin toplamını hesaplamak için, bir geçeceğini initialValue
ait 0
ve bir dönüş aggregate
eşit accumulator + currentValue
. Bu yaklaşımı biraz değiştirerek, bunun yerine, birincillik testini geçen permütasyon sayısını hesaplıyoruz:
reduce(
(passedSoFar, currentDecimal, currentIndex, digitArray) =>
isValidPermutation() ?
passedSoFar + prime(getPermutation()) :
passedSoFar
, 0
)
Bu esasen, her birinin belirli bir değerini değiştirerek reduce()
tüm permütasyonlarını yineleyen içseldir . Öyleyse , her birinin yerine geçebilecek olan tüm olası şeyleri yinelemek için bir dışa ihtiyacımız var .digitArray
decimal
permutatedDigit
reduce()
permutatedDigit
decimal
0-9
Uygulamadaki anormallikler
[...''+1e9].map((u,j)=>...
En kısa yoluydu @Neil bir argüman yineleme için düşünebildiğim 0
yoluyla 9
. Bu durumda bunu yapmak tercih edilir u
, ancak u
bu durumda dizideki her eleman için kullanışlı değildir.
i+j
Üçlü durumda 0
, meydan okuma şartnamesine göre, lider hanenin olası bir permütasyonu olmadığından emin olmak için kontrol eder . Asıllığın ilkellik sınavından geçecek bir aday olmamasını j!=c
sağlar n
.
(a.splice(i,1,j),a.join``)
biraz karışıklık. splice()
basamağını yerine decimal == i
sahip permutatedDigit == j
olabilirler, ama splice()
getiri kaldırılan elemanları (bu durumda, eşit olacaktır [a[i]]
yerine modifiye edilmiş dizi), biz değiştirilmiş dizisi geçirmek için virgül operatörünü kullanmalıdır a
önce asallık testine, ancak join()
bunu ing bir sayı dizisine.
Son olarak, eval()
kanonik yaklaşımla karşılaştırıldığında daha kısa olduğu için bir bayt tasarruf etmektir.
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
Asal teste yapılan referans, p
kullanılmayan bir argüman olarak map()
çağrıda başlatılır .
n
Çıktının en küçük olduğunu düşünmeye çalışıyorum0
. Bence öylen = 200
. Ben de onlar demet gelip düşünüyorum:200,202,204,206,208
,320,322,...,328
,510,...,518
,620,...628
,840,...,848
, vb