Напишите самую короткую программу на вашем любимом языке, чтобы интерпретировать программу « бред ». Программа читается из файла. Вход и выход являются стандартным входом и стандартным выходом.
- Размер ячейки: 8 бит без знака. Переполнение не определено.
- Размер массива: 30000 байт (не обведено)
- Плохие команды не являются частью ввода
Комментарии начинаются с символа # и продолжаются до конца строкикомментировать все не+-.,[]<>
- нет символа EOF
Очень хороший тест можно найти здесь . Он читает число, а затем печатает простые числа до этого числа. Чтобы предотвратить гниение ссылок, вот копия кода:
compute prime numbers
to use type the max number then push Alt 1 0
===================================================================
======================== OUTPUT STRING ============================
===================================================================
>++++++++[<++++++++>-]<++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++++.[-]
>++++++++++[<++++++++++>-]<+++++.[-]
>++++++++++[<++++++++++>-]<+++++++++.[-]
>++++++++++[<++++++++++>-]<+.[-]
>++++++++++[<++++++++++>-]<+++++++++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
>++++++++++[<++++++++++>-]<+++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
>++++++++++[<++++++++++>-]<++++++++++++++++.[-]
>++++++++++[<++++++++++>-]<+++++++++++.[-]
>+++++++[<+++++++>-]<+++++++++.[-]
>+++++[<+++++>-]<+++++++.[-]
===================================================================
======================== INPUT NUMBER ============================
===================================================================
+ cont=1
[
- cont=0
>,
======SUB10======
----------
[ not 10
<+> cont=1
=====SUB38======
----------
----------
----------
--------
>
=====MUL10=======
[>+>+<<-]>>[<<+>>-]< dup
>>>+++++++++
[
<<<
[>+>+<<-]>>[<<+>>-]< dup
[<<+>>-]
>>-
]
<<<[-]<
======RMOVE1======
<
[>+<-]
]
<
]
>>[<<+>>-]<<
===================================================================
======================= PROCESS NUMBER ===========================
===================================================================
==== ==== ==== ====
numd numu teid teiu
==== ==== ==== ====
>+<-
[
>+
======DUP======
[>+>+<<-]>>[<<+>>-]<
>+<--
>>>>>>>>+<<<<<<<< isprime=1
[
>+
<-
=====DUP3=====
<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<<<
=====DUP2=====
>[>>+>+<<<-]>>>[<<<+>>>-]<<< <
>>>
====DIVIDES=======
[>+>+<<-]>>[<<+>>-]< DUP i=div
<<
[
>>>>>+ bool=1
<<<
[>+>+<<-]>>[<<+>>-]< DUP
[>>[-]<<-] IF i THEN bool=0
>>
[ IF i=0
<<<<
[>+>+<<-]>>[<<+>>-]< i=div
>>>
- bool=0
]
<<<
- DEC i
<<
-
]
+>>[<<[-]>>-]<<
>[-]< CLR div
=====END DIVIDES====
[>>>>>>[-]<<<<<<-] if divides then isprime=0
<<
>>[-]>[-]<<<
]
>>>>>>>>
[
-
<<<<<<<[-]<<
[>>+>+<<<-]>>>[<<<+>>>-]<<<
>>
===================================================================
======================== OUTPUT NUMBER ===========================
===================================================================
[>+<-]>
[
======DUP======
[>+>+<<-]>>[<<+>>-]<
======MOD10====
>+++++++++<
[
>>>+<< bool= 1
[>+>[-]<<-] bool= ten==0
>[<+>-] ten = tmp
>[<<++++++++++>>-] if ten=0 ten=10
<<- dec ten
<- dec num
]
+++++++++ num=9
>[<->-]< dec num by ten
=======RROT======
[>+<-]
< [>+<-]
< [>+<-]
>>>[<<<+>>>-]
<
=======DIV10========
>+++++++++<
[
>>>+<< bool= 1
[>+>[-]<<-] bool= ten==0
>[<+>-] ten = tmp
>[<<++++++++++>>>+<-] if ten=0 ten=10 inc div
<<- dec ten
<- dec num
]
>>>>[<<<<+>>>>-]<<<< copy div to num
>[-]< clear ten
=======INC1=========
<+>
]
<
[
=======MOVER=========
[>+<-]
=======ADD48========
+++++++[<+++++++>-]<->
=======PUTC=======
<.[-]>
======MOVEL2========
>[<<+>>-]<
<-
]
>++++[<++++++++>-]<.[-]
===================================================================
=========================== END FOR ===============================
===================================================================
>>>>>>>
]
<<<<<<<<
>[-]<
[-]
<<-
]
======LF========
++++++++++.[-]
@
Пример выполнения:
$ python2 bf.py PRIME.BF
Primes up to: 100
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
code-golf
interpreter
brainfuck
Александр
источник
источник
,
EOF? Или что мы сами должны выбрать значение, когда примеряем,
EOF? Или EOF вообще неопределенное поведение?Ответы:
Perl, 120
138Это без проблем работает hello.bf и primes.bf:
Инициализация: таблица перевода кода операции в Perl хранится в
%c
. Читаемая форма выглядит так:Шаг 1: Зафиксировать входные данные программы
$_
и преобразовать их в код Perl, используя таблицу перевода. Комментарии автоматически удаляются (заменяютсяundef
) на этом этапе.Шаг 2: Распакуйте все
$b[$p]
вхожденияШаг 3: Запустите программу, используя
eval
.источник
qw
синтаксис Perl для%c
прямого определения - хорошо на 7 символов меньше (вы должны будете сказать,print+chr$b[$p]
иord(getc)
хотя)Python (не eval), 317 байт
источник
f(u,c,k)
while b*c[c[0]]and j<1
наwhile b*c[c[0]]*(j<1)
16 бит 8086 машинный код: 168 байт
Вот версия в кодировке base64 , преобразуйте и сохраните как «bf.com» и запустите из командной строки Windows: «bf progname»
РЕДАКТИРОВАТЬ
Вот некоторый ассемблер (стиль A86) для создания исполняемого файла (мне пришлось перепроектировать его, так как я потерял исходный код!)
источник
брейкфак ,
843691 байтРедактировать: решил вернуться к этому и нашел удивительное количество способов игры в гольф от байтов
Это принимает ввод в форме,
code!input
где!input
необязательно. Он также моделирует отрицательные ячейки без использования самих отрицательных ячеек и может хранить их до(30000-(length of code+6))/2
ячеек.Попробуйте онлайн!
источник
Ruby 1.8.7,
188185149147 символовНесколько читаемая версия:
Как вы видите, я бесстыдно украл вашу идею о переводе на основной язык, а затем использовал eval для его запуска.
источник
>0
а не проверки равенства:!=0
. В спецификациях указано unsigned, а переполнение не определено.3e4
будет также работать в противоположность30000
File.read($*.pop).bytes
->$<.bytes
должно работать тоже{?a,"foo"}
что эквивалентно{?a=>"foo"}
. И здесь тестирование показывает , что вы на самом деле можно заменитьFile.read($*.pop).bytes
с$<
без каких - либо проблем. Также встраивание всего в что-то вродеeval"a[0]..."+$<.bytes.map{?.,"putc a[i]",...}*";"
сокращает решение еще на несколько символов.Двоичное лямбда-исчисление 112
Программа показанная в шестнадцатеричном дампе ниже
ожидает, что его входные данные состоят из программы Brainfuck (для различения используются только биты 0,1,4, -. + <>] [), за которыми следует a], а затем ввод для программы Brainfuck.
Сохраните вышеуказанный шестнадцатеричный дамп с помощью xxd -r> bf.Blc
Получите переводчик blc из https://tromp.github.io/cl/cl.html
Привет, мир!
источник
Сетчатка 0.8.2 ,
386391386 байтКод содержит непечатаемые
0x00
символы NUL ( ). Это также еще не супер гольф, потому что он уже очень медленный, и если я играю в гольф больше, я не знаю, сколько времени потребуется, чтобы закончить. Появляется тайм-аут по первичной выборке.Могут быть ошибки в онлайн-переводчике или в моей программе (новые строки не отображаются в выводе?).
Принимает участие как
<code>│<input>
. Нет, это не труба (|
). Это персонаж ЮникодаU+2502
. Код также использует символы Unicodeÿ▶◀├║
. Символы Unicode используются для поддержки ввода всех символов ASCII. Следовательно, эти символы должны быть отделены от кода не-ASCII-символом.Попробуйте онлайн
Обратите внимание, что там есть завершающий перевод строки.
Краткое объяснение:
Нули
0x00
используются для ленты, которая бесконечна. Первая замена устанавливает интерпретатор в форме▶<code>│<input>├<output>║▶<tape>
, где первый▶
- указатель на код, а второй - указатель на ленту.ÿ
is0xFF
(255), который используется для транслитерации (используется для реализации+
и-
), чтобы обернуть ячейки обратно в ноль.◀
используется только для удобства чтения (если программа остановлена посередине или вы хотите увидеть ее выполнение в середине). В противном случае вы не сможете определить, в какую сторону двигался указатель.Код комментирования:
Нажмите здесь, чтобы получить код с нулями вместо нулевых байтов. Любые вхождения
$0
не должны заменяться нулями.Редактировать : теперь поддерживает пустой ввод и подавляет завершающий перевод строки.
Бесконечный вывод теперь поддерживается. (403 байта)
источник
<code>
и<tape>
рядом друг с другом (хотя это было бы больше символов), чтобы переход к интерпретатору SMBF был бы легче, если бы я когда-нибудь решил это сделать.TI-BASIC, 264 байта
Из-за ограничений в TI-BASIC, это на самом деле не подходит для этой задачи, поскольку нарушает правило 2; ОЗУ калькуляторов очень ограничено, и выполнение чего-то вроде
30000->dim(L1
(я использую L1 для стека / массива) заставит его выброситьERR:MEMORY
. Таким образом, стек / массив начинается с размера 1 и увеличивается, если указатель указывает на элемент после его конца. Это также нарушает правило 3, потому что оно уже нарушает правило 2, поэтому я могу не беспокоиться о пределе размера ячейки.Кстати, возможно, все еще можно сыграть в гольф ... Я сделал одно или два изменения с этой целью с момента первой отправки, но если приведенная ниже версия не работает, вернитесь к редактированию с 6 мая 15 года и используйте это код вместо Кроме того, поскольку в TI-BASIC ASCII действительно нет, он принимает числа любого размера (и все, что возвращает число, например, переменную или выражение) в качестве входных данных и выводит числа по очереди.
Используйте SourceCoder, чтобы встроить его в файл .8xp, затем отправьте его на свой калькулятор с помощью TI-Connect или TILP или чего-то еще, и запустите его, включив вашу программу brainfuck в двойные кавычки, за которой следует двоеточие и все, что вы назвали программой TI-BASIC. Например, если вы назвали его BrainF, вы бы запустить программу , как это:
"brainfuck goes here":prgmBRAINF
. Если у вас есть раковина на вашем известково , который перехватывает другие команды , когда он обнаруживаетprgm
маркер, однако, сделать это:"brainfuck goes here" -> press ENTER -> prgmBRAINF
.Если у вас нет способа подключить калькулятор к компьютеру, и вы хотите вместо этого напечатать его на калькуляторе (я не могу представить, почему вы хотите этого, но я отвлекся), обратите внимание, что
->
этоSTO>
кнопка над ON key,~
является отрицательным символом рядом с ENTER и заменяет все экземплярыL<number>
на соответствующий токен списка, найденный на2ND -> <number on keypad>
Благодаря Томаса- кВА (по крайней мере, я думаю , что его стек имя пользователя) помог мне оптимизировать это, особенно с
[
и]
инструкциями.источник
Ans+S
?S-sum(not(cumSum(L4(Ans)=seq(L4(X),X,Ans+1,dim(L4->S
. (a-a=0
). И, эй, не беспокойтесь о том, что вы забыли ОДИН порядок операций здесь, я видел множество людей, которые забыли порядок операций для%
(мода) в вызове.Питон
275248255Я решил попробовать.
источник
exec t
?). Если вы используете наконечник S.Mark , а также делаете весьfor
цикл в одну строку, вы можете уменьшить его до 243 символов.[]
, допустимую хотя бы тривиальную программу bf. Я предложил редактирование, которое исправляет это, но увеличивает количество символов. Чтобы еще больше уменьшить количество символов, вы можетеfrom sys import *
и использовать'i+=1,...'.split(',')
вместо['i+=1',...]
.+1
, но многие улучшения были предложены и не реализованы.Haskell,
457413 символовЭтот код «компилирует» программу BF в
IO
действие в форме,State -> IO State
в которой состояние представляет собой застежку-молнию на бесконечной строке.Печально, что мне пришлось потратить 29 символов, чтобы отключить буферизацию. Без них это работает, но вы не видите подсказки, прежде чем вводить ввод. Сам компилятор (
b
,f
иk
), всего 99 символов, среда выполнения (#
а%
) является 216. водитель ж / исходное состояние другого 32.обновление 2011-02-15: Включены предложения JB, сделано небольшое переименование и исправлены
main
источник
IO
, а аргументы от justSystem
(-19). Проблема с буферизацией также беспокоит меня, так как спецификация на самом деле не упоминает об этом, а ответ с наибольшим количеством голосов даже не выполняет ввод-вывод. Если вы должны сохранить его, вероятно,hFlush
после каждой записи оно будет короче, чем изменение режима глобальной буферизации (-34 + 15).Конвейер, 953
Это может быть самый красивый код, который вы когда-либо видели:
источник
C
284362 (из файла)Штрихи:
Скомпилировано и успешно запущено VS2008
Исходное решение не смогло распознать циклы, которые изначально были установлены на ноль. Еще есть место для гольфа. Но, наконец, решает программу Prime Number.
Ungolfed:
тесты:
Привет, мир
Rot13
источник
l
) каждый раз, когда выполняете цикл? Я думаю, что вы должны проверить текущее местоположение головы (p
).l
достиг ли нуля указатель в буфере, и прерывает его, иначе он сбрасывает поток обратно в исходный цикл[
. Это необходимо для вложенных[
циклов.break;else
наreturn;
.(c==62)?a:b
на(c-62)?b:a
.PHP 5.4,
296294273263261209191183178166 символов:Я дал ему шанс, не используя eval, но в конце концов мне пришлось его использовать
Все команды работают. Это сильно злоупотребляет переменными и выдает предупреждения. Однако, если кто-то изменит свой php.ini на предупреждения с подавлением (или отправит stderr в / dev / null), это прекрасно работает.
Подтверждение (это пример "Hello World!" Из Википедии ): http://codepad.viper-7.com/O9lYjl
Ungolfed,
367365335296267 символов:Это должно быть запущено через командную строку:
php bf.php hello.bf
источник
Windows PowerShell, 204
Довольно простое преобразование инструкций, а затем
Invoke-Expression
.История:
3e4
короче30000
.switch
.Write-Host
.источник
C, 333 символа
Это мой первый переводчик BF и первый гольф, который мне пришлось отлаживать.
Это запускает генератор простых чисел в Mac OS X / GCC, но
#include<string.h>
может потребоваться дополнительное по цене еще 19 символов, если неявное определениеstrchr
не работает на другой платформе. Также это предполагаетO_RDONLY == 0
. Кроме того,int
исключение из объявленияM
сохранения 3 символов, но это не соответствует требованиям C99. То же самое с третьим*
вb()
.Это зависит от особенностей кодирования ASCII. Все операторы Brainfuck являются дополнительными парами, разделенными расстоянием 2 в кодовом пространстве ASCII. Каждая функция в этой программе реализует пару операторов.
источник
#define
таблицы функций вместо таблицы также могло бы быть более кратким. Мне просто нравится число 333 и таблица: v).||
.CJam, 75 байтов
Попробуйте онлайн: реверсер строк , Hello World .
объяснение
Принимает код в первой строке STDIN и вводит все строки под ним.
Как насчет этого волшебного списка?
Полученный список выглядит следующим образом:
Мы генерируем фрагменты для
+
и>
из тех, для-
и<
просто путем замены левых паренов («декремент» CJam) на правые («приращение» CJam).источник
F #: 489 символов
Следующая программа не выполняет инструкции '[' / ']', но сканирует исходный код для следующего соответствующего токена. Это, конечно, делает его довольно медленным, но он все равно может найти простые числа меньше 100. Целочисленные типы F # не переполняются, а переносятся.
Вот короткая версия:
Неприятным моментом было то, что программа primes.bf захлебывается окнами новой строки. Чтобы запустить его, я должен был сохранить введенный номер в текстовом документе в формате UNIX и передать его в программу с конвейером:
Изменить: ввод Alt + 010 с последующим Enter также работает в Windows cmd.exe
Вот более длинная версия:
источник
Delphi,
397382378371366364328 символовСъешь этот Дельфи!
Здесь тот же код с отступом и комментарием:
Этот занял у меня несколько часов, так как это не тот код, который я обычно пишу, но мне нравится!
Примечание: основной тест работает, но не останавливается на 100, потому что он читает # 13 (CR) до # 10 (LF) ... другие заявки тоже страдают от этой проблемы при работе в ОС CRLF?
источник
C 260 + 23 = 283 байта
Я создал программу на C, которую можно найти здесь .
Должен быть скомпилирован с помощью
gcc -D"q(a,b)"="*c-a||(b);" -o pmmbf pmmbf.c
и может быть вызван следующим образом:pmmbf ",[.-]" 30000
при этом первый аргумент (в кавычках) содержит bf-программу для запуска, второй определяет, насколько большой должна быть лента.источник
-D"q(a,b)"="*c-a||(b);"
опции, так как это (насколько я понимаю, по крайней мере) помогает уменьшить ваш код.define
и новой строки, но я не думаю, что это действительно кошерное. Во всяком случае, с цитатами, комментариями, иgcc -D
я не вижу преимущества вообще.С 267
Запустите как ./a.out primes.bf
Безголовая версия:
источник
Python 2, 223
Я признаю, что переработал мою старую программу (но мне пришлось немного ее изменить, потому что в старой версии не было ввода, но была проверка ошибок ...).
Хорошо запускает калькулятор простых чисел.
Теперь я вижу, что у Александру есть ответ, который имеет некоторые сходства. В любом случае я выложу mny answer, потому что я думаю, что в этом есть новые идеи.
источник
C (gcc) Linux x86_64,
884 621 525 487 439 383 358354 байтаПопробуйте онлайн!
Это JIT, который компилирует код BF в машинный язык x86_64 во время выполнения. Это выполняет прямую трансляцию так часто встречающуюся последовательности , такие как
>>>
,<<<
,+++
и---
не соединилось в более быстрые инструкции.Менее гольф-версия:
источник
С
374368Читает из файла. Проходит тест PRIME.BF.
Использование: ./a.out PRIME.BF
переформатирован:
источник
Луа, 285
Несколько читаемая версия:
Работает отлично
Луа, 478, без нагрузки
Читаемая версия:
источник
Brainfuck, 948 байт
Ну, это заняло некоторое время. Я играю в брейнфукский самоинтерпретатор ... не мной.
источник
Напомним , 594 байта
Вкратце: Recall не имеет арифметических операторов в классическом смысле, он имеет только побитовые операции. Вы не можете просто «добавить один» и т. Д. Напомним, также строго на основе стека.
Пример 1. Напечатайте что-нибудь
Входные данные:
Выход:
Пример 2. Выведите квадратные числа до 100
Входные данные:
Выход:
Этот пример может занять несколько минут для выполнения и может вызвать сообщение «эта вкладка заморожена». Проигнорируйте это и подождите.
источник
OCaml (lex), 497 символов
OCamllex является частью стандартного дистрибутива OCaml.
Сохранить как b.mll и запустить с
Я не люблю синтаксический анализ вручную, поэтому я использовал предоставленный генератор лексеров. Из прочитанных токенов мы составляем функцию для всей программы brainf * ck.
источник
C # (2861 символ, ~ 84 строки)
Это не самое красивое решение проблемы, и, возможно, не все, что касается игры в гольф, поскольку я не был так озабочен длиной, как следовало бы. (Я не удалил комментарии или лишние пробелы.) Я просто хотел попробовать что-то на новом языке, чтобы посмотреть, смогу ли я. Если бы я сделал это снова, я бы отказался от использования стека для возврата из ']' и просто оглянулся назад. Запуск без аргументов командной строки запускает программу hello world, указанную в описании проблемы. Он принимает один аргумент командной строки, имя файла программы для запуска.
Изменить: Удалены неиспользованные ссылки.
источник
C (gcc) ,
273268 байтПопробуйте онлайн!
-5 благодаря потолку
Принимает ввод от стандартного ввода.
Это немного зависит от окружающей среды, но довольно последовательно. Это эффективное решение для c. Он записывает соответствующую C-программу в файл wc, компилирует ее и запускает как нужный исполняемый файл. Таким образом, в качестве бонусного эффекта это на самом деле компилирует код bf и оставляет
a.out
для него двоичный код. Обратите внимание, что в зависимости от системы вам может потребоваться изменить последнюю строку. В частности, большинство компиляторов Windows c называют исполняемый файл по умолчанию «a.exe». К счастью, насколько я могу судить, все они имеют одинаковую длину, поэтому количество пользователей одинаково. (хотя, если вы не определили cc, вам может понадобиться добавить букву, такую как gcc, в команду компиляции, добавив 1 байт).Я знаю, что этот поток немного староват, но я еще не видел этот стиль C-решения, поэтому я решил добавить его.
источник
[РЕДАКТИРОВАТЬ]
C ++ 11, 355, читает из файла:
Контрольная работа
http://ideone.com/b7vO4
[СТАРАЯ ВЕРСИЯ]
C ++ 11, 391, чтобы увидеть работает: http://ideone.com/yZHVv
источник