}0
--@2
@2/\=0MB
}0@1\/
&0/\>0!!
--
@1
00@0
--/\=0
\\@0&0
Marbelous - это 8-битный язык со значениями, представленными шариками только на машине, похожей на Rube Goldberg, так что это было не очень легко. Этот подход примерно эквивалентен следующему псевдокоду:
function recursiveFunction(int i)
{
for(int j = i*512; j > 0; j--)
{
recursiveFunction(i - 1);
}
}
поскольку максимальное значение равно 256 (в программе Marbleous оно представлено 0, который обрабатывается по-разному в разных местах), recursiveFunction (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
будут поданы все остальные соответствующие . Затем мрамор уменьшается, телепортируется и дублируется, как в ранее описанном цикле. Правильная копия затем проверяется на неравенство с помощью zero ( >0
), если она не равна 0, она проваливается. Если он равен 0, он сдвигается вправо и приземляется !!
, что завершает доску.
Итак, пока у нас есть цикл, который непрерывно ведет обратный отсчет от 255 до 0 и позволяет другому, аналогичному циклу (запитанному входом командной строки) запускаться один раз каждый раз, когда он достигает 0. Когда этот второй цикл выполняется n раз (максимум 256) ) программа завершается. Так что это максимум 65536 циклов цикла. Не достаточно, чтобы пережить вселенную.
}0
--@2
@2/\=0MB
Это должно выглядеть знакомо, входные данные уменьшаются один раз, затем это значение циклично оборачивается и копируется (обратите внимание, что мрамор уменьшается только один раз, а не при каждом запуске цикла). Затем он проверяется на равенство 0 и, если он не равен нулю, попадает на MB
. Это функция в Marbelous, каждый файл может содержать несколько досок, и каждая доска - это функция, каждая функция должна быть названа перед сеткой :[name]
. Каждая функция, кроме первой функции в файле, которая имеет стандартное имя: МБ. Таким образом, этот цикл непрерывно вызывает основную плату снова со значением, n - 1
где n - это значение, с которым был вызван этот экземпляр функции.
Так почему же n*512
?
Итак, первый цикл выполняется за 4 такта (и 256 раз), а второй цикл выполняется n раз до завершения платы. Это означает, что доска работает около n*4*256
тиков. Последний цикл (который выполняет рекурсивный вызов функции) является компактным и выполняется в 2 такта, что означает, что ему удается вызывать функцию n*4*256/2 = n*512
раз.
Какие символы вы не упомянули?
\/
Это мусорное ведро, которое удаляет шарики с доски, это гарантирует, что сброшенные шарики не будут мешать другим шарикам, которые зацикливаются в цикле, и предотвращают завершение программы.
бонус
Так как шарики, которые падают с нижней части мраморной доски, выводятся в STDOUT, эта программа печатает множество символов ASCII во время работы.