ปริศนา
ปริศนาเล็ก ๆ น้อย ๆ ที่ฉันได้ยินตอนเรียนมัธยมก็เป็นแบบนี้ ...
- ผู้ถามจะขอให้ฉันให้เบอร์เขา
- เมื่อได้ยินตัวเลขผู้ถามจะทำการเปลี่ยนแปลงบางอย่างซ้ำ ๆ (เช่นเขาอาจพูดว่าสิบคือสาม ) จนในที่สุดก็มาถึงเลข 4 (เมื่อถึงจุดนั้นเขาจะจบด้วยสี่คือเวทมนตร์ )
- ตัวเลขใด ๆ ที่ดูเหมือนจะเปลี่ยนเป็นเลขสี่ได้ในที่สุดไม่ว่าจะเป็นอะไรก็ตาม
เป้าหมายคือการพยายามหาฟังก์ชั่นการเปลี่ยนแปลงจากนั้นจึงสามารถสร้างปริศนานี้ได้อย่างน่าเชื่อถือด้วยตัวคุณเอง
การแก้ไขปัญหา
ฟังก์ชันการเปลี่ยนแปลงในทุกขั้นตอนคือ
- รับหมายเลขที่มีปัญหา
- นับจำนวนตัวอักษรในการแทนคำภาษาอังกฤษโดยไม่สนใจยัติภังค์หรือช่องว่างหรือ "และ" (เช่น "สิบ" มีตัวอักษร 3 ตัว "สามสิบสี่" มี 10 ตัวอักษร "หนึ่งร้อยสี่สิบสาม" มี 20 ตัวอักษร)
- ส่งกลับจำนวนตัวอักษรนั้น
สำหรับตัวเลขทั้งหมดที่ฉันเคยสนใจที่จะทดสอบสิ่งนี้จะมาบรรจบกันเป็น 4 เนื่องจาก "สี่" มีตัวอักษรสี่ตัวอยู่ด้วยจึงมีการวนซ้ำที่ไม่สิ้นสุดที่นี่ แทนที่จะเรียกว่าเวทมนตร์ตามแบบแผนเพื่อสิ้นสุดลำดับ
ความท้าทาย
ความท้าทายของคุณคือการสร้างโค้ดที่จะอ่านตัวเลขจากผู้ใช้จากนั้นพิมพ์บรรทัดที่แสดงฟังก์ชันการเปลี่ยนแปลงที่ถูกนำไปใช้ซ้ำ ๆ จนกว่า "four is magic" จะถึง
โดยเฉพาะ:
- แนวทางแก้ไขต้องเป็นโปรแกรมที่สมบูรณ์ในตัวเอง ไม่สามารถเป็นเพียงฟังก์ชันที่ใช้ตัวเลข - ปัจจัยในการป้อนข้อมูล
- ต้องอ่านอินพุตจากอินพุตมาตรฐาน (การต่อท่อจาก "echo" หรือการใช้การเปลี่ยนทิศทางอินพุตก็ใช้ได้เพราะมันมาจาก stdin ด้วย)
- ข้อมูลที่ป้อนควรอยู่ในรูปแบบตัวเลข
- สำหรับการประยุกต์ใช้ฟังก์ชันการแปลงทุกครั้งควรพิมพ์บรรทัด:
a is b.
โดยที่ a และ b เป็นรูปแบบตัวเลขของตัวเลขในการแปลง - ต้องหยุดเต็ม (ช่วงเวลา)!
4 is magic.
บรรทัดสุดท้ายเป็นธรรมชาติควรจะพูดว่า- รหัสควรผลิตออกที่ถูกต้องสำหรับจำนวนทั้งหมดจาก0 ที่จะ 99
ตัวอย่าง:
> 4
4 is magic.
> 12
12 is 6.
6 is 3.
3 is 5.
5 is 4.
4 is magic.
> 42
42 is 8.
8 is 5.
5 is 4.
4 is magic.
> 0
0 is 4.
4 is magic.
> 99
99 is 10.
10 is 3.
3 is 5.
5 is 4.
4 is magic.
ผู้ชนะคือการส่งที่สั้นที่สุดโดยการนับอักขระซอร์สโค้ดซึ่งถูกต้องเช่นกัน
โบนัส
คุณอาจลองเขียนโค้ดเวอร์ชันที่พิมพ์ชื่อภาษาอังกฤษสำหรับตัวเลขด้วยแอปพลิเคชันของฟังก์ชันการแปลงแต่ละรายการ อินพุตต้นฉบับยังคงเป็นตัวเลข แต่บรรทัดเอาต์พุตควรมีรูปแบบคำของตัวเลข
(โบนัสสองเท่าสำหรับการวาดรูปทรงด้วยรหัสของคุณ)
(แก้ไข)คำชี้แจงบางประการ:
- ฉันต้องการให้คำนั้นปรากฏทั้งสองด้านในทุกกรณีเช่น
Nine is four. Four is magic.
- ฉันไม่สนใจเรื่องการใช้อักษรตัวพิมพ์ใหญ่ และฉันไม่สนใจว่าคุณจะแยกคำว่าโทเค็นอย่างไรแม้ว่าพวกเขาควรแยกออกจากกัน:
ninety-nine
โอninety nine
เคninetynine
ไม่เป็นไรไม่เป็นไร
ฉันกำลังพิจารณาหมวดหมู่เหล่านี้แยกต่างหากสำหรับการแข่งขันโบนัสโดยคำนึงถึงความท้าทายดังนั้นหากคุณต้องการสิ่งนี้อย่ากังวลว่ารหัสของคุณจะยาวกว่าเวอร์ชันตัวเลข
อย่าลังเลที่จะส่งหนึ่งโซลูชันสำหรับแต่ละเวอร์ชัน