}0
--@2
@2/\=0MB
}0@1\/
&0/\>0!!
--
@1
00@0
--/\=0
\\@0&0
Marbelous là một ngôn ngữ 8 bit với các giá trị chỉ được biểu thị bằng các viên bi trong một cỗ máy giống Rube Goldberg, vì vậy điều này không dễ dàng gì. Cách tiếp cận này gần tương đương với mã giả sau:
function recursiveFunction(int i)
{
for(int j = i*512; j > 0; j--)
{
recursiveFunction(i - 1);
}
}
vì giá trị tối đa là 256, (được biểu thị bằng 0 trong chương trình Đá hoa cương, được xử lý khác nhau ở các vị trí khác nhau) Hàm đệ quy (1) sẽ được gọi là tổng cộng 256!*512^256
bằng 10^1200
, dễ dàng vượt qua vũ trụ.
Marbelous không có trình thông dịch rất nhanh, có vẻ như nó có thể chạy 10^11
các cuộc gọi của chức năng này mỗi năm, điều đó có nghĩa là chúng ta đang xem xét thời gian chạy 10^1189
nhiều năm.
Giải thích thêm về hội đồng quản trị
00@0
--/\=0
\\@0&0
00
là một ngôn ngữ theo nghĩa đen (hoặc một viên bi), được biểu thị dưới dạng thập lục phân (nên 0). Viên bi này rơi xuống --
, làm giảm bất kỳ viên bi nào bằng 1 (00 quấn quanh và biến thành FF hoặc 255 theo số thập phân). Đá hoa cương với giá trị FF rơi xuống trên \\
đó đẩy nó một cột sang phải, xuống phía dưới @0
. Đây là một cổng thông tin và dịch chuyển đá cẩm thạch đến @0
thiết bị khác . Ở đó, viên bi nằm trên /\
thiết bị, là một máy sao chép, nó đặt một bản sao của viên bi ở --
bên trái của nó (viên bi này sẽ tiếp tục lặp lại giữa các cổng và được giảm dần trên mỗi vòng) và một cái ở =0
bên phải.=0
so sánh đá cẩm thạch với giá trị 0 và cho phép đá cẩm thạch rơi xuống nếu nó bằng nhau và đẩy nó sang phải nếu không. Nếu viên bi có giá trị teh 0, nó sẽ rơi vào &0
, một bộ đồng bộ, mà tôi sẽ giải thích thêm, sau.
Nói chung, điều này chỉ bắt đầu với một viên bi giá trị 0 trong một vòng lặp và giảm dần cho đến khi nó về 0 lần nữa, sau đó nó đặt viên bi giá trị 0 này vào một bộ đồng bộ hóa và tiếp tục lặp cùng một lúc.
}0@1
&0/\>0!!
--
@1
}0
là một thiết bị đầu vào, ban đầu đầu vào dòng lệnh thứ n (cơ sở 0) khi gọi chương trình được đặt trong mọi }n
thiết bị. Vì vậy, nếu bạn gọi chương trình này với đầu vào dòng lệnh 2, một giá trị bằng đá cẩm thạch 02 sẽ thay thế điều này }0
. Đá cẩm thạch này sau đó rơi vào &0
thiết bị, một bộ đồng bộ hóa khác, &n
đồng bộ hóa giữ các viên bi cho đến khi tất cả các ứng dụng tương ứng khác &n
cũng được nộp. Đá cẩm thạch sau đó được giảm dần, dịch chuyển và nhân đôi giống như trong vòng lặp được giải thích trước đó. Bản sao bên phải sau đó được kiểm tra bất đẳng thức bằng 0 ( >0
) nếu không phải là 0, nó sẽ rơi qua. Nếu là 0, nó bị đẩy sang phải và hạ cánh !!
, kết thúc bảng.
Được rồi, cho đến nay chúng ta có một vòng lặp liên tục đếm ngược từ 255 xuống 0 và cho phép một vòng lặp tương tự khác (được cung cấp bởi đầu vào dòng lệnh) chạy một lần mỗi khi nó chạm 0. Khi vòng lặp thứ hai này chạy n lần (tối đa là 256 ) chương trình chấm dứt. Vì vậy, đó là tối đa 65536 lượt chạy của vòng lặp. Không đủ gần để tồn tại lâu hơn vũ trụ.
}0
--@2
@2/\=0MB
Điều này sẽ bắt đầu trông quen thuộc, đầu vào bị giảm một lần, sau đó giá trị này lặp lại và được sao chép (lưu ý rằng đá cẩm thạch chỉ được giảm một lần, không phải trên mỗi lần chạy vòng lặp). Sau đó, nó được kiểm tra sự bằng nhau về 0 và nếu nó không bằng không MB
. Đây là một chức năng trong Marbelous, mỗi tệp có thể chứa một vài bảng và mỗi bảng là một chức năng, mọi chức năng phải được đặt tên bằng cách đặt trước lưới theo :[name]
. Mọi chức năng ngoại trừ chức năng đầu tiên trong tệp có tên tiêu chuẩn: MB. Vì vậy, vòng lặp này liên tục gọi lại bảng chính với giá trị trong n - 1
đó n là giá trị teh mà phiên bản này của hàm teh được gọi.
Vậy tại sao n*512
?
Vâng, vòng lặp đầu tiên chạy trong 4 tích tắc (và 256 lần) và vòng lặp thứ hai chạy n lần trước khi bảng kết thúc. Điều này có nghĩa là bảng chạy cho khoảng n*4*256
tick. Vòng lặp cuối cùng (gọi hàm đệ quy) là vi khuẩn và chạy trong 2 tích tắc, có nghĩa là nó quản lý để gọi n*4*256/2 = n*512
thời gian của hàm .
Các biểu tượng bạn đã không đề cập là gì?
\/
là một thùng rác, loại bỏ các viên bi khỏi bảng, điều này đảm bảo các viên bi bị loại bỏ không gây trở ngại cho các viên bi khác đang vòng một vòng và ngăn chương trình chấm dứt.
Thêm
Vì các viên bi rơi xuống dưới cùng của một bảng tuyệt vời có được đầu ra cho STDOUT, chương trình này in rất nhiều ký tự ASCII trong khi nó chạy.