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ı .asplice()
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 initialValueait 0ve bir dönüş aggregateeş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 .digitArraydecimalpermutatedDigitreduce()permutatedDigitdecimal0-9
Uygulamadaki anormallikler
[...''+1e9].map((u,j)=>...En kısa yoluydu @Neil bir argüman yineleme için düşünebildiğim 0yoluyla 9. Bu durumda bunu yapmak tercih edilir u, ancak ubu 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!=csağlar n.
(a.splice(i,1,j),a.join``)biraz karışıklık. splice()basamağını yerine decimal == isahip permutatedDigit == jolabilirler, 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, pkullanı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