На любом языке программирования или сценариев x напишите программу, которая получает действительный исходный код brainfuck из stdin и выводит в stdout исходный код программы, написанный на языке x , который будет выводить то же самое, что и программа brainfuck.
Ваша программа должна работать для любой действительной программы brainfuck, включая пустой файл.
Ваша оценка будет равна количеству байтов вашего исходного кода плюс число байтов вашего вывода с учетом следующего ввода:
+++++ [-]
+++++ +++++ [
> +++++ ++
> ++ +++ ++++ +
> +++
<<< -
]
> ++ . H
> + . e
++ +++ ++. l
. l
+++ . o
> ++ . space
< +++++ +++ . w
----- --- . o
+++ . r
---- - - . l
----- --- . d
> + . exclamation mark
------lol; useless code :-)--------------------------[.............................................][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][][]<-<<><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><
Например, для входа [-]
, выход *p=0;
гораздо более благоприятный, чемwhile(*p) *p--;
Если вы используете символы не ASCII, количество байтов должно быть рассчитано с использованием кодировки UTF-8.
Самый низкий балл побеждает. Тем не менее, креативные решения, которые пытаются минимизировать результат, должны поощряться голосованием.
byte count of source + (byte count of output)^2
, побудит ли людей больше сосредоточиться на упрощении результатов?Ответы:
Perl - 177 (источник) + 172 (выход) = 349
Считая Шебанг как 2 байта, по одному для каждого варианта. Сначала каждая из восьми команд транслируется в диапазон
p-w
, одновременно удаляя все остальные символы. Эта строка затем кодируется по длине прогона и выводится с минимальным декодером / интерпретатором. Некоторые вещи оптимизированы: строка,><
очевидно, ничего не делает, и цикл for, который следует непосредственно за другим, может быть полностью удален, так как он никогда не будет введен.Выход для тестовой программы:
Пример прогона:
Perl - 232 (источник) + 21 (выход) = 253
Это основано на наблюдении FIQ о том, что если исходная программа не содержит оператора ввода, вывод будет статическим и, следовательно, может быть сведен к одному
print
оператору. Если вам нравится этот, обязательно дайте его ответ +1.Итак, что мы можем сделать - это передать данные
stdout
переменной,eval
код, который мы бы получили, и обернуть результат вprint
.... это не всегда работает, хотя. Всякий раз, когда переводимый код приводил бы к бесконечному циклу (например
+[.]
), это не может быть сведено к одномуprint
выражению по очевидным причинам. Поэтому вместо этого мы запускаемeval
дочерний процесс с коротким тайм-аутом, и если он не завершается в течение этого времени, мы выводим переведенную программу, как и раньше.Структурировано и прокомментировано:
Выход для примера программы:
Выход для
,[.]
:Выход за
+[.]
(через 9 секунд):источник
wv.*?(?=w)
это неправильно. Я думаю, что это только удалит код до следующего]
, но вам нужно, чтобы найти соответствующий]
; вам нужно позаботиться о вложенности ...wv[^v]*(?=w)
, которые значительно короче альтернативы.Brainfuck, 5 + 540 = 545 байт
5 байт кода, 540 из выходных данных данного тестового файла (при условии правильного подсчета из моей вставки этого кода).
Предполагая, что EOF равно 0.
источник
bfi
( github.com/susam/bfi ). Просто скомпилируйте и установите его, и запустите его так:bfi input.bf
гдеinput.bf
находится файл brainfuck для интерпретации.PHP, 553 + 27 = 580 байт
(553 байта со всеми пропущенными пробелами, т.е. символами новой строки и пробелами)
Я плохо сосуюсь в игре в гольф на PHP, поэтому этот подход может быть сильно оптимизирован. В основном я хотел показать свой подход к решению проблемы не BF.
Сообщения об ошибках должны быть отключены, иначе PHP будет вас ненавидеть. Использование: выбросить это как страницу и запустить с помощью script.php? C = CODE (если результирующий скрипт требует ввода, вы запускаете его как out.php? I = INPUT). Не забудьте URL избежать входа!
В основном это происходит так: если скрипт BF содержит «,», он в значительной степени внедряется как результирующий скрипт с прикрепленным $ b = 1; наверху. Если он НЕ содержит «,», он оптимизирует его до «echo '<BF output>'». Удобно, что тестовый скрипт в OP НЕ требует ввода. Addlashes () только для экранирования 'и \.
источник
C ++, 695 + 510 = 1205 байт
Код:
Выход:
Оригинальный код:
источник
Python - 514 + 352 = 866
Код:
Выход:
источник
И.О.
659 + 553 = 1212
Такие вещи, как
File standardInput readBufferOfLength(1)
действительно убивают количество байтов, но я не могу обойти это. Я не проводил оптимизацию для повторяющихся символов или отсутствия ввода в программе BF, но продолжу работать над этим, также работая над одним, используя возможности метапрограммирования io.тестирование
Урожайность
источник
Brainfuck , 109 + 407 = 516
Попробуйте онлайн!
Он только удаляет не BF ops и не смотрит на другие оптимизации.
источник
Луа - 328 + 2256 = 2584
(О, я только что понял, что вам нужно добавить длину результата тоже, плохой результат, похоже)
Взято из этого моего ответа.
источник
Луа - 319 + 21 = 340
Скорее всего, это самый короткий код из всех, но он не принимает ввод, поэтому он довольно обманчив. У меня есть идея для другой версии с вводом, см. Конец этого комментария.
Луа - 376 + 366 = 742
Эта версия, чтобы доказать, что Луа может сделать лучше, чем 2584: D
Обе версии добавляют в 30000 байтов данных. Моя вторая версия основана на вводе / выводе: все после «.» или ',' будет удален. Моя вторая версия не допускает бесконечных циклов ([.,], [] И т. Д.)
Моя идея состоит в том, чтобы получить:
Из вашего ввода, с дополнительным ', +.'
источник