Brainflak множення метагольф


17

Це питання є першим із декількох викликів дня народження 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. Обов’язково включіть посилання на вихідну програму для перевірки.


1
З-за інтересу, чому операції 1 і циклу заборонені?
Ніл

@Neil Оператор висоти стека також заборонений.
Ерік Аутгольфер

1
@EriktheOutgolfer Я вже заборонив цю в цілому метагольфі.
Ніл

7
Комп'ютерники дивні. Вони вигадують мови програмування, які неможливо використовувати, як правило, анти-гольф, а потім кидають виклик один одному писати гольф-код для вирішення простих проблем цією мовою. Ніщо не езотеричне за це. +1 хороший пане.
Draco18s більше не довіряє SE

1
@ Qwerp-Derp Я розглядав оптимізацію виходу пов'язаної програми Python (поточна оцінка 681950) і виявив тривіальну економію 4492, використовуючи [...], тож це початок.
Ніл

Відповіді:


2

Рубі, 669856

$answers = Hash.new{|hash,n|
  valid = []
  2.upto(n**0.5){|i|
    valid.push("("+hash[n/i]+")"+"({})"*(i-2)+"{}") if n%i == 0
  }
  valid.push("({})"+hash[n-1])
  (hash[n] = valid.min_by{|s| s.length})
}
$answers[1] = "{}"

def full_answer n
  "("+$answers[n]+")"
end

Це швидка вихідна відповідь. Тут знайдено перші 1000 хвилин програм . (Я спробував розмістити їх усі, але це перевантажило максимальний розмір пастіна.) Я можу додати пояснення коду пізніше.

Приклади:

360:    ((((((({})(({}){}){})({}){})({}){}){}){}){})
4608:   (((((((((((({})({}){})({}){}){}){}){}){}){}){}){}){}){})
9991:   (({})((({})(((((((({})((({})({}){}){}){}){}){}){}){}){}){}){})({}){}){})
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.