Вызов
Напишите программу или функцию с заданной строкой, которая возвращает действительную программу Brainfuck, которая при компиляции и исполнении как Brainfuck возвращает эту строку.
Предположим, что все входы закодированы как ASCII.
Предположим, что выведенная BF-программа будет выполняться в среде с бесконечной лентой.
Предположим, что указатель начинается с ячейки 0, каждая ячейка инициализируется значением ноль.
Каждый пример ниже представляет один возможный правильный выход для данного ввода. В частности, примеры включают дополнительные символы новой строки и пробелы, чтобы помочь читабельности человека. Решения могут свободно форматировать код BF любым способом.
Лента вдвойне бесконечна.
Все ячейки, предоставленные интерпретатором, являются ровно 8-битными ячейками. Переполнение и переполнение обернуты в предсказуемое и вменяемое дело.
Примеры
Космическая строка
Учитывая ввод , ваша программа / функция может вернуть:
+++++ +++++
+++++ +++++
+++++ +++++
++ .
Восклицательный знак
Учитывая ввод !
, ваша программа / функция может вернуть:
+++++ +++++
+++++ +++++
+++++ +++++
+++
.
Две буквы
Учитывая ввод hi
, ваша программа / функция может вернуть:
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
+++++ +++++
++++
.
+
.
Это код-гольф , поэтому выигрывает код с наименьшим количеством байтов. Удачи.
Ответы:
Желе , 8 байт
Попробуйте онлайн!
Пробный прогон
Для ввода
hi
эта программа печатает(без перевода строки), который, в свою очередь, печатает
hi
.Как это устроено
источник
.>
появляется в выводе?p
) короче, чем добавление к каждому (;€
). Эти выходные программы удваивают ячейку после печати и перед переключением. Поскольку мы никогда не пересматриваем ячейку, это не влияет на вывод.Brainfuck,
5551 байтПопробуйте онлайн!
Пример вывода для
hi
(без перевода строки):объяснение
Это перемещается по ленте во время написания программы. Окружение
,[...,]
является стандартным входным контуром. Для каждого персонажа мы используем четыре ячейки:где
x
находится ячейка, в которую мы записываем ввод.Эта часть использует ячейку
a
для записи21
в ячейкуb
посредством стандартного умножения3
и7
.Теперь мы используем это
21
для записи42
вa
и63
вc
умножение на2
и3
соответственно. Затем<+<
перемещается обратно в ячейкуx
, превращаясь42
в43
(кодовая точка+
). Резюме:Теперь основной выходной цикл:
То есть при уменьшении
x
мы печатаем по одному+
каждый раз.После того, как мы закончим, мы снова используем
+
ячейку, добавляя3
к ней.
.Наконец, мы переходим к
63
, уменьшаем его до62
(>
) и выводим это тоже. Следующая итерация будет использовать эту ячейку какx
.источник
Brainfuck,
39333231 байтАлгоритм, который размещает 45 на ленте, взят из констант Эзоланга Brainfuck .
Этот ответ предполагает, что интерпретатор выходной программы имеет обернутые ограниченные ячейки; и это
,
обнуляет текущую ячейку (подразумевая, что выходная программа выполняется без ввода). Попробуйте онлайн!Для (более длительного) решения, которое работает безоговорочно, см. Мой другой ответ .
Тестовый забег
Для ввода
Code Golf
генерируется следующий вывод.Попробуйте онлайн!
Как это устроено
Мы начинаем с помещения целого числа 45 (код символа
-
) в ячейку ленты. Следующий код достигает этого.Прежде чем мы войдем в цикл, лента выглядит следующим образом.
Эти три ячейки - -2 , -1 и 0 - единственные, которые мы будем использовать в этой программе.
На первой итерации цикла самая правая ячейка, затем эта ячейка и средняя ячейка уменьшаются в два раза, оставляя следующее состояние.
В следующих 126 итерациях начальное значение
-
уменьшает среднюю ячейку,[>]<
переходит в крайнюю правую ячейку и--<--
уменьшает среднюю и правую ячейку. В результате 3 вычитается из средней ячейки (по модулю 256 ), а 2 вычитается из крайней правой ячейки.Поскольку 254 ÷ 3 (мод 256) = (254 + 256) ÷ 3 = 510 ÷ 3 = 170 и 252 ÷ 3 = 84 , крайняя правая ячейка обнуляется перед средней, оставляя следующее состояние.
Подобно первой итерации цикла, следующая итерация теперь вычитает 3 из средней ячейки и 2 из самой левой ячейки, помещая голову в крайнюю левую ячейку.
Последующие итерации, как и в 126 итерациях перед ними, вычитают 3 из самой левой ячейки и 2 из самой правой ячейки.
Поскольку 254 ÷ 3 (мод 256) = 170 и 129 ÷ 2 (мод 256) не определены, это делается 170 раз, оставляя следующее состояние.
Клетка под головой равна нулю; цикл заканчивается.
Теперь мы готовы генерировать вывод.
источник
\0
.Brainfuck,
35 1343 байтаЭтот ответ не делает никаких предположений относительно интерпретатора выходной программы. Попробуйте онлайн!
Более короткое решение (которое работает только с некоторыми переводчиками) см. В моем другом ответе .
Тестовый забег
Для ввода
Code Golf
генерируется следующий вывод.Попробуйте онлайн!
Как это устроено
Мы начинаем с помещения целого числа 43 (код символа
+
) во вторую ячейку ленты. Следующий код достигает этого.Это по существу выполняет модульное деление 2 ÷ 6 (мод 256) . Поскольку (2 + 256) ÷ 6 = 258 ÷ 6 = 43 , результат равен 43 , как и предполагалось.
Теперь мы готовы генерировать вывод.
источник
Pyth - 11 байт
Попробуйте это онлайн здесь .
источник
05AB1E,
1211 байтРазъяснения
Попробуйте онлайн
Сохранено 1 байт благодаря @Adnan
источник
'+×
вместо того, чтобыF'+}
сохранить байт.Java, 98 байт
String
s - не что иное, как неизменяемыеchar[]
s с кучей служебных методов, так что давайте использовать массив!Ungolfed:
Эквивалентная отдельная программа длиной 138 байт:
Бонус:
Это 207-байтовое приложение фактически кодирует файл как BF-программу, как сказано в заголовке.
источник
Витси,
1917 байтОбратите внимание, что этот ответ - один из немногих, которые я когда-либо использовал
I
иu
. : DПопробуйте онлайн!
источник
O , 13 байт
Объяснение:
источник
К6, 16 байт
использование
объяснение
источник
Python 3, 43 байта
Питон помещает количество плюсов, эквивалентных коду ASCII каждого символа, после чего
.>
печатает и перемещается в следующую ячейку. Мозговой фук увеличивается до правильного значения, печатает и переходит к следующей ячейке.Вывод для
hi
(с символами новой строки для ясности):Вывод этой программы:
источник
Perl, 25 байт
использование
объяснение
Использует операцию замены регулярного выражения для замены каждого символа в каждой строке, заданной на стандартном вводе, числом
+
вычисленным по порядковому значению этого символа, а затем выводом.>
для печати и перехода к следующему символу.Использует
-p
флаг perl для автоматического считывания ввода и печати результата, добавляя еще 1 к байту.источник
Java, 91 байт
Реквизит дорукайхан за то, что я его избил :)
источник
C
726460 байтБезголовая версия:
Скомпилируйте и протестируйте с:
gcc -o bfcat bfcatgolf.c && cat 1.txt | ./bfcat > o.txt && beef o.txt
Результаты
hi
- http://paste.ubuntu.com/17995958/quick brown fox jumps over the lazy dog
- http://paste.ubuntu.com/17996059/источник
c
битовая инверсияgetchar
, особенно если вы просто инвертируете инверсию снова?c = ~getchar( )
оценивается в 0 наEOF
.c = ~getchar( )
и~c++
просто короче, чем~( c = getchar( ) )
иc--
CJam, 12 байт
Преобразует каждый символ в его значение ASCII и увеличивает текущую ячейку на это число раз перед ее печатью. Поскольку у нас бесконечная лента, мы можем просто переместиться вправо после обработки каждого символа.
Попробуйте онлайн!
источник
Луа,
676661 байтПросто итерируйте по каждому символу в аргументе и выведите для каждого из них строку с
n
+
s, за.>
которойn
следует значение этого символа в таблице ASCII.Использует gmatch, как советовал @LeakyNun в комментарии, для сохранения 1 байта над решением gsub
Старое решение с использованием gsub
Старый 67
Чтобы запустить его, просто сохраните его как файл (
golf.lua
например) и запустите его с помощьюlua golf.lua "hi"
. Дляhi
, это должно вывестиисточник
attempt to index a nil value
, иf = ...
дает то же самое, иfunction f ... end
даетunexpected symbol near ':'
lua file.lua "argument"
, я обновлю пост, чтобы дать инструкции....
идентификатор с argv?...
содержит значения в таблице вarg
распакованном виде. Это означает, что он всегда будет соответствовать,arg[1]
если только вы не используете его в вызове функции в качестве последнего параметра, тогда он будет расходоваться.n=...for n:gmatch"."do print(("+"):rep(c:byte())..".>")end
для 48 байтовJ, 28 байт
Достаточно просто.
3&u:
преобразует символы в коды символов Остальное просто повторить'+'
это количество раз, затем конкатенируя.>
в конце каждой строки, и;
выравниваете результат.Некоторые результаты
источник
Пайк, 11 байт
Попробуй это здесь!
источник
На самом деле, 13 байтов
Попробуйте онлайн!
Стратегия, используемая здесь, такая же, как и во многих других решениях - для каждого символа выведите достаточно
+
s, чтобы увеличить ячейку с нулевой инициализацией до правильного порядкового номера ASCII, вывести ее с помощью.
и перейти к следующей ячейке с>
.Объяснение:
источник
Мышь-2002, 27 байт
Это работает теоретически и в соответствии с документацией языка, но эталонная реализация интерпретатора Mouse, похоже, имеет ошибку, при которой к строковому вводу добавляется a
'
, поэтому дляa
этого выводитсяКоторый в свою очередь выводит
a'
. Это может или не может быть хорошо, поэтому вот 39-байтовый, который не выводит'
когда-либо и, таким образом, вероятно, более недействительным.Который дает правильный вывод в ссылке импл. до тех пор, пока нет
'
с :)Разъяснение:
источник
Фактор, 58 байт
Работает как:
Поскольку Factor поставляется с интерпретатором Brainfuck, его легко протестировать.
bfcat.factor
bfcat-tests.factor
выход
Ура! они все проходят.
источник
Рубин,
4038 байтисточник
puts
вместоprint
, так как формат вывода не имеет значения, если он действителен brainfuck, и brainfuck не заботится о других персонажахSidef , 38 байт
Эй, такой же длины, как у Руби! только то, что Sidef не Ruby: D
Прочитайте несколько символов, затем для каждого байта сделайте это.
источник
GNU Bash,
10085 байтСпасибо @cat за то, что сэкономили мне 15 байтов!
Postramble
bash bfcat.sh <path to file containing string>
bash bfcat.sh <(echo -n '<string>')
Ungolfed
Ссылки в версии Ungolfed
Читать файл побайтно
ord
полукокса в башиспускать символ $ n раз
источник
read -rn1
избавьтесь от пробелов после;
, избавьтесь от пробелов,done <"$1"
чтобы сэкономить в общей сложности 9 байтовES6,
119115 байтf=s=>{a='';for(i in[...s]){b=s[c='charCodeAt'](i)-(s[c](i-1)|0);a+=(b>0?'+'.repeat(b):'-'.repeat(-b))+'.'}return a}
Сохранено 4 байта благодаря @Leibrug
источник
charCodeAt
некоторый var (скажемc
) и использовать его так:s[c](i)
для сокращения на 1 байт, а также для удаления некоторых символов (я нашел 3: пробел перед[...s]
, заменил логическое ИЛИ на битовую единицу и точку с запятой передreturn
).Сесос (неконкурентный)
HexDump:
Попробуйте онлайн!
ассемблер
источник
Рубин, 26 байт
+ 1 байт для параметра
p
командной строки. Например, чтобы получить код брейкфук,ABC xyz
вы можете запуститьи получить
источник
Haskell 50 байтов
источник