जावास्क्रिप्ट (ईएस 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+j
0
चुनौती की स्थिति के अनुसार, यह सुनिश्चित करने के लिए कि वर्तमान अंक का एक संभावित क्रमपरिवर्तन नहीं है, यह सुनिश्चित करने के लिए टर्नरी स्थिति की जाँच करता है। 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
, आदि