Stackylogic เป็นภาษาการเขียนโปรแกรมแบบลอจิกที่ฉันสร้างขึ้นซึ่งใช้เวลาในการ0's และ1' s สำหรับการป้อนข้อมูลและการส่งออกเดียว0หรือ1เมื่อเสร็จสิ้น
โปรแกรม Stackylogic ประกอบด้วยเส้นที่สามารถมีตัวละครทั้งสาม01?เช่นเดียวกับว่าหนึ่ง<ในตอนท้ายของหนึ่งของเส้น สายอาจจะไม่ว่างเปล่าและบรรทัดที่มี<จะต้องมีอย่างน้อยหนึ่ง0, 1หรือ?ก่อนที่มันจะ
นี่คือโปรแกรมตัวอย่างที่ (ตามที่ฉันจะอธิบาย) คำนวณNANDของสองบิต:
1
?<
11
?
0
ทุกบรรทัดในโปรแกรม Stackylogic ถือเป็นสแต็กโดยมีด้านล่างทางด้านซ้ายและด้านบนทางด้านขวา โดยนัยมีสแต็กเปล่า (บรรทัดว่าง) อยู่ก่อนบรรทัดแรกในโปรแกรมและหลังบรรทัดสุดท้าย
<ซึ่งเราจะเรียกเคอร์เซอร์เครื่องหมายสแต็คที่จะเริ่มต้นเมื่อโปรแกรม Stackylogic มีการเรียกใช้ การดำเนินการของโปรแกรม Stackylogic ดำเนินการดังนี้:
วางอักขระบนสุดออกจากสแต็กที่เคอร์เซอร์กำลังชี้ไป
- หากตัวละครนั้น
?ให้แจ้งผู้ใช้สำหรับ0หรือหรือ1และทำราวกับว่าเป็นตัวละคร - หากอักขระอยู่
0ให้เลื่อนเคอร์เซอร์ขึ้นหนึ่งกอง (ไปยังบรรทัดที่อยู่เหนือบรรทัดปัจจุบัน) - หากอักขระอยู่
1ให้เลื่อนเคอร์เซอร์หนึ่งสแต็กลง (ไปยังบรรทัดด้านล่างบรรทัดปัจจุบัน)
- หากตัวละครนั้น
หากกองเคอร์เซอร์เลื่อนไปที่ว่างเปล่าเอาท์พุทค่าสุดท้ายที่โผล่ออกมาจากกอง (เสมอ
0หรือหรือ1) และจบโปรแกรมมิฉะนั้นหากเคอร์เซอร์เลื่อนไปที่ไม่ว่างเปล่าให้กลับไปที่ขั้นตอนที่ 1 และทำซ้ำกระบวนการ
โปรดสังเกตว่าโปรแกรม Stackylogic มักจะจบลงเพราะพวกเขาจะต้องทำให้หมดสแต็กในที่สุด
ตัวอย่าง NAND
ในโปรแกรม NAND เคอร์เซอร์เริ่มต้นที่?:
1
?<
11
?
0
เราจะสมมติว่าผู้ใช้ป้อนข้อมูล1หนึ่งครั้งที่?มันเกิดขึ้นซึ่งหมายความว่าเคอร์เซอร์จะเลื่อนลงทำให้โปรแกรมมีลักษณะดังนี้:
1
11<
?
0
ตอนนี้ธรรมดา1อยู่ที่ด้านบนของเคอร์เซอร์สแต็ค มันถูกตอกย้ำและเคอร์เซอร์จะเลื่อนอีกครั้ง:
1
1
?<
0
ทีนี้สมมติให้ผู้ใช้ป้อน0ค่า?ซึ่งหมายความว่าเคอร์เซอร์จะเลื่อนขึ้น:
1
1<
0
อีกครั้ง a 1อยู่บนเคอร์เซอร์สแตกดังนั้นเคอร์เซอร์จะปรากฏและเลื่อนลง:
1
<
0
ในที่สุดเคอร์เซอร์สแต็คจะว่างเปล่าดังนั้นค่าสุดท้ายที่ผุดขึ้น1คือคือเอาต์พุตและโปรแกรมจะสิ้นสุด
นี้ถูกต้องสำหรับประตู NAND เพราะเป็น1 NAND 0 1แน่นอนว่าวิธีนี้ใช้ได้กับอินพุตสองบิตอีกสามตัวหากคุณต้องการตรวจสอบ
หรือตัวอย่าง
โปรแกรม Stackylogic จำลองเกตOR :
?
?<
มันง่ายที่จะเห็นว่าอินพุตเริ่มต้นของ1จะผลักเคอร์เซอร์ไปที่สแต็กว่างเปล่าโดยนัยด้านล่างบรรทัดสุดท้ายการสิ้นสุดโปรแกรมและการแสดงผล1ที่เป็นเพียงอินพุต
สำหรับการป้อนข้อมูลของ00ในทางกลับกันเคอร์เซอร์จะหาทางไปสแต็คที่ว่างเปล่าโดยนัยที่ด้านบนสิ้นสุดโปรแกรมและการส่งออกสุดท้าย0ที่จะเข้า
ท้าทาย
เขียนโปรแกรมหรือฟังก์ชั่นที่ใช้ในโปรแกรม Stackylogic เป็นสตริงและวิ่งมันพิมพ์หรือกลับเป็นผลหรือ01
เมื่อ?คุณสามารถขอให้ผู้ใช้ป้อน0หรือ1ป้อนค่าหรืออ่านค่าจากสตริงที่กำหนดไว้ล่วงหน้าของ0's และ1' ที่คุณใช้เป็นอินพุต (ซึ่งอาจเป็นอินพุตสตริงอื่นไปยังโปรแกรม / ฟังก์ชันของคุณหรือคุณอาจสันนิษฐานว่าบรรทัดแรกหรือบรรทัดสุดท้ายของสตริงโปรแกรมจะเป็นสตรีมอินพุต)
คุณอาจจะถือว่าโปรแกรมและอินพุตนั้นมีรูปแบบที่ดีอยู่เสมอ คุณอาจเลือกที่จะสมมติว่าโปรแกรมอินพุตมาพร้อมกับบรรทัดใหม่ต่อท้ายบรรทัดเดียว (แม้ว่าจะจำได้ว่ามีสแต็กว่างเปล่าโดยปริยายอยู่เสมอในตอนท้าย)
รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ
โปรแกรมตัวอย่างเพิ่มเติม
ZERO
0<
ONE
1<
BUFFER
?<
NOT
1
?<
0
AND
?<
?
NAND
1
?<
11
?
0
OR
?
?<
NOR
1
?
00
?<
0
XOR(v1)
?
0
1?<
?
0
XOR(v2)
?
?<
11
?
0
XNOR(v1)
1
?
0?<
1
?
XNOR(v2)
1
?
00
?<
?
MEDIAN(v1)
1
???<
0
MEDIAN(v2)
?
1?<
??
ขอขอบคุณมาร์ตินสำหรับแบ่ง โปรแกรม
1\???<\0.
111\???????<\000อินพุตฟังก์ชั่นส่วนใหญ่เป็นกฎ
?\1?<\??ป้อนข้อมูลต่อไปนี้เป็นวิธีหนึ่งที่จะดำเนินการได้เฉลี่ย: หรือนี่คือการใช้งาน 5 บรรทัดแบบสมมาตร:?\?0\?<\?1\?