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 ดั้งเดิมหากคุณต้องการล่าม