พื้นหลัง
Fractranเป็นภาษาโปรแกรมภาษาทัวริงที่สมบูรณ์แบบที่คิดค้นโดย John Conway โปรแกรม Fractran ประกอบด้วยรายการเศษส่วนที่เรียงลำดับแล้ว โปรแกรมเริ่มต้นด้วยการใช้จำนวนเต็มเดียวเป็นอินพุต การวนซ้ำแต่ละครั้งของโปรแกรมจะค้นหารายการสำหรับเศษส่วนแรกเช่นการคูณจำนวนด้วยเศษส่วนนั้นจะสร้างจำนวนเต็มอีก จากนั้นจะทำซ้ำกระบวนการนี้ด้วยหมายเลขใหม่เริ่มต้นที่จุดเริ่มต้นของรายการ เมื่อไม่มีเศษส่วนในรายการที่สามารถคูณด้วยตัวเลขโปรแกรมจะหยุดและให้หมายเลขเป็นเอาท์พุท
เหตุผลที่ Fractran นั้นเป็นทัวริงสมบูรณ์เพราะมันจำลองเครื่องลงทะเบียน การแยกตัวประกอบเฉพาะของจำนวนเก็บเนื้อหาของรีจิสเตอร์ในขณะที่การหารและการคูณเป็นวิธีการบวกและลบจากรีจิสเตอร์แบบมีเงื่อนไข ฉันขอแนะนำให้อ่านบทความ Wikipedia (เชื่อมโยงกับด้านบน)
ความท้าทาย
งานของคุณคือการเขียนโปรแกรมที่สั้นที่สุดที่สามารถใช้โปรแกรม Fractran ที่ถูกต้องจาก STDIN เป็นเพียงอินพุตและสร้างโปรแกรม BF ที่ถูกต้องไปยัง STDOUT ที่จำลองโปรแกรม Fractran มีสองวิธีที่คุณสามารถจำลองโปรแกรม Fractran กับ BF
หมายเหตุ: คำตอบของคุณไม่ใช่โปรแกรม BF คำตอบของคุณคือรหัสที่สร้างโปรแกรม BF จากโปรแกรม Fractran ใด ๆ เป้าหมายคือการรับโปรแกรม BF ให้เทียบเท่ากับโปรแกรม Fractran (ในทางเทคนิคคุณสามารถแข่งขันใน BF ได้ แต่มันคงยาก)
ตัวเลือกที่ 1
โปรแกรมของคุณควรส่งออกโปรแกรม BF ที่ทำสิ่งต่อไปนี้:
- ใช้ตัวเลข 1 หมายเลขจาก STDIN ในรูปแบบของอักขระ ASCII ที่สอดคล้องกัน (เนื่องจากวิธีการทำงานของอินพุต BF) ซึ่งเป็นอินพุตของโปรแกรม Fractran
- พิมพ์จำนวน 1 ไปยัง STDOUT ในรูปแบบของอักขระ ASCII ที่สอดคล้องกันซึ่งเป็นผลลัพธ์จากโปรแกรม Fractran
ตัวเลือกนี้มีไว้เพื่อแสดงถึงอินพุตและเอาต์พุตที่แน่นอนจากเครื่องเสมือน Fractran
ตัวเลือก 2
รหัส BF ที่โปรแกรมของคุณควรทำมีดังต่อไปนี้:
- รับอินพุตโดยให้การแยกตัวประกอบเฉพาะของหมายเลขที่เข้ารหัสในหน่วยความจำ (ก่อนที่จะเรียกใช้โปรแกรม) หากอินพุตเป็น 28 (2 * 2 * 7) ดังนั้นจะมีค่า 2 ในเซลล์ที่สองและค่า 1 ในเซลล์ที่เจ็ด (ตัวชี้เริ่มต้นที่เซลล์ 0) เซลล์อื่น ๆ ทั้งหมดจะเป็นศูนย์
- ให้เอาต์พุตโดยมีการแยกตัวประกอบเฉพาะของเอาต์พุตที่เข้ารหัสในหน่วยความจำเมื่อโปรแกรมหยุดทำงาน หากเอาต์พุตคือ 10 จะต้องมีค่า 1 ในแต่ละเซลล์ 2 และ 5 เซลล์ที่มีหมายเลขหลักอื่นทั้งหมดต้องมีค่าเป็นศูนย์ เนื้อหาของเซลล์อื่นไม่สำคัญ
ตัวเลือกนี้แสดงถึงรูปแบบการคำนวณที่อยู่เบื้องหลังภาษา Fractran
กฎและข้อกำหนด
- อินพุต (บนโปรแกรมของคุณ) จะเป็นรายการของเศษส่วนใน STDIN จะมีหนึ่งเศษส่วนต่อบรรทัดโดยมีเครื่องหมายจุลภาคระหว่างตัวเศษและส่วน บรรทัดว่างแสดงถึงจุดสิ้นสุดของอินพุต เศษส่วนจะลดลงเป็นคำต่ำสุดเสมอ
- ผลลัพธ์ของโปรแกรมของคุณควรเป็นโปรแกรม BF แบบบรรทัดเดียวที่ถูกต้องถึง STDOUT โปรแกรมนี้ควรสามารถจำลองโปรแกรม Fractran นั้น ๆ ตามหนึ่งในสองตัวเลือก สำหรับอินพุตใด ๆ โปรแกรม BF ที่สร้างขึ้นควรจะสามารถสร้างเอาต์พุตเช่นเดียวกับโปรแกรม Fractran
- คุณต้องระบุตัวเลือกที่คุณเลือก
- คุณสามารถเลือกขอบเขตในหน่วยความจำ BF และเทปและไม่ว่าพวกเขาจะห่อ
- สนามกอล์ฟรหัส นอกจากนี้ขนาดของโปรแกรม BF outputted ไม่สำคัญเพียงขนาดของโปรแกรมที่ทำการแปลง
- โปรแกรมควรประกอบด้วย ASCII ที่พิมพ์ได้เท่านั้น
หากฉันคลุมเครือทุกที่อย่าลังเลที่จะถาม นี่เป็นความท้าทายที่ซับซ้อนในการอธิบาย
นอกจากนี้โปรดโพสต์รหัส BF ของโปรแกรมของคุณสำหรับอินพุตต่อไปนี้เพื่อให้เป็นวิธีที่ง่ายในการตรวจสอบว่าโปรแกรมของคุณทำงานหรือไม่:
33,20
5,11
13,10
1,5
2,3
10,7
7,2
โปรแกรมนี้คำนวณจำนวน 1s ในการขยายฐานสองของตัวเลข อย่างไรก็ตามอินพุทและเอาท์พุทนั้นมีการจัดรูปแบบที่แปลก (เช่นเดียวกับโปรแกรม Fractran ทั้งหมด) อินพุตมีรูปแบบ 2 ^ A ในขณะที่เอาต์พุตเป็นรูปแบบ 13 ^ B