जावास्क्रिप्ट (ईएस 6), 153 142 139 बाइट्स
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)
इनपुट को एक स्ट्रिंग के रूप में स्वीकार करता है। अमान्य इनपुट के लिए अपरिभाषित व्यवहार, हालांकि इसे किसी भी स्ट्रिंग पर त्रुटि के बिना समाप्त करना चाहिए, जिसके बारे में मैं सोच सकता हूं। जरूरी नहीं कि ब्रह्मांड की गर्मी-मृत्यु से पहले, विशेष रूप से लंबे तारों के लिए।
डेमो
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>
सुधार
reduce()कॉल में map()कॉल को रीक्रिएट करके aऔर फ़ंक्शन पैरामीटर में सरणी की प्रतिलिपि बनाकर, कॉल के संदर्भ में, इसके बजाय 11 बाइट्स सहेजे गए splice()।
सहेजे जाने के लिए @Neil के सुझाव के लिए 3 बाइट्स सहेजे [...Array(10)]गए [...''+1e9]।
अनारक्षित कोड
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
)
व्याख्या
फ़ंक्शन दो-स्तर का उपयोग करता है जो map()कि प्रायोगिक परीक्षण पास करने वाले क्रमपरिवर्तन की राशि को जोड़ते हैं, जिसे इस उत्तर से उधार लिया गया था और संशोधित किया गया था ।
(मूल उत्तर)
reduce((accumulator, currentValue, currentIndex, array) => aggregate, initialValue)
उदाहरण के लिए, एक सरणी की राशि की गणना करने के लिए, आप एक से होकर गुजरेगा initialValueकी 0है, और एक वापसी aggregateके बराबर accumulator + currentValue। इस दृष्टिकोण को थोड़ा संशोधित करते हुए, हम इसके बजाय क्रमबद्धता परीक्षण पास करने वाले क्रमपरिवर्तन की संख्या की गणना करते हैं:
reduce(
(passedSoFar, currentDecimal, currentIndex, digitArray) =>
isValidPermutation() ?
passedSoFar + prime(getPermutation()) :
passedSoFar
, 0
)
यह मूल रूप से आंतरिक है reduce(), जो digitArrayप्रत्येक decimalको एक विशिष्ट में बदलकर सभी क्रमपरिवर्तन को प्रसारित करता है permutatedDigit। इसके बाद हमें reduce()हर संभव permutatedDigitको बदलने के लिए एक बाहरी की आवश्यकता decimalहोती है, जिसमें से प्रत्येक को बदलना है , जो कि बस है 0-9।
कार्यान्वयन में असामान्यताएं
[...''+1e9].map((u,j)=>...सबसे छोटा तरीका था @Neil एक तर्क के 0माध्यम से पुनरावृति के बारे में सोच सकता था 9। ऐसा करने के लिए बेहतर होगा u, लेकिन uइस मामले में सरणी में प्रत्येक तत्व के लिए उपयोगी नहीं है।
i+j0चुनौती की स्थिति के अनुसार, यह सुनिश्चित करने के लिए कि वर्तमान अंक का एक संभावित क्रमपरिवर्तन नहीं है, यह सुनिश्चित करने के लिए टर्नरी स्थिति की जाँच करता है। j!=cयह सुनिश्चित करता है कि मूल nकोई उम्मीदवार नहीं है जो परीक्षा के माध्यम से जाना है।
(a.splice(i,1,j),a.join``)एक गड़बड़ है। splice()पर अंकों की जगह decimal == iके साथ permutatedDigit == j, लेकिन जब से splice()रिटर्न हटा तत्वों (इस मामले में, के बराबर होगा [a[i]]संशोधित सरणी के बजाय), हम संशोधित सरणी पारित करने के लिए अल्पविराम ऑपरेटर का उपयोग करना चाहिए aइससे पहले कि primality परीक्षण करने के लिए नहीं, बल्कि join()यह ing एक संख्या स्ट्रिंग में।
अंत में, eval()अधिक विहित दृष्टिकोण की तुलना में बाइट को बचाने के लिए, यह छोटा है:
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
प्राइम टेस्ट के संदर्भ को कॉल के pलिए अप्रयुक्त तर्क में आरंभीकृत किया जाता है map()।
nजिसके लिए आउटपुट है0। मुझे लगता हैn = 200। मैं भी लगता है कि वे गुच्छों में आते हैं:200,202,204,206,208,320,322,...,328,510,...,518,620,...628,840,...,848, आदि