Одним из самых простых кодов, написанных языком программирования, является последовательность печати символов программы (например, «Привет, мир!»). Тем не менее, S о м е е с о т е р я с языков программирования , как Brainfuck , даже этот простейший код очень раздражает писать.
Ваша задача - написать программу (не обязательно писать в brainfuck), которая печатает (минимальную длину) программу Brainfuck, печатая данный текст.
вход
Последовательность символов (между 1
и 255
) задается в любом формате (переменная, аргумент, стандартный ввод, файл, ...).
Выход
Выходными данными является действительный (без несоответствия [
и ]
) код brainfuck ( допустим, 8-битная ячейка без знака и неограниченное количество ячеек слева и справа), печатающая точную строку, заданную в качестве входных данных.
Например, один возможный выход для ввода A
является ++++++++[<++++++++>-]<+.
.
Ваша программа не должна занимать много времени ( >2m
) для запуска.
Программа BF не должна занимать много времени ( >10s
) для запуска.
счет
(Обратите внимание: текущий метод оценки может измениться, так как его нелегко вычислить ...)
Длина программы (генерирующей код BF) сама по себе не имеет значения. Однако жесткое кодирование кодов BF в программном коде не в порядке. Только приемлемый диапазон (например , БФ код печати одного символа. 0x01
: +.
) Из BF - кодов может быть жестко закодированы.
Счет представляет собой сумму длин BF-кодов, печатающих эти строки.
- Строка,
Hello, world!
добавленная с помощью функции single0x0A
(\n
) (т. Е. Программа «Hello, world!») - Один символ из
0x01
~0xFF
- Сумма длин этих 255 кодов BF умножается на
1/16
, округляется и добавляется к результату.
- Сумма длин этих 255 кодов BF умножается на
- Список первых 16 строк, сгенерированных путем разбиения случайной последовательности байтов, сгенерированных 11-11-11 путем
0x00
удаления всех строк нулевой длины. - Lenna.png , удалив все
0x00
с. - Текст песни 99 бутылок пива , начиная с
99 bottles~
новой строки0x0A
, параграфы разделяются двумя0x0A
с, а в конце нет символа новой строки. - Другие строки вы можете предоставить.
Ваша программа может включать в себя подсчет очков.
Конечно, код с наименьшим количеством очков будет победителем.
Lenna.png
будет доминировать в счете, так как это безусловно самый большой вклад. Может нормализовать немного по размеру?Ответы:
В Java вычисляет короткий фрагмент BF, который может преобразовать любое число в любое другое число. Каждый выходной байт генерируется путем преобразования последнего выходного байта или нового 0 на ленте.
Фрагменты создаются тремя способами. Сначала с помощью простых повторений
+
и-
(например,++++
преобразует 7–11), путем объединения известных фрагментов (например, если A преобразует 5–50, а B преобразует 50–37, затем AB преобразует 5–37) и простых умножений (например,[--->+++++<]
умножает текущее число на 5/3). Простые умножения используют преимущества обтекания для генерации необычных результатов (например,--[------->++<]>
генерирует 36 из 0, где цикл выполняется 146 раз, всего 4 нисходящих и 1 восходящих обтеканий).Я слишком ленив, чтобы вычислить мой счет, но он использует около 12,3 операций BF на байт
Lenna.png
.источник
Ну, вот о худшем из возможных решений, хотя в самом Brainfuck это выглядит довольно красиво:
Оценка, вероятно, худшая, которую мы, вероятно, увидим, без преднамеренного ухудшения.
Работаем над подсчетом фактического балла.
источник
+
's и a.
[-]
чтобы очистить ячейку между каждым персонажем.Python 3.x
Ну, я не собираюсь выигрывать призы за самый короткий выходной код, но, может быть, за программу, чтобы сгенерировать код ...
«Привет, мир! \ N»:
источник
print("".join(["+"*ord(i)+".[-]"for i in input()]))
.[-]
на.>
Я не уверен, насколько это хорошо, но мне было весело писать это. (В Clojure ...)
Возможно, есть более эффективные и более изящные решения, но они следуют моему шаблону мышления несколько линейно, так что это было проще всего.
источник
Гол:
478748641439404086426 (без случайно сгенерированных данных)(4085639 из этого от Lenna.png. Это 99,98%)
Я не получаю часть со случайными данными. Разве мне не нужен аккаунт, за который я должен заплатить, чтобы получить данные?
Довольно наивно. Вот сгенерированный код для "1Aa" (49, 65, 97) с небольшой документацией:
Код Java немного уродлив, но работает. Сгенерированная инструкция на входной байтовый коэффициент, вероятно, тем лучше, чем выше среднее значение байта.
Если вы хотите запустить его, вы должны поместить Lenna.png в тот же каталог, что и файл .class. Он выводит партитуру на консоль и записывает сгенерированный код BF в файл с именем «output.txt».
Я собираюсь сделать небольшие улучшения, но, вероятно, не очень.Выполнено.источник
BrainF ** к
Я довольно плохой программист BF, поэтому этот ответ, вероятно, довольно неэффективен. Я не уверен в счете, но он должен работать немного лучше, чем существующий ответ на ваш средний текст. Вместо того, чтобы обнулять ячейку после каждого символа, этот «приспособится» к новому символу с вычитанием, если предыдущий данный символ больше.
(Обратите внимание, это код, который я написал давным-давно и повторно использовал для этого конкурса. Я искренне надеюсь, что я сделал преобразование правильно, но если он потерпит неудачу для любого ввода, дайте мне знать.)
Версия, показывающая состояние ленты во всем коде:
Сгенерированный код для
Hello, World!
:Это мой первый ответ на CG.SE! Если я что-то напортачил, дайте мне знать!
источник
> <>
Я написал это в ответ на вопрос, помеченный для дубликата, и хотя это не самый лучший гольф (по крайней мере, для этого конкретного вопроса), я подумал, что это будет пустая трата, если я не поделюсь этим вся его отвратительно бредовая слава. На самом деле, я немного удивлен, что это даже работает. Я приму любые предложения, чтобы сыграть в гольф, так как это было моей главной целью при создании.
Как примечание: во второй строке начинающиеся три символа
.21
можно заменитьv
на два пробела, если это облегчает чтение. Я не люблю видеть пробелы в моих> <> программах, потому что это означает, что есть свободное место (буквально). Это также остаток от одного из многих прототипов.Принцип его работы очень прост, и, откровенно говоря, мне было бы трудно подумать о том, как реализовать другой алгоритм. Однако он печатает много «+» для первого символа, а затем печатает больше «+» или «-» по мере необходимости для каждого дополнительного символа, разделяя каждый раздел точками. Что мне нравится в программе, так это то, что она изменяет свой собственный исходный код так, чтобы печатать «+» или «-» (вместо «+» в строке 3 соответствующий символ после определения, является ли текущий символ больше или меньше, чем предыдущий).
Выход для
Hello, World!
:Я мог бы забить это так, как это было задумано, но я почти уверен, что проиграл, и я не совсем знаю, как читать что-то вроде lenna.png в> <>.
Если этот ответ вас заинтересует, и вы хотели бы получить объяснение, во что бы то ни стало спросите, но сейчас я оставлю его без ответа только из-за его извращенности и извращенности.
РЕДАКТИРОВАТЬ 1: Это было некоторое время, но я смог отыграть 2 байта с почти полным пересмотром способа, которым программа решает, печатать ли плюс или минус. Это несколько разочаровывающее возвращение для капитального ремонта, но по крайней мере это работает.
источник
мое решение JavaScript это быстро и грязно :)
выход для
Hello World\n
Источник:
источник
Я построил что-то на Java. Не рассчитать счет. Тексты с 3 или менее символами кодируются с умножением на букву, например, «A» =
++++++++[>++++++++<-]>+.
. Тексты с более чем 3 символами кодируются с вычисляемым списком, который разделен на 3 области. Первая область х раз 49, затем плюс х раз 7 и, наконец, плюс х. Например, «А» это 1 * 49 + 2 * 7 + 2Предоставленная строка "### INSERT TEXT HERE ###" становится
--->-->-->-->-->->->->->->->-->->->->->-->->->->->-->-->-->-->+[-[>+++++++<-]<+++]>---->++>++>++>+>>+>+>->+>++>+>++>->++>++>+>>->+>->+>++>++>++>+[-[>+++++++<-]<++++]>---->--->--->--->+>>-->+++>+++>++>--->+>--->+++>+>--->+>->+++>++>+++>+>--->--->--->+[-<++++]>[.>]
"Привет, мир!" становится
--->->>>>>-->-->->>>>>-->+[-[>+++++++<-]<+++]>---->>--->-->-->-->+++>+>++>-->->-->--->+>+[-[>+++++++<-]<++++]>---->->>>>+++>->+>>+++>->>->++>+[-<++++]>[.>]
источник
Python 3
По сути, это всего лишь слегка улучшенная версия ответа icedvariables. (-1 байт от Волшебника Пшеницы, -5 от FatalError, -2 от Jez)
источник
:
. Это также может быть сделано для понимания списка для сохранения байтов.print("".join(["+"*ord(i)+".[-]"for i in input()]))
join()
выражение генератора, а не понимание списка:print("".join("+"*ord(i)+".[-]"for i in input()))
print("".join("+"*ord(i)+".>"for i in input()))
(это также уменьшает счет, поскольку вы теряете 2 байта на выходе)