У меня есть программа, которая генерирует отформатированный код Brainfuck. Я запускаю свою программу
./example "S"
и вывод
+[>+
<
+++
]
>--.
который печатает S в Brainfuck.
Ваша цель - написать программу, которая принимает строку в качестве входных данных и выводит исходный код на другом языке, который печатает эту строку.
- Исходный код, выводимый вашей программой, должен быть отформатирован таким образом, чтобы он представлял строку в искусстве ASCII (напечатан горизонтально, а не вертикально).
- Исходный код не может содержать строку (однако он может содержать буквы, встречающиеся в строке, но не последовательно)
В противном случае,
- Применяются стандартные лазейки .
- Самый короткий код выигрывает.
Пожалуйста, назовите вашу заявку на том языке, на котором она написана, на языке, который она выводит, и на общем размере в байтах. Пожалуйста, включите вывод вашей программы при вводе строки UNCOPYRIGHTABLE.
Спасибо!
Ответы:
C -> Brainfuck 556 байт
Исключая ненужные пробелы. Я мог бы легко сохранить еще сотню, изменив данные шрифта
d[]
с шестнадцатеричного на строку в кавычках.При этом используется шрифт калькулятора (для низкой энтропии, только один байт на букву) и очень наивный компилятор Brainfuck, вдохновленный https://codegolf.stackexchange.com/a/35801/15599 (за исключением того, что я использую плюс вместо минуса.) Первый
for
цикл компилирует текст вa
строкуb
, а также вычисляет количество штрихов, необходимых для рисования отформатированного кода, используя 13-значное шестнадцатеричное магическое число (все символы 5-8 штрихов.)Учитывая общую длину программы и количество штрихов, рассчитывается количество символов на удар (это может быть очень мало, если символы одинаковые или в порядке возрастания, и очень большое, если символы расположены в порядке убывания).
Большая часть остальной части программы посвящена решению, нужно ли печатать пробел или один из штрихов. Если курсор находится над квадратом обводки, функция
f
вызывается с номером этого обводки в качестве аргумента. Возвращает пробел, если этот штрих не требуется для текущей буквы, или символ из программы, если он есть. Поскольку количество символов, необходимых для завершения искусства ASCII, может превышать количество символов в программе, иногда вставляется пробел, отсюда и вычислениеb[i * v/u]
.В шрифте есть четыре одиночных штриха и четыре двойных штриха, которые нумеруются следующим образом, которые присутствуют или отсутствуют, в зависимости от буквы.
Вывод
Тест на http://copy.sh/brainfuck/
азбука
DEF
GHIJK
LMNOP
QRSTU
VWXYZ
Copyable
с большинством строк с буквами в случайном порядке (не по возрастанию) размер букв намного больше, и буквы выглядят намного лучше. К сожалению, размеры файлов становятся довольно большими. Я не могу загрузить полное слово UCOPYRIGHTABLE здесь, COPYABLE - самое длинное слово, которое мне разрешено.
источник
Perl → Befunge, 868 байт
Хорошо, я получу мяч катится. Это может быть немного больше, но моя голова начинает болеть ...
Примеры:
Более короткие примеры могут быть скопированы в онлайн-переводчики, подобные этому , но, похоже, UNCOPYRIGHTABLE приводит к созданию программы, которая слишком длинна для всех онлайн-переводчиков.
Замечания:
Символ
@
в конце первой строки вывода говорит Befunge прекратить работу. Без этого программа продолжит повторять одно и то же слово навсегда.источник
C → Brainfuck, 855 байтов
Добавлено несколько новых строк для улучшения читабельности. Обратите внимание, что это происходит с ошибками строчных букв и символов. Проверьте вывод здесь .
Примеры
На терминале это выглядит намного лучше :(
И наконец,
источник