Изобретаем язык программирования для тренировки мозгов. Или эзотерический язык программирования за 5 минут

    Изучая вики по эзотерическим языкам я наткнулся на интересный язык программирования Piet. Отличительной особенностью которого является графическое представление программы. Например, эта программа выводит «Hello World!»
    image
    И показалось мне, что данная программа похожа на QR-Code.
    image
    Только Piet использует цветовую кодировку. А QR-Code использует комбинацию расположения точек.

    «Да это же готовая программа» подумалось мне. Разбиваем поле на квадраты, так, чтобы в каждом квадрате поместилось 4 точки. Это дает нам 16 комбинаций. Огромное количество по сравнению с тем же Brainfuck!

    Раз комбинаций много, то можно не сдерживать себя в выборе команд ЯП. Далее, смотрим на PATH, и видим, что он как нельзя лучше ложится в основу нового языка. Потому как состоит из 15 команд.

    Остается только закодировать команды языка PATH комбинациями точек и немного изменить правила работы интерпретатора.

    Словарь языка.

    В скобках указан эквивалент языка PATH

    (#) — прекратить выполнение программы.

    (+) -увеличить на единицу текущую ячейку памяти.

    (-) — уменьшить на единицу текущую ячейку памяти.

    (}) — перейти к следующей ячейке памяти.

    ({) — перейти к предыдущей ячейке памяти.

    (,) — ввести символ из стандартного ввода в текущую ячейку памяти.

    (.) — напечатать символ из текущей ячейки памяти.

    (/) — поменять направление движения указателя в зависимости направления движения:
    1. вправо — начинаем идти вверх
    2. вниз — начинаем идти влево
    3. влево — начинаем идти вниз
    4. вверх — начинаем идти вправо

    (\) — поменять направление движения указателя в зависимости направления движения:
    1. вправо — начинаем идти вниз
    2. вниз — начинаем идти влево
    3. влево — начинаем идти вверх
    4. вверх — начинаем идти влево

    (^) — если текущая ячейка равна нулю начинаем идти вверх.

    (<) — если текущая ячейка равна нулю начинаем идти влево.

    (>) — если текущая ячейка равна нулю начинаем идти вправо.

    (v) — если текущая ячейка равна нулю начинаем идти вниз.

    (!) — перепрыгнуть через ячейку.

    — команда, которая ничего не делает, но хорошо заполняет пустое место.

    Программа размещается в шаблоне QR-code, который представлен на рисунке ниже.



    Здесь зеленым квадратом обозначено поле, где можно безопасно вписывать программу. Размер поля, в принципе не ограничен, но лучше использовать стандартные размеры, принятые в стандарте на QR код.
    Программа начинает выполняться с места, обозначенного красным квадратом. Оставшееся место в поле программы можно заполнить рандомно чтобы было более похоже на QR-Code.

    При запуске программы интерпретатор читает код программы начиная с верхнего левого угла и движется слева направо выполняя команды. И двигаться будет пока не встретит команду остановки.

    Название языка также составим из частей исходных технологий — QR-PATH.

    PS. В данный момент это концепт языка. Интерпретатора не существует.

    PPS. В качестве основы можно было взять Data-Matrix. Но QR-коды более узнаваемы, поэтому программа на QR-PATH будет производить более неожиданный эффект.

    Update.
    В комментариях просили написать программу, которая выводит одно и тоже как QR-PATH и как QR-code.
    Решение представлено здесь
    Здесь привожу только конечный результат. К сожалению, внедрение программы лортит данные в исходном коде.


    Update2.
    Статью заминусовало приличное количество прочитавших ее. А критических замечаний в комментариях нет. Мне вот интересно, что не понравилось минусующим? Оформление, содержание?
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 23

      +11
      Бонусные баллы за программу, которая выводит одно и то же, будучи интерпретируемой и как QR-код, и как QR-PATH :-)
        +84
        image
          +7
          /me снимает шляпу
            +3
            А что тут такого? Байты они и есть байты, что они означают зависит только от того, что мы читаем.
              +1
              Это как картины, нарисованные в пэинте. Бессмысленная работа, но впечатляет.
            +3
            Но зачем? О_о
              +8
              Картинка взята из не менее интересного обсуждения на stackowerflow:
              http://stackoverflow.com/questions/5508110/why-is-this-program-erroneously-rejected-by-three-c-compilers
                0
                либо я не правильно извлек коды цветов (gif исказил цвета оригинала, а RGB показывается не каждого цвета), либо это фейк:
                http://www.youtube.com/watch?v=Q7g87Oh3EPc

                не подскажите, где можно найти саму картинку или коды цветов?
                  +2
                  Цвета искажены (http://clip2net.com/clip/m51162/1315684410-clip-61kb.png). А цифры не все видны даже если распаковать гифку (чёртов фреймскип)
                    +2
                    Как вариант можно было сделать самому — взять заголовок от bmp файла, приписать к нему свой хелло-ворлд и сохранить как bmp:)
                      0
                      коды можете взять в любой ASCII-таблице, например здесь.

                      Мне больше другое интересно, не получается получить картинку именно в таком виде — на каждый пиксель добавляется FF байт (либо на строку пикселей, в зависимости от битности сохраняемого изображения), это видимо фича Paint.NET. А в стандартном Paint ужасно неудобная палитра
                    +8
                    Изотерическим? Изометрическим? Эзотерическим?
                      +1
                      А еще изотермическим.
                      0
                      Более ненормальное программирование трудно придумать.
                        +11
                        ну если подумать — результат любого программирования это «намагничивание в определенном порядке поверхности диска, вращающегося со скорость 7200 об. в минуту» (с)
                          +2
                          — Ты кем работаешь?
                          — Диски намагничиваю.


                          Отлично! Это способ не признаваться в том, что разбираешься в компьютерах и при этом не лгать.
                        0
                        Идея хороша, но.
                        Ввиду двумерности языка PATH будет слишком много зря потраченного места.
                        15 команд всё-таки очень много.
                        Имхо, гораздо эффективнее будет использовать брэйнфак. Его 8 команд можно кодировать всего тремя точками: либо горизонтальными, либо вертикальными, либо (почему-то мне нравится больше всего) уголками с обходом по часовой стрелке:
                        xyy
                        xxy

                        Теперь думаю, какую же более-менее полезную программу для мобилы можно изобразить в qr-коде…
                        Есть идеи?
                          0
                          > Имхо, гораздо эффективнее будет использовать брэйнфак. Его 8 команд можно кодировать всего тремя точками:
                          Квадрат 2х2 удобен тем, что он синхронизируется при чтении графической картинки (в стандарте QR-code заложена синхронизация). Кодирование уголками приведет к квадрату 2х2, т.е. к избыточности. Зато можно ввести бит четности, что бы можно было видно корректно прочитана команда или нет.

                          > Теперь думаю, какую же более-менее полезную программу для мобилы можно изобразить в qr-коде…
                          Есть идеи?


                          В qr коде можно записать до 2 килобайт информации. Можно там закодировать несложную программу на java.
                          И вообще, чем дальше, тем больше шанс, что Загрузочный лист Windows может оказаться совсем не шуткой.
                            0
                            Брэйнфак мне показался слишком банальным. Его и так поминают слишком часто, в том числе и на хабре. Да и PATH не далеко ушел от него.

                            Интересней использовать квадрат 3х3 или даже 4х4. Тогда можно закодировать гораздо более сложный язык.
                          +3
                          Мне «Hello World» на Piet почему-то напомнило инвайт на Хабр.
                            +1
                            возможно потому, что инвайт является изображением с разноцветными ячейками…
                            0
                            Статья понравилась. Решили написать программку для перевода текста в изображение. Поиграть с программкой и посмотреть что получилось можно тут.
                              0
                              Честно говоря, интересен не конечный результат, а алгоритмы, которые были использованы.
                              Опять же, если это программа кодирования текста в графику, то хотелось бы получить и обратный процесс — графику в текст.

                            Only users with full accounts can post comments. Log in, please.