Доказано, что оптимально!
((([()][()][()])))
Попробуйте онлайн!
объяснение
Brain-Flak, Brain-Flueue, Miniflak и Fλak
([()][()][()]) Push -3
( ) Copy
( ) Copy
Это печатает:
-3
-3
-3
(Есть завершающий символ новой строки)
Brain-Flak Classic
Brain-Flak Classic является оригинальной версией Brain-Flak и имеет некоторые важные отличия от современных Brain-Flak. В BFC [...]
печатает его содержимое, а не отрицает его.
[()] Print 1
[()] Print 1
[()] Print 1
( ) Push 3
( ) Push 3
( ) Push 3
В конце выполнения содержимое стека ( 3 3 3
) печатается.
Это печатает:
1
1
1
3
3
3
(Есть завершающий символ новой строки)
Flakcats
Flakcats довольно сильно отличается от других 4-х типов, и я удивлен, что это работает в Flakcats. Три оператора здесь почти такие же, как те, что использует Brain-Flak.
Основным отличием этой конкретной программы от Flakcats является (...)
оператор, который в Flakcats эквивалентен ([{}]...)
Brain-Flak. Это, однако, не имеет значения для нас, потому что он собирает нули и, следовательно, работает так же, как Brain-Flak.
Вот эта программа, скомпилированная в Brian-Flak:
([{}]([{}]([{}][()][()][()])))
Это печатает:
-3
-3
-3
(Есть завершающий символ новой строки)
Доказательство оптимальности в Brain-Flak и Miniflak
Это не формальное доказательство, а скорее неформальное доказательство, которое необходимо расширить, чтобы сделать его более строгим
Из-за ограничений, что программы Brain-Flak должны быть сбалансированной строкой, а длина программы должна быть кратна 3, любая действительная отправка должна быть кратна 6 в длину. Это означает, что любое решение меньше 18 должно иметь длину 12.
Из-за выходных данных, заканчивающихся символом новой строки, конечная высота стека должна быть кратна трем, иначе мы нарушим ограничения на вывод.
Любое допустимое представление длиной 12 должно иметь 2 типа скобок (при меньшем значении нарушается ограничение на количество отдельных символов, а при большем значении должно быть более 12 символов). Поскольку программа производит вывод, она должна иметь толчок.
Это оставляет нам выбрать другой набор скобок. Варианты:
<...>/<>
Это терпит неудачу, потому что нам нужно сгенерировать «значение», чтобы создать любое число, отличное от нуля, мы должны отказаться от a, ()
чтобы создать число, которое делает невозможным нажатие более двух раз.
[...]/[]
Это терпит неудачу по той же причине, по которой последний потерпел неудачу. Квадратные скобки действительно плохо делают ценность. []
Монада может создать ценность , но нам нужно нажать номера первыми и мы тогда не хватает круглых скобок остались нажать три раза.
{...}/{}
Этот многообещающий, мы могли бы создать цикл и использовать его ()
для многократного нажатия, но, увы, это невозможно.
Чтобы завершить цикл, в какой-то момент в стеке должен быть ноль, а для того, чтобы у нас был правильный вывод, в конце программы должно быть что-то отличное от нуля в стеке. Поскольку у нас нет []
ни <>
ноля в конце цикла, это должен быть неявный ноль в нижней части стека. Это означает, что цикл не может добавлять новые числа в стек, делая его бесполезным.
Поскольку ни один из вариантов фигурной скобки не может создать программу длиной 12, ни один из них не может существовать.
Поскольку Miniflak является подмножеством Brain-Flak, любая более короткая программа Miniflak также будет более короткой программой Brain-Flak и, следовательно, не существует.
Доказательство оптимальности в мозге
Brain-Flueue - это язык шуток, основанный на Brain-Flak. Они настолько похожи, что их интерпретаторы везде одинаковы, кроме двух строк. Различие между ними заключается в том, что, как следует из их названий, Brain-Flueue хранит свои данные в очередях, а Brain-Flak хранит свои данные в стеках.
Для начала у нас есть те же ограничения на размер программы, созданный Brain-Flak, поэтому мы ищем программу размером 12. Кроме того, нам понадобится a (...)
для создания любого вывода и другой пары. <>
и []
пары не работают в Brain-Flueue для той же самой причине , что они не работают в Brain-Flak.
Теперь мы знаем, что наша программа должна состоять из символов ((())){{{}}}
.
С помощью тех же методов, которые использовались в предыдущем доказательстве, мы можем продемонстрировать, что в конечной программе должен быть цикл.
Теперь вот где доказательства отличаются, потому что Brain-Flueue работает через очереди, а не стеки, программа может выйти из цикла со значениями в очереди.
Чтобы выйти из цикла, нам понадобится ноль в очереди (или пустая очередь, но если очередь пуста, мы получим ту же проблему, что и Brain-Flak), это будет означать, что нам придется открыть нашу программу, ({})
чтобы создать нуль. Нам понадобится нажать внутри цикла, чтобы поместить необходимое количество элементов в очередь. Нам также нужно вставить ненулевое число перед циклом, чтобы мы могли вообще войти в цикл; это будет стоить нам в абсолютном минимуме (())
. Теперь мы использовали больше паренов, чем у нас.
Таким образом, нет программы Brain-Flueue для выполнения задачи размером 12 байт, и, кроме того, наша программа является оптимальной.
Следующее решение является оптимальным в Flakcats и Brain-Flak Classic.
((([][][])))
объяснение
[][][] -3
((( ))) push 3 times
Альтернативные 24-байтовые решения Brain-Flak
(<((<((<(())>)())>)())>)
Попробуйте онлайн!
((<((<((<>)())>)())>)())
Попробуйте онлайн!
((((((()()()){}){}){})))
Попробуйте онлайн!