Це питання є першим із декількох викликів дня народження Brain-Flak, призначених відсвяткувати перший День народження Brain-Flak! Ви можете знайти більше інформації про день народження Brain-Flak тут
Минулого літа у нас був Brag-flak Integer Metagolf , і його відповіді були дуже корисними для спільноти Brain-Flak. Головне, що робить Metagolf Metagolf таким ефективним, це техніка, що називається Hardcoding Multiplication.
У мозку Brain-Flak множення часу виконання надзвичайно дороге. Найкоротший відомий фрагмент множення:
({}<>)({<({}[()])><>({})<>}{}<><{}>)
Відкрив Мегатом
Однак існує дуже простий спосіб створити множення часу компіляції. Наприклад, наступний код помножиться на 5:
(({})({})({})({}){})
Це працює, оскільки послідовні вирази додаються разом. Кожен ({})
не робить нічого до стека ( {}
вискакує і (..)
відштовхує його назад) і оцінює те, що знаходиться на вершині стека. Усі ці вирази разом складають до п'яти разів, що було на вершині стека.
Для будь-якого n
наступного рядкового виразу буде зроблено фрагмент, який помножить верхню частину стека на n
:
"("+"({})"*(n-1)+"{})"
Це працює, створюючи n
вирази, які всі оцінюють у верхній частині стека. Перший n-1
насправді нічого не змінює, а останній видаляє верхню частину стека перед натиском.
Для складених чисел ви можете з'єднати кілька менших виразів, щоб зберегти байти. Наприклад, ви можете помножити на 25, помноживши на 5 вдвічі:
(({})({})({})({}){})(({})({})({})({}){})
Це досить просто, і для деяких номерів він працює досить добре, проте є кращі способи зробити це. Наприклад, один метод, який я придумав, використовує двійкове представлення числа. ( Ось реалізація python ) Цей новий метод набагато ефективніший, ніж простий рядовий вираз, показаний раніше, але його ще не кінець, є всілякі цікаві способи множення жорсткого коду і, мабуть, тон, яку ще ніхто не виявив.
Тож я думаю, що настав час побачити, як добре ми можемо отримати.
Короткий огляд Brain-Flak
Ось опис всього, що вам потрібно знати про Brain-Flak для цього виклику.
Мозг-Флак має "монади" та "монади". Нілади - це круглі дужки, які не мають всередині себе. Кожен nilad робить щось і повертає значення. Для цього завдання два nilads ми маємо справу з є {}
і <>
. {}
з'являється вершина активного стека і повертає його значення. <>
перемикає активний стек і активний стек, так що активний стек стає неактивним, а неактивний стек стає активним, він повертає нуль.
Монади - це дужки з речами, що знаходяться всередині них. Вони беруть єдиний аргумент, суму всього, що знаходиться всередині них, іноді виконують дію, а потім повертають значення. Три з яких ми маємо справу, є (...)
, <...>
і [...]
. Найважливіша монада для цього виклику (...)
приймає значення зсередини і підштовхує її до активної стеки. Потім він повертає аргумент. <...>
і [...]
обидва "інертні" монади, тобто вони не виконують жодної дії, а змінюють значення, яке вони передають. <...>
завжди повертає нуль незалежно від переданого аргументу. Тим часом [...]
завжди повертає аргументи разів -1
.
Зразкові програми з поясненням
Якщо ви ніколи не програмували в Brain-Flak, можливо, було б непогано переглянути деякі приклади програм, використовуючи описані операції
({}{})
Це додає два перших числа в стеку. Кожен {}
вискакує значення стека і (...)
відсуває їх суму назад.
({}[{}])
Аналогічно це віднімає другий елемент на стеку від першого. Як і перед кожним {}
спливом значення, але [..]
навколо другого викликає його додавання. Ще раз (...)
підштовхує суму.
({}<{}>)
Це видаляє друге значення з стека, зберігаючи верхнє значення неушкодженим. Він працює так само, як і два останніх, за винятком того, що друге значення замовчується <...>
так, що натискання лише відштовхує перше значення назад.
(({}))
Це робить другу копію значення у верхній частині стека. Це робиться, вискакуючи верхню частину стека з {}
отриманням його значення, перший (..)
потім відштовхує його назад, оцінюючи його значення. Другий (...)
приймає значення, повернене першим, і підштовхує його до стека. створення другої копії.
Завдання
Враховуючи ціле число, n
створіть чистий фрагмент Brain-Flak, який помножить верхню частину поточного стека на n
.
Вам дозволяється використовувати наступні операції з мозком Flak
(...) -> Push Monad, Pushes the result of its contents
<...> -> Zero Monad, Returns zero
[...] -> Negative Monad, Returns the opposite of its contents result
{} -> Pop nilad, Pops the TOS and returns its value
<> -> Switch nilad, Switches the active and inactive stack
Інші операції заборонені з метою виклику.
Оцінка балів
Ваша оцінка буде сума довжин всіх програм від n=2
до n=10000
. Обов’язково включіть посилання на вихідну програму для перевірки.
[...]
, тож це початок.