นี่คือการท้าทายประจำสัปดาห์ # 2 ธีม: การแปล
เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในรหัสที่มาสำหรับโปรแกรมในโหมโรงและผลสำหรับโปรแกรมเทียบเท่าในBefunge-93 สำหรับโปรแกรมที่จะเทียบเท่ามันควรสำหรับการป้อนข้อมูลที่กำหนดใด ๆ ผลิตผลลัพธ์เดียวกันกับโปรแกรมโหมโรงและหยุดถ้าหากโปรแกรมโหมโรงหยุด
ภาษาที่ป้อน: โหมโรง
Python interpreter:
โปรแกรมโหมโรงประกอบด้วย "เสียง" จำนวนหนึ่งซึ่งดำเนินการคำสั่งพร้อมกัน คำแนะนำสำหรับแต่ละเสียงอยู่ในบรรทัดแยกต่างหาก แต่ละเสียงมีสแต็คแยกต่างหากซึ่งจะเริ่มต้นด้วยเลขศูนย์ที่ไม่มีที่สิ้นสุด การดำเนินการเริ่มต้นที่คอลัมน์ซ้ายสุดและเลื่อนไปหนึ่งคอลัมน์ทางด้านขวาแต่ละเครื่องหมายยกเว้นเมื่อได้รับอิทธิพลจาก)
หรือ(
คำสั่ง โปรแกรมจะหยุดทำงานเมื่อถึงคอลัมน์สุดท้าย
ข้อกำหนดเบื้องต้นสำหรับความท้าทายนี้:
Digits 0-9 Push onto the stack a number from 0 to 9. Only single-digit
numeric literals can be used.
^ Push onto the stack the top value of the stack of the above
voice.
v Push onto the stack the top value of the stack of the below
voice.
# Remove the top value from the stack.
+ Pop the top two integers from the stack and push their sum.
- Pop the top two integers from the stack, subtract the topmost
from the second, and push the result.
( If the top of the stack is 0, jump to the column after the
matching `)` after the current column executes.
) If the top of the stack is not 0, jump to the column after
the matching `(` after the current column executes.
? Read an integer from STDIN.
! Pop one value from the stack and print it to STDOUT as an
integer.
<space> No-op
หมายเหตุ
v
และ^
ทำหน้าที่เป็นวนรอบดังนั้นv
เสียงที่ด้านล่างจะคัดลอกองค์ประกอบสแต็คของเสียงด้านบนและเสียงที่^
อยู่ด้านบนจะคัดลอกมาจากเสียงด้านล่าง ข้อสรุป:ทั้งคู่v
และ^
ซ้ำด้านบนสุดของสแต็กในโปรแกรมเสียงเดียว- A
(
และการจับคู่)
อาจอยู่ในบรรทัดที่ต่างกัน อย่างไรก็ตาม a)
จะดูที่สแต็คของเสียงที่(
วางเสียงนั้น ๆ เสมอไม่ใช่สแต็กที่)
วางเสียงนั้น - ค่าที่ผลิตโดยคำสั่ง
^
และv
คำสั่งจะทำงานกับค่าที่มีอยู่ก่อนที่การดำเนินการอื่น ๆ จะเสร็จสิ้นในคอลัมน์เดียวกัน ?
และ!
ดำเนินการแตกต่างจากข้อกำหนดที่พบใน esolangs.org ดังนั้นโปรดทดสอบกับล่ามดัดแปลงเล็กน้อยที่ให้ไว้ในโพสต์นี้
อินพุตรับประกันว่าจะมี:
- วงเล็บที่ตรงกัน
- ไม่เกินหนึ่งวงเล็บในคอลัมน์
- จำนวนอักขระเท่ากันในแต่ละบรรทัด
- อย่างน้อยหนึ่งบรรทัด
- ไม่มีคอลัมน์ที่มีมากกว่าหนึ่ง I / O (
!
หรือ?
) การเรียนการสอน - อักขระป้อนบรรทัดหนึ่งตัวหลังจากคำแนะนำสำหรับแต่ละเสียง
- ไม่มีตัวละครอื่นนอกเหนือจากที่กล่าวไว้ข้างต้น
ภาษาเอาท์พุท: Befunge-93
Befunge เป็นภาษาที่ใช้สแต็กซึ่งโปรแกรมตัวนับ (PC; ตัวชี้ไปยังคำสั่งปัจจุบัน) เคลื่อนที่อย่างอิสระบนกริดสองมิติ มันเริ่มต้นที่มุมซ้ายบนเลื่อนไปทางขวา สนามเด็กเล่นนั้นเป็นวงแหวนเช่นการเคลื่อนไหวของพีซีล้อมรอบทั้งสองด้าน Befunge ยังมีสแต็กซึ่งถูกกำหนดค่าเริ่มต้นเป็นศูนย์จำนวนไม่สิ้นสุด Befunge มีการดำเนินการดังต่อไปนี้:
คุณอาจถือว่าคุณสมบัติต่อไปนี้ของคอมไพเลอร์ / ล่าม Befunge-93:
- จำนวนเต็มมีความแม่นยำไม่ จำกัด
- จะช่วยให้กริดทุกขนาด
- พิกัดกริด (สำหรับ
g
และp
) เป็นแบบ 0
เกณฑ์การให้คะแนน
เพื่อป้องกันการส่งที่สร้าง Prelude interpreter ใน Befunge และ hardcode ของ Prelude source เข้าไปเป้าหมายจะลดขนาดของซอร์สโค้ด Befunge ที่เกิดขึ้นให้น้อยที่สุด
ด้านล่างมีโปรแกรม Prelude ให้เลือกมากมาย นักแปลของคุณจะทำงานกับสิ่งเหล่านี้ทั้งหมด คะแนนของคุณคือผลรวมของขนาดของโปรแกรม Befunge โดยที่รายการทั้งหมดนั้นถูกต้อง
นักแปลของคุณไม่ควรปรับให้เหมาะกับกรณีทดสอบเหล่านี้โดยเฉพาะ (เช่นโดยโปรแกรม hardcoding ที่เขียนด้วยลายมือ Befunge สำหรับพวกเขา) หากฉันสงสัยว่ามีคำตอบใด ๆ ฉันขอสงวนสิทธิ์ในการเปลี่ยนแปลงอินพุตหรือสร้างรายการเพิ่มเติม
อินพุตตัวอย่าง
พิมพ์n-1
ลงไปที่0
:
?(1-^!)
ตรรกะและ:
? (0)
?(0 )
1 !
ตรรกะหรือ:
? (0)
? (0)
1 1 !
ตรวจสอบพาริตีของอินพุต (เช่นโมดูโล 2) ของหมายเลขที่ไม่ติดลบ:
?(1-)
^ v
v1-^^-!
กำหนดค่าอินพุต:
^
^+ !
?(1-)
พิมพ์หมายเลข Fibonacci ลำดับที่nที่n = 0
ตรงกับ 0 และn = 1
สอดคล้องกับ 1:
0 v+v!
1 ^
?(1-)
Signum:
1) v # - !
vv (##^v^+)
?(# ^ ##
การหารสำหรับอินพุตที่ไม่เป็นลบ:
1 (# 1) v # - 1+)
vv (##^v^+)
? v-(0 # ^ #
?
1+ 1-!
แน่นอนว่าโปรแกรมของคุณจะต้องแสดงพฤติกรรมเดียวกันทุกกรณีแม้ว่าจะไม่ได้ระบุพฤติกรรมของโปรแกรมตัวอย่างสำหรับจำนวนลบ
สุดท้ายนักแปลของคุณไม่ควรยาวเกินเหตุผล:
- จะต้องมีอยู่ในโพสต์แลกเปลี่ยนกอง
- ควรประมวลผลอินพุตตัวอย่างภายใน 10 นาทีบนคอมพิวเตอร์เดสก์ท็อปทั่วไป
โปรดทราบว่าการป้อนตัวเลขสำหรับ Prelude หรือ Befunge นั้นจะได้รับเป็นเครื่องหมายลบตัวเลือกตามด้วยตัวเลขทศนิยมหนึ่งหลักขึ้นไปตามด้วยการขึ้นบรรทัดใหม่ อินพุตอื่นคือพฤติกรรมที่ไม่ได้กำหนด
คุณสามารถเขียนนักแปลเป็นภาษาใดก็ได้ รหัส Befunge ที่แปลสั้นที่สุดชนะ
ลีดเดอร์บอร์ด
- Sp3000 : 16430 ไบต์
1
อยู่ในลูปดังนั้นจึงอาจไม่ถูกผลัก 0 สามารถมาจากจำนวน 0 ของอนันต์ที่เริ่มต้นบนสแต็ก