บางครั้งเมื่อเขียนโปรแกรมคุณต้องใช้จำนวนเฉพาะด้วยเหตุผลบางอย่างหรืออื่น ๆ (เช่นการเข้ารหัส) ฉันคิดว่าบางครั้งคุณต้องใช้หมายเลขคอมโพสิตด้วย บางครั้งอย่างน้อยที่นี่ใน PPCG โปรแกรมของคุณจะต้องสามารถจัดการกับการเปลี่ยนแปลงโดยพลการ และในสถานการณ์ที่วางแผนจะสร้างคำถาม PPCG ที่น่าสนใจอย่างสะดวกสบายบางทีแม้แต่ตัวเลขที่คุณใช้ก็ต้องทนต่อการทุจริต ...
คำนิยาม
จำนวนคอมโพสิตเป็นจำนวนเต็ม≥ 4 ที่ไม่ได้เป็นนายกคือมันเป็นผลิตภัณฑ์ของจำนวนเต็มสองจำนวนที่มีขนาดเล็กมากกว่า 1 ต่อ A bitflip ทนจำนวนคอมโพสิตถูกกำหนดให้เป็นดังนี้ก็เป็นจำนวนเต็มบวกคอมโพสิตซึ่งถ้าคุณเขียนมัน ในเลขฐานสองในจำนวนบิตที่น้อยที่สุดที่เป็นไปได้คุณสามารถเปลี่ยนหนึ่งหรือสองบิตจากจำนวนและจำนวนยังคงประกอบ
ตัวอย่าง
ตัวอย่างเช่นพิจารณาจำนวน 84 1010100
ในไบนารีว่า นี่คือตัวเลขทั้งหมดที่ต่างกันไม่เกิน 2 บิตจาก:
0000100 4 2 × 2 0010000 16 4 × 4 0010100 20 4 × 5 0010101 21 3 × 7 0010110 22 2 × 11 0011100 28 4 × 7 0110100 52 4 × 13 1000000 64 8 × 8 1000100 68 4 × 17 1000101 69 3 × 23 1000110 70 7 × 10 1001100 76 4 × 19 1010000 80 8 × 10 1010001 81 9 × 9 1010010 82 2 × 41 1010100 84 7 × 12 1010101 85 5 × 17 1010110 86 2 × 43 1010111 87 3 × 29 1011000 88 8 × 11 1011100 92 4 × 23 1011101 93 3 × 31 1011110 94 2 × 47 1100100 100 10 × 10 1110000 112 8 × 14 1110100 116 4 × 29 1110101 117 9 × 13 1110110 118 2 × 59 1111100 124 4 × 31
คอลัมน์แรกคือตัวเลขในไบนารี คอลัมน์ที่สองคือตัวเลขเป็นทศนิยม ตามที่ระบุในคอลัมน์ที่สามตัวเลขทั้งหมดเหล่านี้ประกอบกัน ด้วยเหตุนี้ 84 จึงเป็นเลขคอมโพสิตที่ทนต่อการพลิกผัน
งาน
คุณต้องเขียนหนึ่งในสามโปรแกรมต่อไปนี้หรือฟังก์ชั่นใดก็ตามที่เหมาะสมกับภาษาของคุณมากที่สุด:
- โปรแกรมหรือฟังก์ชั่นที่ใช้เวลาติดลบnเป็น input และผลแรกnตัวเลขประกอบ bitflip ทน
- โปรแกรมหรือฟังก์ชั่นที่รับจำนวนเต็มn ที่ไม่ต้องการลบเป็นอินพุตและส่งออกหมายเลขคอมโพสิตที่ทนต่อการ Bitflip น้อยกว่าn (หรือหากคุณต้องการน้อยกว่าหรือเท่ากับnนั่นคือคุณสามารถเลือกได้ว่าจะรวมnในเอาต์พุตหรือไม่ ทน)
- โปรแกรมหรือฟังก์ชั่นที่ไม่มีอินพุตและเอาต์พุตหมายเลขคอมโพสิตที่ทนต่อการบิตไฟล์ทั้งหมด (สิ่งนี้จะต้องใช้กลไกเอาต์พุตที่สามารถสร้างเอาต์พุตในขณะที่โปรแกรมยังคงทำงานอยู่เช่นการพิมพ์ไปยัง stdout, รายการสันหลังยาวหรือเครื่องกำเนิดไฟฟ้าคุณไม่สามารถคำนวณรายการทั้งหมดแล้วพิมพ์ได้)
กรณีทดสอบ
นี่คือตัวเลขคอมโพสิตที่ทนต่อการบิตไฟล์แรก ๆ :
84, 184, 246, 252, 324, 342, 424, 468, 588, 636, 664, 670, 712, 730, 934, 958
ชี้แจง
- มันเป็นเพียงตัวเลขที่คุณสร้างขึ้นซึ่งจะต้องทนต่อ bitflips นี่ไม่ใช่งานเกี่ยวกับการทำให้โปรแกรมที่พวกเขาทนต่อ bitflips; ใช้ตัวเลขใด ๆ ในโปรแกรมที่คุณชอบ
- ตัวเลขที่คุณส่งออกไม่จำเป็นต้องทนต่อการเป็นบิตใน "เลขศูนย์นำหน้า" ลองนึกภาพว่าตัวเลขจะถูกเก็บไว้ในจำนวนบิตที่น้อยที่สุดเท่าที่จะเป็นไปได้และบิตเหล่านั้นเท่านั้นที่จะต้องมีภูมิคุ้มกันต่อการพลิก อย่างไรก็ตาม 1 บิตแรกเริ่มของตัวเลขที่คุณส่งออกจะต้องมีภูมิคุ้มกันต่อ bitflips
- ใช้อัลกอริทึมที่คุณชอบซึ่งให้ผลลัพธ์ที่ถูกต้อง คุณไม่ได้ทำเครื่องหมายประสิทธิภาพที่นี่
- หากคุณสามารถพิสูจน์ได้ว่ามีจำนวนคอมโพสิตที่ทนต่อ bitflip จำนวน จำกัด ดังนั้น a) ข้อ จำกัด ในรูปแบบเอาต์พุตถูกยกขึ้นและ b) การเข้ารหัส hardcoding รายการจะได้รับอนุญาต (แม้ว่าอาจจะ verbose มากกว่าการคำนวณ กฎนี้ส่วนใหญ่เป็นเพียงเพื่อความสมบูรณ์ ฉันไม่คาดหวังว่ามันจะเกี่ยวข้อง
เงื่อนไขชัยชนะ
นี่คือรหัสกอล์ฟดังนั้นตามปกติจะสั้นกว่าดีกว่า เช่นเคยความยาวของโปรแกรมจะถูกวัดเป็นไบต์
n
ถ้าn
ทนต่อการทนบิต (เช่นทำให้มัน "น้อยกว่าหรือเท่ากับ n"?)