}0
--@2
@2/\=0MB
}0@1\/
&0/\>0!!
--
@1
00@0
--/\=0
\\@0&0
Marbelous - це 8-бітова мова зі значеннями, представленими лише мармурами в машині, подібній до Руба Голдберга, тому це було не дуже просто. Цей підхід приблизно еквівалентний наступному псевдокоду:
function recursiveFunction(int i)
{
for(int j = i*512; j > 0; j--)
{
recursiveFunction(i - 1);
}
}
оскільки максимальне значення - 256, (представлене 0 у програмі Marbleous, яка обробляється по-різному в різних місцях), рекурсивнаФункція (1) буде називатися загальною величиною, 256!*512^256
яка дорівнює приблизно 10^1200
, досить легко пережити всесвіт.
У Marbelous не дуже швидкий перекладач, схоже, він може працювати на 10^11
виклики цієї функції на рік, а це означає, що ми спостерігаємо час виконання 10^1189
.
Подальше пояснення дошки Marbelous
00@0
--/\=0
\\@0&0
00
- мова буквальна (або мармур), представлена шістнадцятковою (так 0). Цей мармур падає вниз --
, який зменшує будь-який мармур на 1 (00 обертається і перетворюється на FF або 255 у десятковій частині). Мармур з теперішнім значенням FF падає вниз на той, \\
який засуває його на одну колонку праворуч, на нижню @0
. Це портал і телепортує мармур на інший @0
пристрій. Там мармур приземляється на /\
пристрій, який є копіювачем, він кладе одну копію мармуру --
ліворуч (цей мармур буде тримати петлю між порталами та зменшуватись на кожній петлі) та один - =0
праворуч.=0
порівнює мармур із значенням нуля і дозволяє мармуру провалюватися, якщо він рівний, і, якщо ні, підштовхує його вправо. Якщо мармур має значення 0, він сідає на &0
синхронізатор, про що я поясню далі, пізніше.
Загалом, це просто починається з мармуру значення 0 у циклі і зменшує його, поки він знову не досягне 0, потім він додає цей мармур 0 значень у синхронізатор і одночасно продовжує циклічно.
}0@1
&0/\>0!!
--
@1
}0
- це пристрій введення, спочатку введення командного рядка n-го (база 0) при виклику програми розміщується в кожному }n
пристрої. Тож якщо ви зателефонуєте до цієї програми за допомогою введення командного рядка 2, мармур значення 02 замінить це }0
. Потім цей мармур потрапляє в &0
пристрій, інший синхронізатор, &n
синхронізатори тримають мармур, поки не &n
будуть подані також усі інші відповідні . Потім мармур зменшується, телепортується та дублюється так само, як у раніше поясненому циклі. Потім правильна копія перевіряється на нерівність з нулем ( >0
), якщо вона не 0, вона пропадає. Якщо вона дорівнює 0, вона висувається праворуч і приземляється !!
, що закінчує дошку.
Гаразд, поки що у нас є цикл, який постійно відлічується від 255 до 0 і дозволяє інший, подібний цикл (подається введенням командного рядка) запускатися один раз щоразу, коли він потрапляє в 0. Коли цей другий цикл працює n разів (максимум 256 ) програма припиняється. Отже, це максимум 65536 пробігів циклу. Не майже достатньо, щоб пережити світобудову.
}0
--@2
@2/\=0MB
Це повинно почати виглядати знайомим, вхід зменшується один раз, потім це значення обводиться і копіюється (зауважте, що мармур зменшується лише один раз, а не на кожному циклі циклу). Потім він перевіряється на рівність 0, і якщо це не нульове значення MB
. Це функція в Marbelous, кожен файл може містити кілька дощок, і кожна дошка є функцією, кожна функція повинна бути названа попередньою сіткою :[name]
. Кожна функція, крім першої функції у файлі, яка має стандартну назву: MB. Таким чином, цей цикл постійно безперервно викликає основну плату зі значенням, n - 1
де n - це значення, з якого був названий цей екземпляр функції.
То чому n*512
?
Ну, перший цикл працює в 4 кліща (і 256 разів), а другий цикл працює n разів до того, як плата закінчиться. Це означає, що на дошці працює близько n*4*256
кліщів. Останній цикл (який виконує рекурсивну функцію виклику) є компактним і працює в 2 тики, а значить, йому вдається викликати функцію n*4*256/2 = n*512
раз.
Які символи ви не згадали?
\/
це сміттєвий контейнер, який видаляє мармур з дошки. Це гарантує, що відмінений мармур не заважає іншим мармурам, які кружляють кругом і не дозволяють програмі закінчуватися.
Бонус
Оскільки мармур, що падає з нижньої частини мармурової дошки, отримує вихід STDOUT, ця програма друкує безліч символів ASCII, поки вона працює.