Stackylogic เป็นภาษาโปรแกรมที่ผมทำขึ้นมาในความท้าทายที่ก่อนหน้านี้: Run Stackylogic อ่านโพสต์นั้นสำหรับรายละเอียดและตัวอย่างทั้งหมด แต่นี่คือวิธีการถอดความ:
Stackylogic ใช้
0
's และ1
' s สำหรับอินพุตและเอาต์พุตเดี่ยว0
หรือ1
เมื่อเสร็จสมบูรณ์โปรแกรมประกอบด้วยบรรทัดที่มีเฉพาะอักขระ
01?
เช่นเดียวกับหนึ่ง<
บรรทัดที่ส่วนท้ายของหนึ่งบรรทัด สายอาจจะไม่ว่างเปล่าและบรรทัดที่มี<
จะต้องมีอย่างน้อยหนึ่ง0
,1
หรือ?
ก่อนที่มันจะนี่คือตัวอย่างโปรแกรมที่คำนวณNANDของสองบิต:
1 ?< 11 ? 0
ทุกบรรทัดในโปรแกรมถือว่าเป็นสแต็กโดยมีด้านล่างทางด้านซ้ายและด้านบนทางด้านขวา โดยปริยายมีสแต็กเปล่า (เช่นบรรทัดว่าง) ก่อนบรรทัดแรกในโปรแกรมและหลังบรรทัดสุดท้าย
กระบวนการ
<
เรียกว่าเคอร์เซอร์ทำเครื่องหมายสแต็กเพื่อเริ่มต้นเมื่อโปรแกรมทำงาน การดำเนินการดังต่อไปนี้:
วางอักขระบนสุดออกจากสแต็กที่เคอร์เซอร์กำลังชี้ไป
- หากตัวละครนั้น
?
ให้แจ้งผู้ใช้สำหรับ0
หรือหรือ1
และทำราวกับว่าเป็นตัวละคร- หากอักขระอยู่
0
ให้เลื่อนเคอร์เซอร์ขึ้นหนึ่งกอง (ไปยังบรรทัดที่อยู่เหนือบรรทัดปัจจุบัน)- หากอักขระอยู่
1
ให้เลื่อนเคอร์เซอร์หนึ่งสแต็กลง (ไปยังบรรทัดด้านล่างบรรทัดปัจจุบัน)หากกองเคอร์เซอร์เลื่อนไปที่ว่างเปล่าเอาท์พุทค่าสุดท้ายที่โผล่ออกมาจากกอง (เสมอ
0
หรือหรือ1
) และจบโปรแกรมมิฉะนั้นหากเคอร์เซอร์เลื่อนไปที่ไม่ว่างเปล่าให้กลับไปที่ขั้นตอนที่ 1 และทำซ้ำกระบวนการ
สิ่งสำคัญที่ต้องตระหนักสำหรับความท้าทายนี้คือการที่ทุกโปรแกรม Stackylogic ถือเอาตารางความจริง จำนวนบูลีนที่กำหนดค่าไว้ล่วงหน้าบางรายการเป็นอินพุตและบูลีนหนึ่งรายการจะถูกกำหนดไว้อย่างแน่นอน
ดังนั้นงานของคุณคือสร้างโปรแกรม Stackylogic ที่สร้างความพึงพอใจหรือจำลองสถานการณ์เช่นมีเอาต์พุตเหมือนกับตารางความจริงที่กำหนด แต่ไม่ชัดเจนว่า Stackylogic สามารถจำลองตารางความจริงใด ๆ ดังนั้นนี่คือหลักฐานโดยอุปนัย :
เคสฐาน
0 ตารางความจริงสองอินพุตคือตารางที่ส่งออก
0
หรือ1
เสมอ Stackylogic ที่เท่าเทียมกันของตารางเหล่านี้0<
และ1<
ตามลำดับขั้นตอนอุปนัย
สมมติว่า Stackylogic สามารถจำลองตารางความจริง N-input ใด ๆ ก็ได้ ให้ M = N + 1
เอ็มป้อนข้อมูลตาราง, T, สามารถแสดงเป็นสองตาราง N-อินพุต T 0และ T 1แถมบีบิตการป้อนข้อมูลเพิ่มเติมเมื่อ B คือ 0, ผลมาจากการที่ T 0ถูกนำมาใช้ เมื่อ B คือ 1, ผลมาจากการที่ T 1ถูกนำมาใช้
ตัวอย่างเช่นตารางความจริงอินพุต 3 ที่สอดคล้องกับ pseudocode
if B: result = x OR y else: result = x NAND y
คือ
B x y | result 0 0 0 | 1 0 0 1 | 1 0 1 0 | 1 0 1 1 | 0 1 0 0 | 0 1 0 1 | 1 1 1 0 | 1 1 1 1 | 1
ซึ่งจริงๆแล้วเป็นตารางความจริง 2 อินพุทสำหรับ NAND และ OR ซ้อนกันบน muxing bit B
ให้ S 0และ S 1เป็นโปรแกรม Stackylogic ที่เป็นไปตาม T 0และ T 1ตามลำดับ (เรารู้ว่าสิ่งเหล่านี้มีอยู่บนพื้นฐานของสมมติฐานแรก) โปรแกรม S ที่สร้างความพึงพอใจให้กับ T สามารถสร้างเป็น:
[lines of S0 excluding the cursor, with 0 appended to all lines below the cursor] ?< [lines of S1 excluding the cursor, with 1 appended to all lines above the cursor]
การจัดเรียงนี้ได้อย่างมีประสิทธิภาพ muxes ระหว่าง S 0และ S 1ขึ้นอยู่กับบิตแรกเข้า (จากบรรทัด
?<
) หากเป็น0
เช่นนั้นเคอร์เซอร์จะเลื่อน0
ขึ้นไปที่ตำแหน่งเคอร์เซอร์เดิมของ S 0ซึ่งจะถูกล้อมรอบด้านบนและด้านล่างด้วยสแต็คที่ว่างเปล่าดังนั้นจึงทำงานเหมือนกันกับ S 0ดั้งเดิม หาก1
เป็นอินพุตเคอร์เซอร์จะ เลื่อนตำแหน่งเคอร์เซอร์1
ลงไปที่ตำแหน่งของ S 1และดำเนินการเพื่อดำเนินการราวกับว่าอยู่คนเดียวตัวอย่างเช่นโปรแกรม Stackylogic สำหรับ OR และ NAND ได้แก่
? ?<
และ
1 ?< 11 ? 0
สามารถรวมกันเพื่อจำลอง
if B: result = x OR y else: result = x NAND y
ชอบมาก:
1 ? 110 ?0 00 0 ?< ?1 ?
ดังนั้นตารางความจริงใด ๆ สามารถจำลองโดยโปรแกรม Stackylogic
ท้าทาย
เขียนโปรแกรมหรือฟังก์ชั่นที่รับในตารางความจริงอินพุต N (N> 0) ในรูปแบบของรายการค่าบูลีน2 Nที่แสดงผลลัพธ์ของตารางตามลำดับเลขฐานสองจากน้อยไปมาก
รูปแบบอินพุตที่เหมาะสมไม่เป็นไร เช่นสำหรับตารางหรือความจริง
x y | OR
0 0 | 0
0 1 | 1
1 0 | 1
1 1 | 1
ลักษณะอินพุตใด ๆ เหล่านี้จะใช้ได้:
0111
0, 1, 1, 1
0
1
1
1
[False, True, True, True]
พิมพ์หรือส่งคืนโปรแกรม Stackylogic ที่ตรงกับตารางความจริงเช่นมีเอาต์พุตที่แน่นอนเหมือนกันซึ่งให้อินพุตเดียวกัน โปรแกรม จำกัดใด ๆที่ตอบสนองตารางนั้นเป็นผลลัพธ์ที่ถูกต้อง คุณไม่จำเป็นต้องทำตามวิธีการก่อสร้างที่พิสูจน์ตัวเหนี่ยวนำ โปรแกรม Stackylogic ไม่จำเป็นต้องสั้นที่สุด
ตัวอย่างเช่นถ้าอินพุตเป็น11100111
หนึ่งเอาต์พุตที่ถูกต้องจะเป็น
1
?
110
?0
00
0
?<
?1
?
แต่มีคนอื่นอีกมากมาย
รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ
ดูความท้าทาย Stackylogic ดั้งเดิมหากคุณต้องการล่าม