@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 - це двовимірна мова зі значеннями, представленими 8-бітовими мармурами, які падають на одну клітинку на кожен галочку, якщо якийсь пристрій не запобігає їх падінню. Ця програма Marbelous складається з 3 дощок; почнемо з найпростішого:
:O
}0
+Z
+C
{0
:O
- це назва дошки (якщо бути точним, О - це ім'я та: вказує інтерпретоване, що цей рядок є ім'ям. Даючи дошці ім'я, інші дошки можуть зателефонувати на них
}0
- це вхідний пристрій, це може розглядатися як Аргумент цієї функції. Ця комірка буде замінена на вхідний мармур (значення), коли функція викликається,
+Z
додає 35 до будь-якого мармуру, який проходить по ній, і дозволяє йому провалюватися. +C
робить те саме, але додає лише 12.{0
є вихідною коміркою , коли мармур досягне цієї комірки, функція вийде і поверне значення в цьому пристрої виводу.
Отже всі разом ця дошка приймає одне значення, а потім додає до неї 47. Для нас це означає, що це перетворює будь-яке одноцифрове число в код ассії цифри -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
введення знаходиться безпосередньо над a\/
пристроєм, він виконує функцію кошика і видаляє будь-який мармур, який потрапляє на нього негайно.
Давайте подивимось, що відбувається з одним із мармурів, що вводяться на дошку }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
заповнюється F7
символом, який віднімає 9 від значення, оскільки додавання в Marbelous є модулем 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, він падає вниз, відхиляється праворуч \\
ударами, --
які зменшують його на один, а потім падають на /\
клон. Цей пристрій бере мармур і видає одну його копію праворуч і одну ліворуч. Лівий буде піднесений вгору до іншого, @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. Значення синхронізаторів будуть виконувати наступні дії: вони починаються порожніми, потім переходять до 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, а потім до 1 раз (оскільки до 247 додано модуль 256).
Ви також можете пам’ятати, що мармур отримує висновок праворуч, коли вхідне значення обертається назад до 0. Оскільки :I
дошки знаходяться поруч один з одним, цей раз запустить дошку праворуч. Це заповнить три синхронізатори значеннями, які є на одне вище, ніж вони повинні бути коротким поданням введення командного рядка, до моменту, коли це зменшиться до 0.
Ви можете також пам’ятати, що :O
функція перетворює значення у значення ascii цифри, що представляє значення -1. Вихід цих OO
комірок потім випаде з плати, яка друкує відповідні символи до STDOUT.
00 00 00 @5
&0 &0 &0
&3
\/ &2
\/ &1 !!
@5
То що відбувається, коли мармур введення командного рядка досягає 0 і заповнює &0
синхронізатори? добре, кілька мармурів значення 0 падають вниз і спрацьовують три синхронізатори, які містять цифри (+ 1) короткого номера в нижній частині дошки. &3
спрацював перший, так як він містить найбільш значну цифру, потім приходить &2
потім &1
. Потім цей мармур телепортується на інший @5
пристрій, перш ніж врешті-решт потрапить на !!
осередок, який припиняє дошку.
19, 20, 21, 22
у десяткових картах -08, 09, 10, 11
у шортлексі. Ось чому я використав це плутати100 -> 89
!