{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом CFR[]",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.me\/blogs\/tags\/cfr\/",
    "feed_url": "https:\/\/blogengine.me\/blogs\/tags\/cfr\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/blogengine.me\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "124116",
            "url": "https:\/\/bolknote.ru\/all\/szhatie-instrukciy-dlya-cfr\/",
            "title": "Сжатие инструкций для CFR[]",
            "content_html": "<p><a href=\"https:\/\/github.com\/bolknote\/png2cfr\/\">Выложил<\/a> свою программу для перевода растра в инструкции для интерпретатора <i>CFR[]<\/i>. Написана, к слову, на «Гоу». Что-то давно я не программировал на этом языке, вот и решил смазать свежим опытом уже начавшие ржаветь знания.<\/p>\n<p>Самая интересная часть там — про оптимизацию. Из-за наличия цикла для однократного повторения, в который можно что-то вкладывать, программу можно писать сильно по-разному. Можно прямолинейно — <tt>FFFFFFFFFFFFFF<\/tt>, а можно упаковать в цикл — <tt>[F[FFF]]<\/tt>, станет чуть короче.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.11.06@2x.png\" width=\"1000\" height=\"120\" alt=\"\" \/>\n<div class=\"e2-text-caption\">RR[CF][FF][CCC]CF[F[RRR]]FCC[FF]F[FRR]FFCC[FF][CC][F[RRR]]CC[FF]FF[FRR]F[CC][CF][CCC]CF[FC]C[F[RRR]][FF]FF[CCC][FRR][FCCFF[CCC]][F[RRR]][FF]FF[FRR][FF]FFF<\/div>\n<\/div>\n<p>Из-за того, что интерпретатор позволяет писать программы не более чем в 256 инструкций, инструкции приходится ужимать циклами, а чтобы не делать это вручную, хочется как-то автоматизировать.<\/p>\n<p>Я реализовал довольно очевидную идею — делаем две переменные, одна указывает на начало инструкций, вторая — на середину. Вырезаем подстроку между двумя этими индексами, ищем её сразу за правым индексом, если находим, заменяем на вырезанное, оборачивая в цикл и начинаем сканировать заново. Если не находим, сдвигаем сначала правый указатель к началу, повторяем поиск, потом левый к центру, повторяем поиск. Естественно по ходу надо отбрасывать куски, где не сбалансированы скобки, это совсем просто.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.11.06.1@2x.jpg\" width=\"1000\" height=\"690\" alt=\"\" \/>\n<div class=\"e2-text-caption\">Мои рассуждения на бумаге по порядку обхода картинки<\/div>\n<\/div>\n<p>Кроме того, у нас есть восемь вариантов обхода картинки — по двум направлениям из каждого угла, что, если нет симметрии, даёт восемь разных наборов инструкций, которые сжимаются по-разному. Я перебираю все восемь и вывожу самый короткий вариант.<\/p>\n<p>При этом немного смещается координаты отрисовки картинки. Её можно было бы возвращать обратно, но зачем? Интерпретатор и так рисует в центре холста, так что сдвиг — это не принципиально, только размер кодирующей последовательности увеличится.<\/p>\n",
            "date_published": "2023-11-06T18:43:46+05:00",
            "date_modified": "2023-11-06T22:06:34+05:00",
            "tags": [
                "CFR[]",
                "googlego",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Mon, 06 Nov 2023 18:43:46 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "124116",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "124078",
            "url": "https:\/\/bolknote.ru\/all\/cfr\/",
            "title": "CFR[]",
            "content_html": "<p>Прикольную штуку увидел на «Хабре» — <a href=\"https:\/\/habr.com\/ru\/news\/769076\/\">минималистичный язык <i>CFR[]<\/i><\/a> для рисования картинок. Тамошнему народу не очень-то понравилось, а я люблю такое.<\/p>\n<p>Синтаксис односимволный, <tt>C<\/tt> — циклическая смена цвета (доступно семь цветов), <tt>F<\/tt> — рисование со сдвигом по текущему направлению, <tt>R<\/tt> — смена направления на 45° по часовой стрелке и пара <nobr><tt>[ ]<\/tt><\/nobr>, которая один раз повторяет вложенные инструкции.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2023.11.03.png\" width=\"2000\" height=\"480\" alt=\"\" \/>\n<div class=\"e2-text-caption\">RR[FCCF[CCC]]FFCCF[CCC][FCCFF[CCC]]FF[FRR]CCF[CCC][FCCFF[CCC]]FCCFF[CCC][FCCF[CCC]][F[RRR]][FFCCF[CCC]][FCCFF[CCC]]FCCF[CCC][FRR]CCF[CCC][FCCFF[CCC]]FCCFF[CCC][FCCF[CCC]][F[RRR]]CCF[CCC]FCCF[[CCC]FFCCF][CCC]FFCCF[CCC]FFF<\/div>\n<\/div>\n<p>Лучше всего таким способом рисовать какие-нибудь рекуррентные штуки, но мне было интересно побаловаться с растром. К сожалению, <a href=\"https:\/\/web.archive.org\/web\/20231018232054\/https:\/\/susam.net\/cfr.html\">интерпретатор<\/a> на вход берёт не более 256 инструкций, поэтому особо не разгонишься.<\/p>\n<p>Состряпал небольшую программу, которой попереводил разные картинки в инструкции <i>CFR[]<\/i>. В ограничение до обидного мало что влезает, но небольшие надписи писать можно.<\/p>\n",
            "date_published": "2023-11-03T19:09:08+05:00",
            "date_modified": "2025-08-30T15:19:09+05:00",
            "tags": [
                "CFR[]",
                "программирование"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Fri, 03 Nov 2023 19:09:08 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "124078",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}