บทนำ
Forteเป็นภาษาลึกลับที่แปลกประหลาดมากขึ้นอยู่กับแนวคิดของการปรับเปลี่ยนค่าของตัวเลข ในหมายเลข Forte ไม่ใช่ค่าคงที่ แต่เป็นตัวแปรคุณสามารถใช้LET
คำสั่งเพื่อกำหนดค่าใหม่ให้กับพวกเขา
ตัวอย่างเช่นหลังจากการดำเนินการLET 2=4-1
ต่อจากนี้ไป2
จะถือว่าค่าของ3
ซึ่งหมายความว่าเมื่อใดก็ตามที่มีค่า2
ขึ้นมาในการแสดงออกของมันคือแทนที่จะเป็น "แทนที่" 3
โดย การแสดงออกในขณะนี้จะประเมิน(1+1)*2
9
คำแนะนำใน Forte นี้ใช้สำหรับการจัดเก็บข้อมูลและควบคุมการไหล (มีการกำหนดหมายเลขบรรทัดและโดยการเปลี่ยนค่าของตัวเลขคุณสามารถกำหนดลำดับของการดำเนินการได้) ในการท้าทายนี้เราจะไม่จัดการกับประเด็นที่สองนี้
ความท้าทาย
คุณจะต้องเขียนล่ามสำหรับชุดย่อยที่เรียบง่ายของการLET
แสดงออกของ Forte
คุณจะได้รับชุดข้อมูลของบรรทัดตามไวยากรณ์นี้:
<line>::= <number>=<expression>
<expression>::= <number>|<expression>+<number>
หมายเหตุ: ไวยากรณ์นี้ไม่ถูกต้อง Forte เนื่องจากไม่มีหมายเลขบรรทัด LET และวงเล็บ (ซึ่งจำเป็นต้องมีเสมอ)
นั่นคือคุณจะต้องจัดการกับการสรุปผลการคำนวณและการกำหนดค่าให้กับตัวเลขเท่านั้น เครื่องหมายวงเล็บจะไม่ปรากฏในอินพุตและแต่ละนิพจน์จะต้องได้รับการประเมินจากซ้ายไปขวา: ระวังว่าผลลัพธ์บางส่วนได้รับผลกระทบจากการกำหนดใหม่!
ตัวเลขจะเป็นจำนวนเต็มแบบไม่ลบเสมอจนถึงขีด จำกัด ของจำนวนเต็มพื้นฐานของภาษาของคุณ (หรือ 2 ^ 32 แล้วแต่จำนวนใดจะสูงกว่า)
สำหรับแต่ละบรรทัดคุณควรส่งออกผลลัพธ์ของนิพจน์และกำหนดผลลัพธ์นี้ให้กับค่า (อาจกำหนดใหม่) ของหมายเลขแรกซึ่งจะส่งผลต่อวิธีตีความบรรทัดต่อไปนี้
นี่คือโค้ดกอล์ฟซึ่งเป็นรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ!
กฎอื่น ๆ
- รูปแบบการป้อนข้อมูลมีความยืดหยุ่นตัวอย่างเช่นคุณสามารถใช้สายอักขระเดียวกับการขึ้นบรรทัดใหม่รายการสตริงรายการรายการตัวเลข ... เช่นเดียวกันสำหรับผลลัพธ์ตราบใดที่มันชัดเจนว่าผลลัพธ์ของแต่ละนิพจน์เป็นอย่างไร อินพุต
- คุณสามารถส่งทั้งฟังก์ชั่นโปรแกรมเต็มรูปแบบหรือวิธีการแก้ปัญหาที่จะทำงานในสภาพแวดล้อม REPL เรียกมันครั้งเดียวสำหรับแต่ละบรรทัด
- ช่องโหว่มาตรฐานเป็นสิ่งต้องห้ามโดยเฉพาะอย่างยิ่งคุณไม่สามารถเรียกล่าม Forte ภายนอกในรหัสของคุณ
ตัวอย่าง
ทั้งหมดนี้เป็นส่วนหนึ่งของอินพุตเดียวกัน หลังจากแต่ละบรรทัดเอาต์พุตที่คาดไว้สัมพันธ์กับบรรทัดนั้นจะถูกแสดงในบางครั้งด้วยความคิดเห็นที่ระบุการกำหนดใหม่ที่เกี่ยวข้อง (ไม่ใช่ส่วนหนึ่งของเอาต์พุตที่ต้องการ)
5=4
4
6=5
4 # 5 -> 4
7=1+2+5
7
7=5+2+1
4 # Order of operations matters! 5+2 -> 4+2 -> 6 -> 4
18=5+6+7
12
5=3
3 # Remember: 5 -> 4
10=6+4
3 # 6 -> 4 -> 3, 3+3 = 6 -> 3
0
ถูกต้อง ("ตัวเลขจะเป็นจำนวนเต็มไม่เป็นลบเสมอ")
0
ตัวเลขที่ถูกต้อง?