@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
Nó chỉ hoạt động cho các giá trị dưới 256 vì Marbelous là ngôn ngữ 8 bit.
Làm thế nào nó hoạt động
Marbelous là một ngôn ngữ 2D với các giá trị được biểu thị bằng các viên bi 8 bit rơi xuống một ô trên mỗi dấu trừ khi một số thiết bị ngăn chúng rơi xuống. Chương trình đáng tin cậy này bao gồm 3 bảng; Hãy bắt đầu với cách dễ nhất:
:O
}0
+Z
+C
{0
:Olà tên của bảng (chính xác là O là tên và: nói với người được giải thích rằng dòng này là tên. Bằng cách đặt tên cho bảng, các bảng khác có thể gọi chúng
}0là một thiết bị đầu vào, đây có thể được xem là một đối số của hàm này. Ô này sẽ được thay thế bằng một viên bi (giá trị) đầu vào khi hàm được gọi.
+Zthêm 35 vào bất kỳ viên bi nào đi qua nó và cho phép nó rơi qua. +CKhông giống nhau nhưng chỉ thêm 12. {0là một ô đầu ra , khi một viên bi đến ô này, hàm sẽ thoát và trả về giá trị trong thiết bị đầu ra này.
Vì vậy, tất cả cùng nhau, bảng này lấy một giá trị và sau đó thêm 47 vào nó. Đối với chúng tôi, điều này có nghĩa là nó biến bất kỳ số nào có một chữ số thành mã ascii của chữ số -1 (tất nhiên điều này cũng sẽ hoạt động trong 10).
:I
}1 .. }1 00 01 F7
=9 &1 ++ .. &1 &0
&0 }0 &1 &0 {1 {1
{> \/ {0 //
Bảng này có vẻ phức tạp hơn một chút. Bạn sẽ có thể xác định :Ilà tên của bảng và đã phát hiện ra một số thiết bị đầu vào và đầu ra. Bạn sẽ nhận thấy rằng chúng tôi có hai thiết bị đầu vào khác nhau, }0và }1. Điều này có nghĩa là chức năng này mất 2 đầu vào. Bạn cũng sẽ nhận thấy rằng có hai phiên bản của }1thiết bị. Khi gọi hàm, cả hai ô này sẽ chứa cùng một giá trị. Các }0thiết bị đầu vào trực tiếp trên một \/thiết bị, điều này đóng vai trò như một thùng rác và loại bỏ bất kỳ bằng đá cẩm thạch rơi khi nó ngay lập tức.
Chúng ta hãy xem những gì xảy ra với một trong những viên bi được đưa vào bảng bởi các }1thiết bị đầu vào:
}1
=9 &1
&0
{>
Nó sẽ rơi xuống đánh dấu đầu tiên và đánh vào =9thiết bị. Điều này so sánh giá trị của đá cẩm thạch với 9 và cho phép viên bi rơi qua nếu câu lệnh =9ước lượng xuyên qua. Đá cẩm thạch được đẩy sang phải nếu không. &0và &1là đồng bộ hóa. Họ giữ những viên bi rơi vào chúng cho đến khi tất cả các &nđồng bộ hóa khác cũng được lấp đầy. Như bạn có thể mong đợi, điều này sẽ có điều kiện kích hoạt các hành vi khác nhau trên một số phần khác của bảng.
}1 00 01 F7
++ .. &1 &0
&1 &0 {1 {1
{0 //
Nếu tôi nói với bạn rằng đó ++là một bộ tăng, bạn đã có thể cho biết những gì các bộ đồng bộ hóa khác nhau sẽ được lấp đầy. Bên trái &1sẽ chứa giá trị đầu vào }1+ 1, &0bên cạnh nó sẽ chứa 0 ( 00là một ngôn ngữ, được biểu thị dưới dạng thập lục phân). Cái thứ hai &1sẽ chứa giá trị 1 và bên phải &0được điền bằng một F7, trừ 9 từ một giá trị vì phép cộng trong Marbelous là modulo 256.
// là một thiết bị làm lệch hướng, đẩy bất kỳ viên bi nào sang trái thay vì để nó rơi xuống.
Đặt tất cả những thứ này lại với nhau mang lại cho bạn điều này: nếu viên bi trong }1là 9, các &0bộ đồng bộ hóa sẽ được lấp đầy. Điều này sẽ khiến giá trị 0 rơi vào {0đầu ra và F7(hoặc -9) vào {1đầu ra. Nếu }1không phải là 9, {0sẽ được điền }1+ 1 và {0sẽ chứa 1. Ngoài ra còn có một {>thiết bị, đây là một đầu ra đặc biệt tạo ra một viên bi bên cạnh một bảng thay cho bên dưới nó. Điều này sẽ được điền với }1nếu nó bằng 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
Được rồi, bây giờ cho một lớn. Bảng này không có tên rõ ràng, vì nó là bảng chính của tệp. Tên ngầm của nó là Mb. Bạn sẽ có thể nhận ra một số tế bào. Có một thiết bị đầu vào, một số ngôn ngữ ( 00và FF). Có một số đồng bộ hóa và có một bộ làm lệch hướng. hãy bước qua mảnh này bằng mảnh.
@0 @6
}0 &0
>0 @6
\\ --
@0 /\ @4
Vì vậy, giá trị đầu vào (đầu vào dòng lệnh vì đây là bảng chính) bắt đầu từ ô thứ hai từ đỉnh }0được đặt. Nó sẽ rơi xuống và tiếp cận >0thiết bị, đó là một thiết bị so sánh khác. bất kỳ viên bi nào lớn hơn 0 rơi xuống, bất kỳ viên bi nào khác đều bị đẩy sang phải. (vì các biến Marbelous không được ký, chỉ chính xác 0 sẽ được đẩy sang phải). Đá cẩm thạch có giá trị bằng không này sau đó sẽ đạt@6 thiết bị. Đây là một cổng thông tin và vận chuyển đá cẩm thạch đến một cổng thông tin tương ứng khác, trong trường hợp này ngay trên nó. Đá cẩm thạch 0 sau đó sẽ đạt đến &0bộ đồng bộ hóa và kích hoạt một số thứ ở nơi khác.
Nếu viên bi không bằng 0, nó rơi xuống, bị lệch về bên phải bởi các \\cú đánh --làm giảm nó một cái và sau đó rơi xuống /\, một người nhân bản. Thiết bị này lấy một viên bi và xuất ra một bản sao của nó ở bên phải và một bản bên trái. Một bên trái sẽ được đưa lên trên đến @0nơi khác , nơi đá cẩm thạch sẽ đi qua cùng một trình tự một lần nữa. Một bên trái sẽ được đưa đi nơi khác. Điều này cung cấp cho chúng ta một vòng lặp, làm giảm đầu vào dòng lệnh một lần trên mỗi vòng lặp và kích hoạt một số hành vi trên mỗi vòng lặp cho đến khi đạt đến 0. Sau đó, nó kích hoạt một số hành vi khác.
Chúng ta hãy xem những gì xảy ra với đá cẩm thạch được đẩy vào @4mỗi vòng.
@4 @1 .. @2 @5 @3
II II II II II II
FF &1 FF &2 FF &3
@1 OO @2 OO @3 OO
Có 3 ngôn ngữ ở đây ( FF), sẽ ngay lập tức rơi vào cổng. Các cổng này sẽ đưa họ đến ba trong số các IIthiết bị. IIđề cập đến bảng :Ichúng tôi xác định thêm xuống tập tin. Vì :Icó 2 thiết bị đầu vào riêng biệt, đại diện của nó trên một bảng khác phải rộng 2 ô. Vì chúng tôi có 6 ô chứa II, chúng tôi cam nói rằng chúng tôi có 3 trường hợp của chức năng này trên bảng.
Các FFviên bi (hoặc 256 hoặc -1 nếu bạn sẽ) sẽ nằm trong các ô đầu vào của :Ihàm chờ cho đến khi có đủ đá cẩm thạch đầu vào bắt đầu chức năng (thêm một viên nữa). Đó là nơi@4 cổng thông tin xuất hiện. Một bản sao của đầu vào dòng lệnh giảm dần rơi vào đó trên mỗi vòng lặp. Điều này sẽ kích hoạt :Ibảng ngoài cùng bên trái . Ban đầu với các giá trị 256 (hoặc -1) và bất kể đầu vào dòng lệnh là -1. Đá cẩm thạch bên trái sẽ được đưa vào các }0thiết bị của :Ibảng và một bên phải vào }1. Nếu bạn nhớ lại những gì bảng này đã làm, bạn sẽ có thể cho biết kết quả này có gì. Nó sẽ xuất ra một phiên bản tăng dần của đầu vào bên phải ở đầu ra bên trái (và nó biến 9 thành 0, không phải 10) và xuất ra 1 hoặc -9 ở bên phải.
Giá trị gia tăng sẽ được đưa trở lại ô nhập vào bên phải bởi một cổng và giá trị bên phải rơi vào bộ đồng bộ hóa. Nếu một bộ đồng bộ hóa đang giữ một viên bi, hai viên bi sẽ va chạm vào nhau. Các viên bi va chạm được thêm vào modulo 256. Vì vậy, các giá trị trong bộ đồng bộ sẽ thực hiện theo sau: Chúng bắt đầu trống, sau đó chuyển sang 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, và sau đó 1 lần nữa (kể từ khi được thêm modulo 256).
Bạn cũng có thể nhớ rằng một viên bi sẽ xuất ra bên phải khi giá trị đầu vào lặp lại 0. Vì các :Ibảng nằm ngay cạnh nhau, thsi sẽ kích hoạt bảng ở bên phải một lần. Điều này sẽ lấp đầy ba bộ đồng bộ hóa với các giá trị cao hơn một giá trị sẽ là một biểu diễn shortlex của đầu vào dòng lệnh, tại thời điểm này đã lặp xuống 0.
Bạn cũng có thể nhớ rằng :Ohàm biến một giá trị thành giá trị ascii của chữ số đại diện cho giá trị -1. Đầu ra của các OOô này sau đó sẽ rơi ra khỏi bảng, in ra các ký tự ascii tương ứng của chúng thành STDOUT.
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
Vì vậy, điều gì xảy ra khi dòng lệnh đầu vào cẩm thạch đạt 0 và điền vào &0bộ đồng bộ hóa đó ? tốt, một vài viên bi giá trị 0 rơi xuống và kích hoạt ba bộ đồng bộ hóa đang giữ các chữ số (+ 1) của số shortlex ở dưới cùng của bảng. &3được kích hoạt đầu tiên, vì nó chứa chữ số có ý nghĩa nhất, sau đó được &2theo sau &1. Đá cẩm thạch này sau đó được dịch chuyển đến @5thiết bị khác trước khi cuối cùng chạm vào !!tế bào, làm chấm dứt bảng.
19, 20, 21, 22trong các bản đồ thập phân thành08, 09, 10, 11inlexlex. Đó là lý do tại sao tôi sử dụng nhầm lẫn đó100 -> 89!