JavaScript (ES6), 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>
ปรับปรุง
บันทึก 11 ไบต์โดยการกำหนดการreduce()เรียกไปยังการmap()โทรอีกครั้งและโดยการคัดลอกอาเรย์aในพารามิเตอร์ฟังก์ชั่นโดยปริยายแทนที่จะเป็นภายในบริบทของการsplice()โทร
บันทึกแล้ว 3 ไบต์ขอบคุณที่@Neilแนะนำให้เปลี่ยน[...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()ซึ่ง iterates พีชคณิตทั้งหมดของ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ไปยังการทดสอบแบบดั้งเดิม แต่ไม่ใช่ก่อนที่จะรับjoin()มัน เป็นสตริงตัวเลข
สุดท้ายeval()คือการบันทึกไบต์ตั้งแต่เมื่อเปรียบเทียบกับวิธีบัญญัติมาตรฐานที่มากขึ้นจะสั้นกว่า:
q=>eval('for(k=q;q%--k;);k==1')
q=>{for(k=q;q%--k;);return k==1}
การอ้างอิงถึงการทดสอบหลักpถูกเตรียมใช้งานในอาร์กิวเมนต์ที่ไม่ได้ใช้กับการmap()โทร
nฉันคิดว่ามัน0n = 200ผมยังคิดว่าพวกเขามาในที่อัดแน่น:200,202,204,206,208,320,322,...,328,510,...,518,620,...628,840,...,848ฯลฯ