{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом googlego",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.me\/blogs\/tags\/googlego\/",
    "feed_url": "https:\/\/blogengine.me\/blogs\/tags\/googlego\/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": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}