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
ฉันคิดว่ามัน0
n = 200
ผมยังคิดว่าพวกเขามาในที่อัดแน่น:200,202,204,206,208
,320,322,...,328
,510,...,518
,620,...628
,840,...,848
ฯลฯ