M2. Brainfuck

Задача

Написать интерпретатор языка Brainfuck для памяти на n ячеек. Ячейки хранят значения типа char.

Тесты

Название программы Ввод (программа на Brainfuck) Вывод
Hello World!  
Числа Фибоначчи
Факториалы


Код на С++

Код на Ideone. Код программы нужно вводить сплошным блоком текста — без переносов строки. Зато можно осуществлять «ввод данных для программы на Brainfuck» — то, для чего нужен оператор «,». Для этого нужно символы, которые «хотим ввести в программу на Brainfuck», нужно ввести в окно ввода Ideone на новой строке после кода программы.

Ещё один вариант кода. В нём можно вводить код программы на разных строках. Различие минимальное:

Пройдя по второй ссылке можно посмотреть на один из вариантов вычисления чисел Фибоначчи на Brainfuck. Вычисляются числа, не превосходящие 100.  Программа работает 🙂

 

Код на С

Ideone (C)

 

Код на Java

Ideone (Java)

Related Images:

7 thoughts on “M2. Brainfuck

  1. — А где текст задачи?
    — Зачем смешали string и c-string (nts) в одной программе? Зачем это число n в начале?
    — Ожидается два кода. Один со string, другой — без.
    — «Решение. В лоб.» Все решения являются решением «в лоб». Только лбы разные 🙂
    — Для тестов и демонстрации нужен хотя бы «Hello, world!» в отчёте. На ideon он есть, а здесь нету.
    Здесь, например, есть несколько интересных программ на этом языке. Например его интерпретатор написанный на нём же. Или написанный на нём транслятор с него же на Си. Числа Фибоначчи есть. Подберите или адаптируйте что-то эффектное.

    • «замечания к решению на С++»:
      число n задаёт длину ленты, это пользовательский параметр
      решение — С++ string
      тесты и демонстрация добавлены были ещё в прошлом году
      Нужно добавить решение на С или текущих исправлений достаточно?

  2. — Я понимаю, что n длина ленты. Зачем программисту её задавать? Вы же не задаёте заранее объём памяти перед запуском своей программы? Просто используете память по мере необходимости.
    — Нет смысла писать решение для char * с точки зрения оценки прошлого семестра. Смысл есть только с точки зрения публикации исчерпывающего решения.

    • В формулировке задачи было сказано: «Написать интерпретатор языка Brainfuck для памяти на n ячеек», поэтому я решил, что n — это пользовательский параметр. Но я согласен, что егоможно не задавать, поэтому зафиксировал память на 10000 ячеек. Этого должно хватить для указанных в тесте и доступных по Вашей ссылке программ.

      Реализация на С также добавлена. Пришлось ввести вспомогательную функцию, позволяющую считывать строки неизвестной заранее длины. Она динамически наращивает память под считываемую строку и накапливает её длину.

  3. Вы абсолютно правы. Я не прочитал условие, которое сам и написал. Виноват.
    Что касается Ваших исправлений, то они не соответствуют тому, что я предлагал.
    Я предлагал сделать так, чтобы лента всегда была достаточного размера. Если делать фиксированный размер (пусть и достаточно большой), то уж лучше оставить как было.

    • Поскольку я немного запутался, то сделал, как было.

      Функция parseInt в Java-версии и дополнительное считывание символа в С-версии нужны, чтобы «съесть» перевод на новую строку после числа.

Добавить комментарий