@0@6000000@5
}0&0&0&0&0
>0@6&3
\\--\/&2
@0/\@4\/&1!!
@4@1..@2@5@3
IIIIIIIIIIII
FF&1FF&2FF&3
@1OO@2OO@3OO
:I
}1..}10001F7
=9&1++..&1&0
&0}0&1&0{1{1
{>\/{0//
:O
}0
+Z
+C
{0
ใช้งานได้กับค่าต่ำกว่า 256 เท่านั้นเนื่องจาก Marbelous เป็นภาษา 8 บิต
มันทำงานอย่างไร
Marbelous เป็นภาษา 2D ที่มีค่าเป็นตัวแทนของหินอ่อน 8 บิตที่ตกลงมาหนึ่งเซลล์ในแต่ละขีด โปรแกรม Marbelous นี้ประกอบด้วย 3 บอร์ด เริ่มจากสิ่งที่ง่ายที่สุด:
:O
}0
+Z
+C
{0
:O
คือชื่อของบอร์ด (เพื่อความถูกต้อง O คือชื่อและ: บอกการตีความว่าบรรทัดนี้เป็นชื่อโดยให้ชื่อบอร์ดแก่บอร์ดอื่น ๆ สามารถโทรหาพวกเขาได้
}0
เป็นอุปกรณ์ป้อนข้อมูลนี้สามารถมองเห็นเป็น อาร์กิวเมนต์ของฟังก์ชั่นนี้เซลล์นี้จะถูกแทนที่ด้วย input หินอ่อน (ค่า) เมื่อฟังก์ชั่นได้รับการเรียก
+Z
เพิ่ม 35 หินอ่อนใด ๆ ที่ผ่านมันและช่วยให้มันผ่านไป+C
ทำเหมือนกัน แต่เพิ่มเพียง 12 {0
เป็นเซลล์เอาท์พุท เมื่อหินอ่อนมาถึงเซลล์นี้ฟังก์ชั่นจะออกและส่งกลับค่าในอุปกรณ์ส่งออกนี้
ดังนั้นทั้งหมดเข้าด้วยกันบอร์ดนี้ใช้หนึ่งค่าแล้วเพิ่ม 47 ลงไป สำหรับเรานี่หมายความว่ามันจะเปลี่ยนหมายเลขหลักเดียวให้เป็นรหัส ascii ของหลัก -1 (ซึ่งแน่นอนว่าจะใช้ได้สำหรับ 10)
:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //
กระดานนี้ดูซับซ้อนกว่านี้เล็กน้อย คุณควรระบุ:I
ชื่อบอร์ดได้และเห็นอุปกรณ์อินพุตและเอาต์พุตบางตัว คุณจะพบว่าเรามีสองอุปกรณ์ป้อนข้อมูลที่แตกต่างกันและ}0
}1
นี่หมายความว่าฟังก์ชั่นนี้ใช้ 2 อินพุต คุณจะสังเกตเห็นว่ามีสองกรณีของ}1
อุปกรณ์ เมื่อเรียกใช้ฟังก์ชันทั้งสองเซลล์เหล่านี้จะมีค่าเท่ากัน }0
อุปกรณ์ป้อนข้อมูลโดยตรงดังกล่าวข้างต้น\/
อุปกรณ์นี้ทำหน้าที่เป็นถังขยะและลบหินอ่อนใด ๆ ที่อยู่กับมันทันที
ลองมาดูสิ่งที่เกิดขึ้นกับหนึ่งในหินอ่อนที่ใส่ไว้ในบอร์ดโดย}1
อุปกรณ์อินพุต:
}1
=9 &1
&0
{>
มันจะล้มลงบนเห็บตัวแรกและกด=9
อุปกรณ์ สิ่งนี้จะเปรียบเทียบค่าของหินอ่อนกับ 9 และทำให้หินอ่อนตกลงหากคำสั่ง=9
ประเมินผ่าน หินอ่อนจะถูกผลักไปทางขวาถ้าไม่ &0
และ&1
เป็นตัวประสาน พวกเขายึดมั่นกับหินอ่อนที่ตกลงมาจนกระทั่งพวกเขาอื่น ๆ&n
ที่เต็มไปด้วยเช่นกัน ตามที่คุณคาดหวังสิ่งนี้จะทำให้เกิดพฤติกรรมที่แตกต่างกันในส่วนอื่น ๆ ของกระดาน
}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //
ถ้าฉันบอกคุณว่า++
เป็นตัวเพิ่มคุณควรจะสามารถบอกได้ว่าตัวประสานต่าง ๆ นั้นจะถูกเติมด้วยอะไร ด้านซ้าย&1
จะมีค่าอินพุต}1
+ 1 &0
ถัดจากนั้นจะมี 0 ( 00
เป็นตัวอักษรภาษาแสดงเป็นเลขฐานสิบหก) อันที่สอง&1
จะมีค่า 1 และด้านขวา&0
ถูกเติมด้วย an F7
ซึ่งลบ 9 จากค่าเนื่องจากการเพิ่มใน Marbelous คือ modulo 256
//
เป็นอุปกรณ์ดันที่ผลักหินอ่อนไปทางซ้ายแทนที่จะปล่อยให้มันตกลงมา
การรวมสิ่งนี้เข้าด้วยกันจะช่วยให้คุณได้สิ่งนี้: หากหินอ่อนใน}1
เท่ากับ 9 &0
ซิงโครไนเซอร์จะถูกเติมเต็ม สิ่งนี้จะทำให้ค่า 0 ตกอยู่ใน{0
เอาต์พุตและF7
(หรือ -9) ลงใน{1
เอาต์พุต หาก}1
ไม่ใช่ 9 {0
จะถูกเติมด้วย}1
+ 1 และ{0
จะประกอบด้วย 1 นอกจากนี้ยังมี{>
อุปกรณ์นี่เป็นเอาต์พุตพิเศษที่ส่งออกหินอ่อนที่อยู่ถัดจากบอร์ดแทนที่อยู่ด้านล่าง สิ่งนี้จะได้รับการเติม}1
ถ้ามันเท่ากับ 9
@0 @6 00 00 00 @5
}0 &0 &0 &0 &0
>0 @6 &3
\\ -- \/ &2
@0 /\ @4 \/ &1 !!
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
โอเคตอนนี้สำหรับผู้ยิ่งใหญ่ บอร์ดนี้ไม่มีชื่อที่ชัดเจนเนื่องจากเป็นกระดานหลักของไฟล์ Mb
ชื่อนัยของมันคือ คุณน่าจะสามารถรับรู้บางเซลล์ มีอุปกรณ์อินพุตตัวอักษรภาษาบางภาษา ( 00
และFF
) มีตัวประสานบางตัวและมีตัวเบี่ยง ปล่อยให้ผ่านไปทีละชิ้น
@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4
ดังนั้นค่าอินพุต (อินพุตบรรทัดคำสั่งตั้งแต่นี่คือบอร์ดหลัก) เริ่มต้นที่เซลล์ที่สองจากด้านบนซึ่ง}0
เป็นที่ตั้ง มันจะล้มลงและไปถึง>0
อุปกรณ์ซึ่งเป็นอุปกรณ์เปรียบเทียบอีกเครื่องหนึ่ง หินอ่อนที่มีขนาดใหญ่กว่า 0 จะตกลงมาหินอ่อนอื่น ๆ จะถูกผลักไปทางขวา (เนื่องจากตัวแปรของ Marbelous นั้นไม่ได้รับการลงนามมีเพียง 0 เท่านั้นที่ถูกผลักไปทางขวา) หินอ่อนที่มีค่าเป็นศูนย์นี้จะเข้าสู่@6
อุปกรณ์ นี่คือพอร์ทัลและส่งหินอ่อนไปยังพอร์ทัลอื่นที่เกี่ยวข้องในกรณีนี้อยู่ด้านบน จากนั้นหินอ่อน 0 จะไปถึงตัว&0
ซิงโครไนซ์และทริกเกอร์บางสิ่งที่อื่น
หากหินอ่อนไม่ใช่ 0 มันจะตกลงมาได้รับการเบี่ยงเบนไปทางขวาโดยการ\\
ยิง--
ซึ่งจะทำให้มันลดลงทีละหนึ่งแล้วก็ตกลงไป/\
ที่ cloner อุปกรณ์นี้นำหินอ่อนและส่งสำเนาหนึ่งชุดไปทางขวาและอีกชุดหนึ่งไปทางซ้าย ส่วนที่เหลือจะถูกนำขึ้นไปที่อื่น@0
ซึ่งหินอ่อนจะผ่านลำดับเดียวกันอีกครั้ง ส่วนที่เหลือจะถูกนำไปที่อื่น สิ่งนี้ทำให้เรามีลูปซึ่งลดอินพุตบรรทัดคำสั่งหนึ่งครั้งต่อหนึ่งลูปและทริกเกอร์พฤติกรรมบางอย่างในทุกลูปจนกว่าจะถึง 0 จากนั้นจะทริกเกอร์พฤติกรรมอื่น ๆ
ลองมาดูสิ่งที่เกิดขึ้นกับหินอ่อนที่ผลักเข้าไป@4
ในแต่ละวง
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
มี 3 ตัวอักษรภาษาที่นี่ ( FF
) ซึ่งจะตกอยู่ในพอร์ทัลทันที พอร์ทัลเหล่านี้จะนำพวกเขาไปยังII
อุปกรณ์สามอย่าง II
หมายถึงบอร์ดที่:I
เรากำหนดเพิ่มเติมลงไปในไฟล์ เนื่องจาก:I
มีอุปกรณ์อินพุต 2 ชนิดที่แตกต่างกันจึงมีการนำเสนอบนบอร์ดอื่นซึ่งต้องมีความกว้าง 2 เซลล์ เนื่องจากเรามี 6 เซลล์ที่มีII
เราบอกว่าเรามีฟังก์ชั่นนี้ 3 ตัวบนกระดาน
FF
(หรือ 256 หรือ -1 ถ้าคุณจะ) หินอ่อนจะนั่งในเซลล์ป้อนข้อมูลของ:I
ฟังก์ชั่นรอจนกว่าจะมีการป้อนข้อมูลพอ STO หินอ่อนเริ่มฟังก์ชัน (อีกหนึ่งที่มี) นั่นคือสิ่งที่@4
พอร์ทัลเข้ามาสำเนาของอินพุตบรรทัดคำสั่งที่ลดลงจะอยู่ตรงนั้นในแต่ละลูป นี่จะทำให้:I
กระดานซ้ายสุด เริ่มต้นด้วยค่า 256 (หรือ -1) และสิ่งที่อินพุตบรรทัดคำสั่งคือ -1 หินอ่อนซ้ายจะถูกใส่ลงไปใน}0
อุปกรณ์ของคณะกรรมการและหนึ่งที่เหมาะสมลงใน:I
}1
หากคุณจำได้ว่าบอร์ดนี้ทำอะไรคุณจะสามารถบอกได้ว่าผลลัพธ์นี้คืออะไร มันจะเอาท์พุทเวอร์ชั่นที่เพิ่มขึ้นของอินพุตด้านขวาบนเอาต์พุตด้านซ้าย (และเปลี่ยนเป็น 9 เป็น 0 ไม่ใช่ 10) และเอาต์พุตทั้ง 1 หรือ -9 ทางด้านขวา
ค่าที่เพิ่มขึ้นจะถูกนำกลับไปที่เซลล์ป้อนข้อมูลด้านขวาโดยพอร์ทัลและค่าด้านขวาจะอยู่ในซิงโครไนซ์ หากมีการซิงโครไนซ์ที่ถือหินอ่อนอยู่หินอ่อนสองลูกจะชนกัน การชนกันของหินอ่อนจะถูกรวมเข้าด้วยกันโมดูโล 256 ดังนั้นค่าในซิงโครไนเซอร์จะทำการ folowing: พวกมันเริ่มว่างแล้วจึงหันไปหา 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, และ 1 อีกครั้ง (ตั้งแต่ 247 เพิ่ม modulo 256)
คุณอาจจำได้ว่าหินอ่อนนั้นถูกเอาท์พุทไปทางด้านขวาเมื่อค่าอินพุตวนกลับไปที่ 0 เนื่องจาก:I
บอร์ดอยู่ถัดจากกันและกันดังนั้นจึงจะเรียกบอร์ดไปทางขวาหนึ่งครั้ง สิ่งนี้จะเติมสามตัวซิงโครไนซ์ด้วยค่าที่สูงกว่าค่าที่ควรจะเป็นการนำเสนอแบบย่อของอินพุตบรรทัดคำสั่งตามเวลาที่วนลูปลงไปที่ 0
คุณอาจจำได้ว่า:O
ฟังก์ชั่นเปลี่ยนค่าเป็นค่า ascii ของตัวเลขที่แสดงถึงค่า -1 ผลลัพธ์ของOO
เซลล์เหล่านี้จะหลุดออกจากบอร์ดซึ่งจะพิมพ์ ascii chars ที่สอดคล้องกันไปยัง STDOUT
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
ดังนั้นจะเกิดอะไรขึ้นเมื่อหินอ่อนอินพุตบรรทัดคำสั่งถึง 0 และเติม&0
ข้อมูลให้ตรงกัน? ดีหินอ่อนมูลค่า 0 สองสามตกลงมาและทริกเกอร์สาม synchronizers ที่ถือหลัก (+ 1) ของหมายเลข shortlex ที่ด้านล่างของบอร์ด &3
ได้รับการเรียกครั้งแรกเพราะมันมีหลักที่สำคัญที่สุดแล้วมาตามมาด้วย&2
&1
หินอ่อนนี้จะถูกเคลื่อนย้ายไปยัง@5
อุปกรณ์อื่นก่อนที่จะกระแทก!!
เซลล์ในที่สุดซึ่งจะยุติบอร์ด
19, 20, 21, 22
ในแผนที่ทศนิยมไปยัง08, 09, 10, 11
ใน shortlex นั่นเป็นเหตุผลที่ฉันใช้สับสนว่า100 -> 89
!