อัลกอริทึมแบบยุคลิดเป็นอัลกอริทึมที่รู้จักกันอย่างกว้างขวางสำหรับการคำนวณตัวหารสามัญที่ยิ่งใหญ่ที่สุด (GCD) ของจำนวนเต็มบวกสองตัว
อัลกอริทึม
สำหรับจุดประสงค์ของการท้าทายนี้มีการอธิบายอัลกอริทึมดังต่อไปนี้:
แสดงอินพุตสองตัวเป็นบรรทัดที่อยู่ติดกันของอักขระบางตัว
เช่นอินพุตของ3,4
สามารถแสดงด้วยบรรทัดที่อยู่ติดกัน000
และ0000
เปลี่ยน
length(short_line)
อักขระตัวแรกในบรรทัดที่ยาวขึ้นไปเป็นอีกตัวหนึ่งแล้วพูดว่า-
มันดูเหมือน000
และ---0
กำจัด
length(short_line)
อักขระตัวแรกในบรรทัดที่ยาวขึ้น
ตอนนี้000
,0
ทำซ้ำขั้นตอนที่ 2 และ 3 จนกระทั่งทั้งสองมีความยาวเท่ากันโดยใช้สายสั้นและยาวหลังจากที่แต่ละซ้ำเช่น
000
,0
-00
,0
00
,0
-0
,0
0
,0
- คุณสามารถเลือกว่าจะหยุดที่นี่หรือทำซ้ำต่อและเปลี่ยนหนึ่งบรรทัดเป็นบรรทัดว่าง
แต่ละขั้นตอนเหล่านี้ควรคั่นด้วยช่วงเวลาระหว่าง 0.3s ถึง 1.5s
ความท้าทาย
เขียนโปรแกรมที่ให้ตัวเลขธรรมชาติสองตัวเป็นอินพุตสร้างเอาต์พุตที่มีลักษณะเหมือนกับเอาต์พุตของอัลกอริทึมด้านบน คุณสามารถใช้อักขระ ASCII ที่ไม่ใช่แบบไวท์สเปซอื่นที่พิมพ์ได้0
และและ-
ให้สอดคล้องกันและใช้อักขระเพียงสองตัว นอกจากนี้คุณยังสามารถใช้อัลกอริธึมทางเลือกที่ให้ผลลัพธ์รวมถึงเวลาได้เช่นเดียวกับที่อัลกอริทึมข้างต้นสร้างขึ้น
ตัวอย่าง
นี่คือตัวอย่างของอินพุต24,35
ซึ่งเป็น coprimes ดังนั้น GCD ของพวกเขาคือ 1
นี่คือตัวอย่างของอินพุต16,42
ซึ่งมี GCD 2
กฎระเบียบ
- นี่คือรหัสกอล์ฟดังนั้นไบต์ที่สั้นที่สุดจึงชนะ
- ช่องโหว่มาตรฐานใช้
- คุณสามารถสมมติว่าอินพุตเป็นจำนวนเต็มฐานสิบบวก
ชี้แจง
- บรรทัดที่แสดงตัวเลขต้องอยู่ในลำดับเดิมเช่นบรรทัดแรกและบรรทัดที่สองของ "เฟรม" ที่แสดงครั้งแรกจะต้องเป็นบรรทัดแรกและบรรทัดที่สองตามลำดับในเฟรมที่ตามมาทั้งหมด
- หลังจากอัลกอริทึมสิ้นสุดไม่ควรเห็นเอนทิตีที่มองเห็นได้เพิ่มเติม อย่างไรก็ตามนี่ก็หมายความว่ามันจะไม่เป็นไรที่จะทำให้บรรทัดว่างถ้าคุณตรวจสอบให้แน่ใจว่า "เฟรม" สุดท้ายแสดงเป็นเวลาอย่างน้อยในเวลาเดียวกันกับที่ทำกับเฟรมอื่นทั้งหมดก่อนที่จะทำให้กรอบว่างเปล่า
:-)