<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0"
  xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
  xmlns:atom="http://www.w3.org/2005/Atom">

<channel>

<title>Блоги: заметки с тегом googlego</title>
<link>https://blogengine.me/blogs/tags/googlego/</link>
<description>Автоматически собираемая лента заметок, написанных в блогах на Эгее</description>
<author></author>
<language>ru</language>
<generator>Aegea 11.0 (v4079e)</generator>

<itunes:subtitle>Автоматически собираемая лента заметок, написанных в блогах на Эгее</itunes:subtitle>
<itunes:image href="" />
<itunes:explicit>no</itunes:explicit>

<item>
<title>Сжатие инструкций для CFR[]</title>
<guid isPermaLink="false">124116</guid>
<link>https://bolknote.ru/all/szhatie-instrukciy-dlya-cfr/</link>
<pubDate>Mon, 06 Nov 2023 18:43:46 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/szhatie-instrukciy-dlya-cfr/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/bolknote/png2cfr/"&gt;Выложил&lt;/a&gt; свою программу для перевода растра в инструкции для интерпретатора &lt;i&gt;CFR[]&lt;/i&gt;. Написана, к слову, на «Гоу». Что-то давно я не программировал на этом языке, вот и решил смазать свежим опытом уже начавшие ржаветь знания.&lt;/p&gt;
&lt;p&gt;Самая интересная часть там — про оптимизацию. Из-за наличия цикла для однократного повторения, в который можно что-то вкладывать, программу можно писать сильно по-разному. Можно прямолинейно — &lt;tt&gt;FFFFFFFFFFFFFF&lt;/tt&gt;, а можно упаковать в цикл — &lt;tt&gt;[F[FFF]]&lt;/tt&gt;, станет чуть короче.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2023.11.06@2x.png" width="1000" height="120" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;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&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Из-за того, что интерпретатор позволяет писать программы не более чем в 256 инструкций, инструкции приходится ужимать циклами, а чтобы не делать это вручную, хочется как-то автоматизировать.&lt;/p&gt;
&lt;p&gt;Я реализовал довольно очевидную идею — делаем две переменные, одна указывает на начало инструкций, вторая — на середину. Вырезаем подстроку между двумя этими индексами, ищем её сразу за правым индексом, если находим, заменяем на вырезанное, оборачивая в цикл и начинаем сканировать заново. Если не находим, сдвигаем сначала правый указатель к началу, повторяем поиск, потом левый к центру, повторяем поиск. Естественно по ходу надо отбрасывать куски, где не сбалансированы скобки, это совсем просто.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2023.11.06.1@2x.jpg" width="1000" height="690" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Мои рассуждения на бумаге по порядку обхода картинки&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Кроме того, у нас есть восемь вариантов обхода картинки — по двум направлениям из каждого угла, что, если нет симметрии, даёт восемь разных наборов инструкций, которые сжимаются по-разному. Я перебираю все восемь и вывожу самый короткий вариант.&lt;/p&gt;
&lt;p&gt;При этом немного смещается координаты отрисовки картинки. Её можно было бы возвращать обратно, но зачем? Интерпретатор и так рисует в центре холста, так что сдвиг — это не принципиально, только размер кодирующей последовательности увеличится.&lt;/p&gt;
</description>
</item>


</channel>
</rss>