?

Log in

No account? Create an account
русский брэйнфакер
 
[Most Recent Entries] [Calendar View] [Friends]

Below are the 16 most recent journal entries recorded in русский брэйнфакер's LiveJournal:

[ << Previous 20 ]
Tuesday, July 30th, 2013
12:56 pm
[gromozeka]
Saturday, December 1st, 2012
2:26 pm
[liberation012]
Функция обчисления arctgx
Начал изучать этот язык недавно, и не могу написать функцию arctgx, пользуюсь Prolog 5.2 с интерпретатором Brainfuck. Сам студент 1-го курса, опыта мало, потому обращаюсь к вам. Задали сделать функцию arctgx и сделать так что бы можно было самому вводить число x. Объясните если не составит труда, а то сам уже 4 день не могу разобраться.
Thursday, April 21st, 2011
6:49 pm
[num314]
Hello World! на брейнфаке в 97 байт
++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++. >.+++.------.--------.>+.>.

Это самый короткий(длина 111 байт) хеллоуворлд на брейнфаке, который я смог найти. Он упоминается почти в каждой статье на брейнфаке и считается оптимизированным. Почти сразу после первого знакомства с бф мне захотелось написать более короткий вариант этого кода, но тогда у меня ничего не вышло, и я подумал, что дальше оптимизировать уже некуда:) Но совсем недавно у меня появилась идея немного другого, более короткого способа получения чисел. Я попробовал, не сильно заморачиваясь с оптимизацией, написать свой вариант кода. Самый первый вариант занимал всего 114 байт, самая большая проблема была с выводом перевода строки(код 10).
Вот этот самый первый вариант:
--[+++++++>---->-->+>+>+<<<<<]>.>>---------.>--..>+.<<<----.<+++++++++++++++.>>>>.+++.<.--------.<<+.<<++++++++++.

Дальше началась оптимизация. Просто поменяв местами ячейки, в которых находились заготовленные числа, так, чтобы перемещений стало меньше получился код размером 109 байт. Потом пошли уже незначительные сокращения(на 1-2 байта). Экспериментируя, получилось довести до 97 байт. Вот этот последний на данный момент вариант:
--[+++++++<---->>-->+>+>+<<<<]<.>++++[-<++++<++>>>->--<<]>>-.>--..>+.<<<.<<-.>>+>->>.+++[.<]<<++.
В итоге, получился хеллоуворлд на 14 байт короче распространенного. И всеравно мне кажется, его можно сократить его еще на байт 10:).
P.S. Самым неприятным так и остался вывод символа с кодом 10. Так и не удалось придумать ничего для более простого его вывода. Если выводить только Hello World! без последней 10, то вариант из 88 символов:
--[+++++++<---->>-->+>+>+<<<<]<.>++++[-<++++>>->--<<]>>-.>--..>+.<<<.<<-.>>+>->>.+++[.<]
P.P.S Заранее извиняюсь, если где-то уже есть более короткий код, т.к. все исходники перерыть нереально.
Saturday, January 15th, 2011
12:39 am
[worldalexey]
IronBrainF*ck, SimpleBrainF*ck

См. проект на Codeplex с исходным кодом и бинарниками.

IronBrainFuck - реализация BrainFuck в .NET. Имеются как интерпретатор, так и JIT компилятор, оба - наследники BrainFuckMachine

Данная реализация использует UInt16[UInt16.MaxValue + 1] для представления значений, при этом лента зациклена на значениях от 0 до UInt.MaxValue.

Расширениями, не являющиеся стандартными - операции '@' и '#', где первая - ввод числа в ячейку (не символа), вторая - дебаг-вывод значения в виде [индекс=значение(символ)]. Обе операции полезны лишь для отладки, однако без них вполне можно обойтись.

На базе IronBrainFuck построен, в том числе, компилятор BrainFuckCompiler, который сохраняет IL код в сборку для выполнения (.exe файл).

SimpleBrainFuck - IDE и одновременно язык, немного упрощающий процесс написания BrainFuck программ.

С помощью IDE пишется программа на SBF, затем транслируется в BF, который удобно выполнять в интерактивной консоли.

Язык фактически выполняет макроподстановки, подробности на странице документации. В файле примеров general.sbf определены такие методы, как
  • mul, div, mod - умножение, целочисленное деление и остаток от него
  • input_digit, input_number - ввод цифры и числа, используя стандартные для BrainFuck способы (операция ',')
Арифметические методы интересны тем, что они удобны для последующего использования: достаточно сдвинуться на ячейку первого аргумента, затем передать параметры макроподстановки - относительные адреса второго значения, результата и блока временных ячеек, т.е. нет зависимости от того, где именно они находятся.

Методы ввода предлагают то, чего часто не хватает программам на BrainFuck'e: проверок на корректность ввода. Оба метода проверяют, вводились ли цифры или другие символы (+ обработка отсутствия ввода) .

Основная конструкция языка - это def:
def somemethod x y r t
    $shift @x   // переместится на @x (влево или вправо - зависит от знака @x)
    @r~x = @r - @x    // узнаём относительные адреса r и t
    @t~r = @t - @r
    $copy @r~x @t~r    // копируем x в r, используя t
    /// ...
end

def'ы могут иметь произвольный уровень вложенности и вызываются (хотя скорее подставляются) через $somemethod 1 @h 2 @w (4 аргумента, два из которых - макроподстановки).

Если кому-либо станет интересно - присоединяйтесь к проекту.
Tuesday, December 28th, 2010
2:26 pm
[diafour]
Сообщество
Привет всем, кто когда-то подписался на сообщество ru_brainfucker. Как вы помните, сообщество оказалось под натиском спамеров. Т.к. основатель d_m_ не отвечал, то мною была подана заявка в конфликтную комиссию ЖЖ, где я просил удалить бесполезные сообщения или дать мне права на удаление. Итог заявки - меня сделали основателем сообщества.

Всех с наступающим Новым годом!
Thursday, December 23rd, 2010
2:55 am
[diafour]
Brainfuck для Android
Нашлось целых 3+1 приложения для Android, которые позволяют ввести и выполнить программу на BF.

Тройка иделогически похожих друг на друга приложений написана Andrew Kallmeyer (Brainfuck [>]), PsHegger (Brainfuck BF) и gabehabe (BrainFuck [-]). Все приложения устроены довольно одинаково - есть несколько вкладок, причем в каждом приложени присутствует вкладка с полем ввода и вкладка с результатами работы программы.

[>] на моём hero выдаёт фатальную ошибку при попытке запуска любой программы. Зато есть таблица ASCII, доступная через меню. В этом приложении есть своя клавиатура для ввода команд brainfuck - очень удобно.
[-] Закладка Help очень в тему. Но вот окошко ввода, возникающее при команде , не работает,т.е. при вводе любого символа возникает снова с пустым полем ввода.
BF Самая развесистая программа из тройки. Умеет сохранять и загружать в редактор кода набранные программы. Есть конвертор hexa-ascii. Однако есть проблемы с прокруткой в поле ввода редактора кода - поле улетает вверх и возвращается, только если убрать клавиатуру.

Все перечисленные программы вылетают или виснут от бесконечного цикла. =)

В общем-то все программы обладают набором каких-то полезных особенностей, которых нет в других программах, но ни одна не справилась с задачей удобного ввода программы на brainfuck и отображения результатов работы на 100%.

Есть ещё один вариант интерпретатора - модуль для REPL. Не самый лучший вариант для редактирования и размышлений над кодом.

Вердикт таков:
Если нужно что-то написать один раз и выполнить, то лучше всего [-] или REPL module.
Если же хочется иметь под рукой несколько разных текстов программ, то BF альтернативы нет.

В целом хотелось бы удобного и неглючного ввода команд, а также всех перечисленных вкусностей в одной программе =)

Программы можно найти в андроид.маркете или здесь: http://www.androidzoom.com/android_applications/brainfuck
Sunday, November 28th, 2010
8:15 pm
[infthi]
воззвание к модераторам
Как насчёт сделать участвие в журнале модерируемым, чтобы избежать спама?
Friday, July 2nd, 2010
4:31 pm
[qwehkwerjhbgkwe]
Написал реалтаймовый интерпритатор brainfuck.
Может если кому интересно, заходите посмотреть как работает.
Вводить код можно сразу, код будет генериться "налету".
Его можно скачать для запуска локально, но скорее всего я сделаю Air версию.

Если какие пожелания есть, то тоже пишите, доработаю.
Wednesday, June 16th, 2010
2:20 pm
[tunyash_c]
еще один процедурный Brainfuck
$name(code) - задание процедуры. name - имя code - код Brainfuck
%name(par0;par1;par2;...) - вызов процедуры name - имя, в скобках - параметры, представляющие собой куски кода.
{0} {1} {2} - вставка параметра c соответствующим номером в тело процедуры. кол-во параметров неограниченно.

Именем процедуры считается любой набор символов без круглых скобок и крайних пробелов.
http://openfile.ru/620338/ - это несколько корявая среда.
Сам быдлокод  интерпретатор
Monday, November 9th, 2009
10:41 pm
[d_m_]
BF Task
Друзья!

Спешу напомнить, что данное сообщество не предполагает ограничиваться только эзотерическими языками программирования, и вообще - только программированием (см. about), в связи с чем и предлагаю задачку.

Найти как можно более длинное слово, составить как можно более длинное предложение или связный текст etc., руководствуясь следующим:
  • писать по-русски
  • использовать только 33-12=21 русскую букву. Запрещаются 12 букв, смежных с латинскими, т.е. авекмнорстух

  • Пример такого текста см. здесь.

    Победителю - приз: всеобщее уважение и почёт :)

    (особо приветствуются автоматические генераторы текстов, написанные на BF:)
    Friday, October 9th, 2009
    7:20 pm
    [tronix286]
    Стопицотый интерпритатор Brainfuck
    Всем привет. Написал just for fun еще один интерпретатор языка классического Brainfuck. Исходники на Free Pascal конечно прилагаются.
    Особенности:
    Транслятор имеет некий пре-процессор, который сперва избавляется от всех символов, которые не являются опкодами BrainFuck, затем выполняет оптимизацию:
    <<<<< = заменяется на p# (prev)
    >>>>> = заменяется на n# (next)+++++ = заменяется на i# (inc)

    ---- = заменяется на d# (dec)

    [-],[+] = заменяется на z (zero)
    [<] = заменяется на l (left)
    [>] = заменяется на r (right)
    В итоге код из 20Kb может сократится до 3-5Kb. Далее транслятор обрабатывает уже этот байт-код, повышая тем самым быстродействие.

    Присутствуют ключи:
    -c - создать на диске файл OUT.BC, содержащий в себе байт-код после пре-процессора.
    -d - запретить препроцессор и выполнять обычным транслятором (если какие-то программы зависают).

    Если используется ключ -d выполняется почти обычный интерпретатор, но все равно с предугадыванием вышеназванных комбинаций, но "на лету". Скорость выполнения немного теряется.
    Ключ -c создает в том-же каталоге файл OUT.BC, просмотрев который в каком-нибудь HEX редакторе можно увидеть, как обработал исходный код пре-процессор.

    PS: Есть бага - транслятор с препроцессором не выполняет программу hanoi.bf (входит в архив). Она виснет. Почему - хз, не смог отловить. Понял что виснет из-за преобразования символов <<<< в p#. С ключем -d работает нормально. Остальные 45 программ с препроцессором тоже работают нормально. Странный баг...
    Забрать можно тут: http://tronix286.pochta.ru/soft/brainfk.zip
    Monday, September 28th, 2009
    2:32 pm
    [realsonic]
    Как насчёт сделать участвие в журнале модерируемым, чтобы избежать спама?
    Saturday, February 7th, 2009
    4:23 am
    [slobin]
    Для тех, кто помнит, что такое Core War: оказывается, в эту игру можно играть и на Брейнфаке! ссылка

    ... Слабая, но многообещающая садистская струнка ...

    Thursday, January 22nd, 2009
    11:12 am
    [digs_]
    Object Brainfuck
    Написал еще одну модификацию для BF. Попытался ввести ООП.

    Описание
        Каждая ячейка это теперь объект. Она хранит ClassType, т.е. указатель на класс и байт данных. Изначальные команды остаются рабочими и манипулируют байтами данных как обычными ячейками.
        Всего классов 26 (по количеству букв латинского алфавита) плюс базовый безымянный класс. Класс содержит всего один метод, который может быть вызван. Описание класса производится с помощью строчной буквы латинского алфавита, за которой в фигурных скобках идет описание метода. Например:

    a{##@}

        Указание в программе прописной буквы устанавливает в текущей ячейке соответствующий ClassType. Вызов метода объекта, находящегося в текущей ячейке, осуществляется командой «^».
        Как принято в ООП здесь так же присутствует наследование. Для наследования, при объявлении класса, нужно указать класс предок между именем нового класса и фигурной скобкой. Например:

    ba{$##}

        Здесь класс b наследуется от класса a. Символ «$» это команда вызова метода предка.
        Описание классов происходит в момент выполнение программы, поэтому оно может присутствовать где угодно. Также нет никакой структуры наследования. Т.е. b можно наследовать от a, c можно наследовать от b, а a, в свою очередь наследовать от c. И даже больше: класс можно наследовать от самого себя. При этом наследование будет именно от самого себя, а не от своего предыдущего описания. Т.е. таким образом, с помощью класса можно реализовать рекурсию.
        Изначально, каждая ячейка содержит ClassType базового класса, метод которого предназначен для очистки ячейки. Все 26 классов изначально являются наследника базового класса и их методы вызывают метод базового класса.
        Есть еще две команды, которые являются нестандартными для всего ООП. Это «*» и «/». Две эти команды, соответственно увеличивают и уменьшают на единицу ClassType в текущей ячейке. Т.е., к примеру, если в ячейке располагался объект класса b, то после операции «*» в ней будет находиться объект класса c. Для операций «*» и «/» за классом z следует класс a.

    "Hello World!" на Object BF

    a{++++}b{A^^^^}c{B^B^}d{----}C^C^^^.C^---.^^-..^-.>C^.C^B^^^-.B^^^.^-.D^--.^^.>C^+.
    Немного подробнее и программа здесь:

    digs.alfaspace.net/works/bflabs/objbflabs
    Tuesday, December 2nd, 2008
    12:16 pm
    [digs_]
    Brainfuck Labs (BFLabs)
    Написал расширение для языка Brainfuck, которое ориентировано на построение лабиринтов.
    Кратко:

      Имеется двухмерное неограниченное поле, состоящее из клеток. Новая команда "#" предназначена для прогрызания прохода в этом поле на один шаг в определенном направлении. Чтобы между лежащими рядом проходами существовала стенка, один шаг равен двум клеткам.
      В BFLabs сделана двухпоточность. Т.е. на самом деле составляются две программы, которые выполняются параллельно. Команда из первого потока, команда из второго, потом опять из первого и так далее. За каждым потоком закреплен вектор, в направлении которого происходит прогрызание. Изначально для первого потока вектор (1,0), для второго (0,1).
      Помимо "#" есть еще две команды, которые управляют направлением прогрызания.

      @ разворачивает оба вектора на 90 градусов против часовой стрелки
      | команда, данная из одного потока, разворачивает вектор другого потока на 180 градусов

      Еще две команды, это фигурные скобки ("{" и "}"). Это своеобразная глобальная критическая секция. Открытая фигурная скобка заставляет остановиться другой поток и ждать, пока в текущем потоке не появится закрывающая фигурная скобка.


    Почитать немного подробнее и скачать программу можно здесь: digs.alfaspace.net/works/bflabs/doc

     
    Sunday, September 7th, 2008
    3:34 pm
    [maxim]
    Io Language CLR — Promo
    Время от времени я пишу компиляторы, интерпретаторы для .NET CLR, Например дописываю dotLISP (динамические делегаты как в DLR, макросы) или просто пишу компиляторы языков которых еще нет для CLR (например PL/1). И вот недавно меня попросили глянуть на Io Language. Цель даного поста представить вам имплементацию Ио Language Для .NET:
    Кто не знаком с Ио, могу сказать что его синтаксис очень простой и может включать в себя синтаксисы почти всех языков, что означает что на нем не только легко писать DSL, но и вообще писать на нем как на C (пример), LISP (пример) или PL/1 (пример). Это для начала, что бы вас поразить.

    Внутри Ио из себя представляет Ъ ОПП язык, прототипный (нету классов, объекты создаются клонированием). Всё объекты как в смолтолке, есть доспут ко всему коду программы как в лиспе. Но это не самое интересное, самое интересное то, что параметры передаются в методоты\функции не вычисленными, а лексически разобраными. интерпретировати или вычислять или что-то еще делать - решаете вы внутри метода, во много благодаря этому и возможно такие модификация синтаксиса. Именно это меня остановило сходу написать компилятор, компилятор пока только в процессе.

    Оригинальный проект Ио конечно большой, есть биндинги для многих вещей, включая OpenGL или Objective-C (сам язык можно считать нано-смолтолком, а сами авторы сидят на Apple), в своей реализации я только написал базовую машину и построил мост для доступа к классам и методам CLR через рефлекшин, приблизительно так как это в dotLISP.

    Для чего это все надо ? еще один задротский язык ? Прежде всего он очень выразительный и имеет определенное академическое значение, он без сомнения будет интересен тем кто увлекается Smalltalk или LISP. Во-вторых у нас в компании используется dotLISP для скрптования приложений, как на сервере так и на клиенте, а также для организации енвайорементал бутстраппинга,и многих других вещей, вплоть до замены XML. Я подумал что было бы неплохо иметь в своем арменале еще и Ио, и сразу приступил к работе. От начала скачки оригинальной виртуальной машины Ио до релиза версии для .НЕТ прошло 3 недели. Писал исключительно для себя и своих целей, но думаю что многим будет интересно иметь Ио для .НЕТ.

    Кросспост: ru_iolanguage, ru_programming, ru_brainfucker
    [ << Previous 20 ]
    About LiveJournal.com