พื้นหลัง
ปัญหาสิบสองเหรียญเป็นปริศนาสมดุลแบบคลาสสิคที่ใช้กันทั่วไปในการสัมภาษณ์งาน ปริศนาปรากฏตัวครั้งแรกในปีพ. ศ. 2488 และปู่ของฉันถูกพ่อของฉันวางไว้เมื่อเขาขอแต่งงานกับแม่ของฉัน! ในจิ๊กซอว์มีสิบสองเหรียญซึ่งหนึ่งในนั้นคือหนักหรือเบากว่าคนอื่น ๆ (คุณไม่ทราบว่า) ปัญหาคือการใช้เครื่องชั่งสมดุลสามครั้งเพื่อตรวจสอบเหรียญที่ไม่ซ้ำกัน ในบางรูปแบบจำเป็นต้องระบุว่าเหรียญนั้นหนักหรือเบา
งานที่นี่เกี่ยวข้องกับการแก้ปัญหาทั่วไปที่เกี่ยวข้องกับเหรียญnโดยใช้การชั่งน้ำหนักน้อยที่สุดในกรณีที่เลวร้ายที่สุด ไม่จำเป็นต้องระบุว่าเหรียญนั้นหนักหรือเบาเพียงแค่เหรียญเดียวเท่านั้น นอกจากนี้คุณไม่สามารถเข้าถึงเหรียญเพิ่มเติมใด ๆ ที่อยู่นอกชุดที่กำหนด (ซึ่งอยากรู้อยากเห็นสร้างความแตกต่าง)
ปรากฎว่าการชั่งน้ำหนัก k เพียงพอสำหรับเหรียญมากถึง (3 ^ k-1) / 2 (ดังนั้นการชั่งน้ำหนัก 4 แบบในรูปแบบนี้สามารถจัดการได้ 13 เหรียญ) ยิ่งไปกว่านั้น (และน่าประหลาดใจ) มันเป็นไปได้ (แต่ไม่จำเป็นที่นี่) เพื่อเลือกชุดการชั่งน้ำหนักล่วงหน้าล่วงหน้าแทนที่จะมีการชั่งน้ำหนักในอนาคตขึ้นอยู่กับผลลัพธ์ที่ผ่านมา สำหรับคำอธิบายของวิธีแก้ปัญหาสองวิธีที่เป็นไปได้ดูที่เอกสารนี้และคำตอบของ Quoraนี้
งาน
เขียนฟังก์ชั่นหรือโปรแกรมโดยใช้จำนวนเต็มnเป็นอินพุตผ่าน STDIN อาร์กิวเมนต์บรรทัดคำสั่งหรืออาร์กิวเมนต์ฟังก์ชันซึ่งแก้ปัญหาสำหรับเหรียญnโดยใช้การชั่งน้ำหนักน้อยที่สุดในกรณีที่เลวร้ายที่สุด โปรแกรมควร:
- พิมพ์การชั่งน้ำหนักไปที่ STDOUT ในรูปแบบ
1,2,3-4,5,6
เพื่อระบุรายการเหรียญในแต่ละด้านของเครื่องชั่ง ไม่ควรพูดถึงเหรียญที่ไม่ได้ชั่งน้ำหนัก เหรียญจะถูกกำหนดหมายเลขโดยนัยจาก 1 ถึงnและไม่จำเป็นต้องพิมพ์ตามลำดับตัวเลข (เช่น2,1-3,4
เดียวกับ1,2-3,4
) - หลังจากที่แต่ละชั่งน้ำหนักโปรแกรมควรรอการป้อนข้อมูลผ่านทาง STDIN ซึ่งควรจะ
<
,=
หรือ>
แสดงให้เห็นว่าด้านซ้ายของเครื่องชั่งมีน้ำหนักเบาเดียวกันหรือหนักกว่าด้านขวา - หลังจากผลการชั่งน้ำหนักครั้งล่าสุดโปรแกรมควรพิมพ์หรือส่งคืนจำนวนเหรียญที่ไม่ซ้ำกัน
- โปรแกรมไม่จำเป็นต้องจัดการอินพุตผลลัพธ์ที่ไม่สอดคล้องกันจากผู้ใช้
- โปรแกรมที่ไม่จำเป็นต้องจัดการกับnน้อยกว่า 3
ตัวอย่างผลลัพธ์
>> 3
1-2
>> =
1-3
>> <
3
# using Quora algorithm
>> 13
1,2,3,4-5,6,7,8
>> <
1,2,5-3,4,6
>> >
3-4
>> <
3
# using paper algorithm
>> 13
1,2,3,4-5,6,7,8
>> <
2,6,7,9-3,8,10,11
>> >
6,8,10,12-4,5,7,11
>> =
3
เกณฑ์การให้คะแนน
รหัสที่สั้นที่สุดชนะ ใช้กฎมาตรฐาน