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 เป็นสตริงและวิ่งมันพิมพ์หรือกลับเป็นผลหรือ0
1
เมื่อ?
คุณสามารถขอให้ผู้ใช้ป้อน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\?