หากคุณได้อ่านหนังสือติดต่อโดยคาร์ลเซแกนความท้าทายนี้อาจดูคุ้นเคยสำหรับคุณ
รับอินพุตของชุดของสมการทางคณิตศาสตร์ที่ประกอบด้วยตัวเลขตัวดำเนินการที่ไม่รู้จักหมายเลขอื่นและผลลัพธ์โดยอนุมานว่าตัวดำเนินการใดเป็นตัวแทนของการบวกการลบการคูณหรือการหาร
สมการอินพุตแต่ละรายการจะประกอบด้วย
- จำนวนเต็มที่ไม่เป็นลบ
- อย่างใดอย่างหนึ่งของตัวอักษร
A,B,CหรือD - จำนวนเต็มอื่นที่ไม่ใช่ลบ
- บทบาท
= - จำนวนเต็มที่ไม่ใช่ลบขั้นสุดท้าย
ตัดแบ่งกัน ตัวอย่างเช่นอินพุตที่เป็นไปได้คือ1A2=3ซึ่งคุณสามารถอนุมานได้ว่าAเป็นสิ่งที่เพิ่มเข้ามา 0 ≤ x ≤ 1,000แต่ละจำนวนเต็มจะตอบสนอง
อย่างไรก็ตามมันไม่ง่ายอย่างที่คิด เป็นไปได้ที่จะมีความกำกวมระหว่าง:
5A0=5: การเพิ่ม / การลบ1A1=1: การคูณ / การหาร0A5=0: การคูณ / การหาร2A2=4: การเพิ่ม / การคูณ4A2=2: การลบ / การหาร0A0=0: การเพิ่ม / การลบ / การคูณ
และอื่น ๆ ความท้าทายคือการใช้ความสามารถนี้เพื่อ จำกัด ทางเลือกรวมกับกระบวนการกำจัดเพื่อพิจารณาว่าตัวอักษรแต่ละตัวหมายถึงตัวดำเนินการใด (จะมีอย่างน้อยหนึ่งสมการอินพุตและจะเป็นไปได้เสมอที่จะจับคู่ตัวอักษรแต่ละตัวที่ใช้ในอินพุตกับตัวดำเนินการเดียวอย่างไม่ซ้ำกันและไม่ซ้ำกัน)
ตัวอย่างเช่นสมมติว่าอินพุตเป็นสมการต่อไปนี้:
0A0=0: นี่จะแคบลงเพื่อบวกการลบหรือการคูณ (ไม่สามารถหารด้วย 0)10B0=10: B ต้องเป็นการบวกหรือลบ5C5=10: C เป็นการเพิ่มที่เห็นได้ชัดซึ่งทำให้การลบ B ซึ่งทำให้การคูณ A
ดังนั้นการส่งออกสำหรับสมการป้อนข้อมูลเหล่านี้ควรจะตรงAกับ*, B
ด้วย-และมีC+
อินพุตอาจถูกกำหนดเป็นสตริง whitespace- / comma-delimited เดี่ยวหรืออาเรย์ของสตริงแต่ละอันแทนสมการหนึ่ง เอาต์พุตอาจเป็นสตริงเดี่ยว ( "A*B-C+"), อาเรย์ ( ["A*", "B-", "C+"]) หรืออาเรย์สองมิติ / พจนานุกรม / dict-like ( {"A": "*", ...}หรือ[["A", "*"], ...])
คุณอาจคิดว่าตัวเลขจะไม่ถูกหารด้วยจำนวนอื่นที่ไม่หารด้วย (ดังนั้นคุณไม่ต้องกังวลว่าการหารควรเป็นทศนิยมหรือตัดปลาย)
เนื่องจากนี่คือcode-golfรหัสที่สั้นที่สุดเป็นไบต์จะเป็นผู้ชนะ
กรณีทดสอบ:
In Out
-------------------------------
0A0=0 10B0=10 5C5=10 A*B-C+
100D100=10000 D*
4A2=2 4B2=2 0A0=0 A-B/
15A0=15 4B2=2 2C2=0 A+B/C-
1A1=1 0A0=0 A*
0A0=0 2A2=4 5B0=5 2B2=4 A*B+
2A2=4 0C0=0 5B0=5 5A0=5 A+B-C*
0A1000=0 4A2=2 A/