หากคุณได้อ่านหนังสือติดต่อโดยคาร์ลเซแกนความท้าทายนี้อาจดูคุ้นเคยสำหรับคุณ
รับอินพุตของชุดของสมการทางคณิตศาสตร์ที่ประกอบด้วยตัวเลขตัวดำเนินการที่ไม่รู้จักหมายเลขอื่นและผลลัพธ์โดยอนุมานว่าตัวดำเนินการใดเป็นตัวแทนของการบวกการลบการคูณหรือการหาร
สมการอินพุตแต่ละรายการจะประกอบด้วย
- จำนวนเต็มที่ไม่เป็นลบ
- อย่างใดอย่างหนึ่งของตัวอักษร
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/