<?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>Блоги: заметки с тегом *fuck</title>
<link>https://blogengine.ru/blogs/tags/fuck/</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>SectorCFuck</title>
<guid isPermaLink="false">120405</guid>
<link>https://bolknote.ru/all/sectorcfuck/</link>
<pubDate>Wed, 14 Jun 2023 20:08:51 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/sectorcfuck/</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://web.archive.org/web/20230609141452/https://habr.com/ru/companies/ruvds/articles/740310/"&gt;компиляторе &lt;i&gt;SectorC&lt;/i&gt;&lt;/a&gt;, который я ковыряю вечерами из любви к ненормальному программированию. Для тех, кто успел позабыть, напомню — этот компилятор занимает один сектор (512 байт) и способен выполнять программу на подмножестве Си.&lt;/p&gt;
&lt;p&gt;Когда смотришь на код такого маленького объёма, сразу возникает вопрос — каким чудом удалось туда запихнуть грамматику языка Си, даже если какое-то подмножество? Ответ — хеширование.&lt;/p&gt;
&lt;p&gt;Автор использует реализацию функции &lt;tt&gt;atoi&lt;/tt&gt;, которая превращает любые строки в шестнадцатибитное числа:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;unsigned short sectorc_atoi(const char *s)
{
    unsigned short n = 0;
    for (;;) {
        char c = *s++;
        if (!c) break;

        n = 10 * n + (c - &amp;#039;0&amp;#039;);
    }

    return n;
}&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Все токены, которые встречаются в программе, обязательно разделяются пробелами (за исключением &lt;tt&gt;;&lt;/tt&gt;, для него есть специальная обработка). Это позволяет довольно просто парсить программу — любой токен скармливаем &lt;tt&gt;atoi&lt;/tt&gt;, получаем число и по таблице смотрим с чем имеем дело.&lt;/p&gt;
&lt;p&gt;Если в таблице число не находится, значит это переменная, её численное значение, умноженное на два, даёт двухбайтовую область памяти, где надо взять значение. Для чисел, видимо, есть какая-то отдельная логика, я не читал подробно исходник, но из моих экспериментов как будто бы следует, что числом считается всё, что не токен и не может быть именем переменной.&lt;/p&gt;
&lt;p&gt;Перед запуском программа проходит через линтер, который не является частью компилятора. Он нужен для поиска ошибок в коде и коллизий в получившихся хешированных значениях. В последнем случае линтер останавливается с ошибкой, показывая хеши каких токенов совпали между собой.&lt;/p&gt;
&lt;p&gt;Если линтер выключить, можно достигнуть интересного эффекта. Для каждого токена можно вычислить коллизию позаковыристей и написать всю программу без букв и цифр. &lt;i&gt;SectorC&lt;/i&gt; как будто бы «из коробки» предназначен для запуска обфусцированного кода.&lt;/p&gt;
&lt;p&gt;Ниже программа, выводящая «&lt;i&gt;Hello&lt;/i&gt;» (её надо запускать &lt;i&gt;без линтера&lt;/i&gt;):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="plaintext"&gt;&amp;lt;**^ &amp;#039;)&amp;#039;|] /=]
    -_.@&amp;quot; -[ )~( /@&amp;lt; $^+&amp;gt;\() /&amp;lt;&amp;#039;
    -_.@&amp;quot; -[ /&amp;lt;&amp;#039;&amp;#039; /@&amp;lt; $^+&amp;gt;\() /&amp;lt;&amp;#039;
    -_.@&amp;quot; -[ ,[~ /@&amp;lt; $^+&amp;gt;\() /&amp;lt;&amp;#039;
    -_.@&amp;quot; -[ +^^` /@&amp;lt; $^+&amp;gt;\() /&amp;lt;&amp;#039;
    -_.@&amp;quot; -[ /&amp;lt;(&amp;#039; /@&amp;lt; $^+&amp;gt;\() /&amp;lt;&amp;#039;
,[_&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Я поленился и не стал рассчитывать разные значения для одинаковых токенов, которые упоминаются несколько раз, но можно сделать и это, тогда восстановление исходного текста будет безумно затратной задачей.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2023.06.14@2x.jpg" width="1000" height="128" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Пример запуска обфусцированной программы без линтера&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Обфусцированный таким образом листинг, запускающий файл и программу для поиска коллизий &lt;a href="https://github.com/bolknote/SectorC-obstruction"&gt;выложил на «Гитхаб»&lt;/a&gt;, можно посмотреть подробности там.&lt;/p&gt;
&lt;p&gt;Кстати, такое развлечение, когда мы не используем в программе алфавитно-цифровые символы, называется &lt;a href="https://bolknote.ru/tags/smthfuck/"&gt;ЧтоНибудь&lt;i&gt;Fuck&lt;/i&gt;&lt;/a&gt;, уж так повелось, — &lt;i&gt;FuckJS&lt;/i&gt;, &lt;i&gt;FuckPHP&lt;/i&gt; и так далее. Отсюда и название заметки.&lt;/p&gt;
</description>
</item>

<item>
<title>F★ckJS на поло</title>
<guid isPermaLink="false">136574</guid>
<link>https://bolknote.ru/all/4620/</link>
<pubDate>Tue, 08 Aug 2017 12:11:00 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/4620/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2017.08.08@2x.jpg" width="640" height="360" alt="" /&gt;
&lt;div class="e2-text-caption"&gt;Поло с программой на ДжаваСкрипте, написанной четыре года назад&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Очень в тему к &lt;a href="https://bolknote.ru/all/4619/"&gt;предыдущему посту&lt;/a&gt; на работе нашёлся мешок с поло размера &lt;i&gt;XXL&lt;/i&gt; (из-за размера и сохранился, остальные разобрали).&lt;/p&gt;
&lt;p&gt;На поло программа на ДжаваСкрипте, которую я писал к какому-то событию, должно быть готовились к какой-то конфереции — если её запустить в консоли браузера, появляется надпись «&lt;i&gt;prihodite rabotat 88002005221&lt;/i&gt;». У меня в «исходящих» сохранилось письмо от 11 марта 2013 года, где я высылаю оригинал этой программы нашему дизайнеру, четыре года уже прошло, надо же.&lt;/p&gt;
</description>
</item>

<item>
<title>Как работает Bashfuck</title>
<guid isPermaLink="false">133178</guid>
<link>https://bolknote.ru/all/4251/</link>
<pubDate>Wed, 10 Dec 2014 21:44:00 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/4251/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Думаю, по горячим следам надо описать как работают мои &lt;a href="/2014/12/09/~4248"&gt;&lt;i&gt;Bashfuck&lt;/i&gt;&lt;/a&gt; и &lt;a href="/2014/12/10/~4250"&gt;&lt;i&gt;Bashfuck-2&lt;/i&gt;&lt;/a&gt;. Пока ещё сам детально помню.&lt;/p&gt;
&lt;p&gt;Поскольку буквы и цифры использовать запрещено, все имена переменных состоят исключительно из подчёркиваний — это единственный вариант в «Баше» в таком случае. Чтобы что-то напечатать, сначала надо получить какие-то буквы.&lt;/p&gt;
&lt;p&gt;К счастью, переменная с именем, состоящим из одного подчёркивания содержит полный путь к интерпретатору, которым был запущен наш скрипт. Поскольку путь может отличаться, а название интерпретатора — нет, путь надо удалить, оставив только слово «&lt;i&gt;bash&lt;/i&gt;». Это делается в обоих случая в первой строке:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# Удаляем из переменной $_ всё до последнего слеша
__=${_##*/}&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Теперь у нас есть четыре буквы «&lt;i&gt;b&lt;/i&gt;», «&lt;i&gt;a&lt;/i&gt;», «&lt;i&gt;s&lt;/i&gt;» и «&lt;i&gt;h&lt;/i&gt;». Из имеющегося надо как-то получить недостающее. Тут нам помогает следующий факт: можно запускать что угодно, по имени, которое содержится в переменной.&lt;/p&gt;
&lt;p&gt;Далее оба скрипта пытаются составить в одной из переменных команду «&lt;i&gt;base64&lt;/i&gt;», чтобы передав ей на вход строку, получить недостающие буквы. В самом деле, передавая на вход разные строки и пропуская их по нескольку раз через «&lt;i&gt;base64&lt;/i&gt;» команду, можно получить весь английский алфавит:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# bash тут — строка, которую мы уже получили
$ base64&amp;lt;&amp;lt;&amp;lt;bash
YmFzaAo=
$ base64&amp;lt;&amp;lt;&amp;lt;bash | base64
WW1GemFBbz0K&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Например, в полученных строках некоторые буквы нам вполне интересны: «&lt;i&gt;Hell&lt;b&gt;o&lt;/b&gt; &lt;b&gt;wo&lt;/b&gt;rld&lt;/i&gt;». Но как получить слово &lt;i&gt;base64&lt;/i&gt;? С цифрами проще: имея строки разной длины и арифметические операции можно получить нужное:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# Переменная __ содержит слово bash
__=bash
# Очень просто получить цифру четыре: надо измерить длину строки:
$ echo ${#__}
4
# Любым похожим путём получаем двойку, прибавляем к четвёртке и у нас есть 6
$ echo $((${#__} + 2))
6&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Поскольку типы переменных «Баш» не особо-то различает, склеить всё остальное труда не представляет. Но нужно ещё откуда-то получить букву «&lt;i&gt;e&lt;/i&gt;». Тут дорожки этих двух скриптов расходятся. Первый работает так: составляя из имеющихся букв команду «&lt;i&gt;hash&lt;/i&gt;», запускает её и получает следующую строку:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;$ hash
hash: hash table empty&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Второй действует интереснее. Есть такой синтаксис для команд, которые на вход принимают только файл: можно передать вывод другой команды особым образом и интерпретатор подставит в параметр специальное имя псевдофайла из которого можно прочитать упомянутый вывод.&lt;/p&gt;
&lt;p&gt;Если использовать такой синтаксис с любой командой, которая принимает не файл, а строку, то строку и получим (цифры будут меняться от запуска к запуску, остальная строка останется неизменной):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# пробуем вывести на печать
$ echo &amp;lt;(:)
/dev/fd/63&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Нам это значение нужно в переменной и с присвоением этот трюк тоже сработет.&lt;/p&gt;
&lt;p&gt;В том и другом скрипте нужную букву мы получили и можем собрать нужное имя без проблем. Для этого воспользуемся следующей конструкцией, которая позволяет выбирать подстроки из переменных:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# переменная теперь содержит что-то вроде /dev/fd/xx
___=&amp;lt;(:)
# выбираем третий символ (отсчёт с нуля):
echo ${___:2:1}&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Вместо двойки и единицы можно подставить переменные, которые эти числа содержат, либо вычислить их по ходу дела. Во втором примере применяется ещё и другая техника —  поскольку некоторые числа из подручных переменных вычислять сложно, я срезаю некоторое количество букв слева и справа, чтобы добраться до нужной буквы:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;# переменная, где нужная мне буква в середине слова
v=sed
# так можно срезать последнюю букву
echo ${v%?}
# а так —  первую
echo ${v#?}&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;По большому счёту, это всё. Используется ещё несколько приёмов, но для понимания происходящего осталось пояснить только ещё одну вещь. В четвёртом «Баше», который требуется для работы обоих скриптов, есть ещё такой специальный синтаксис, который позволяет менять регистр букв. Это позвояет не заморачиваться с тем, в каком регистре получаются отдельные буквы и првести всё к нужному ближе к концу:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;v=&amp;#039;heLLo WORld&amp;#039;
# всё к нижнему (будет hello world)
echo ${v,,}
# только первую —  к верхнему (будет HeLLo WORld)
echo ${v^}&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Собранную строку осталось вывести на экран. Для этого в том же коде я попутно собираю из получающихся букв ещё и строку «&lt;i&gt;cat&lt;/i&gt;» (что на одну букву меньше «&lt;i&gt;echo&lt;/i&gt;», кода получается меньше) и с помощью этой команды получаю нужный результат:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;c=cat
v=&amp;#039;Hello world&amp;#039;
# Выведет Hello world
$c&amp;lt;&amp;lt;&amp;lt;$v&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Можно, кстати, попробовать ещё задействовать функции, благо их объявление алфавитных символов не требует, а их имена могут подержать не только подчёркивания (но и, например, «собаку», что даёт бо́льшую свободу), но третий вариант я уже делать не буду, надоело.&lt;/p&gt;
</description>
</item>

<item>
<title>JavaScript, совмещённый с Brainf*ck: «hello friends»</title>
<guid isPermaLink="false">124867</guid>
<link>https://bolknote.ru/all/3954/</link>
<pubDate>Sun, 28 Apr 2013 16:44:00 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/3954/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Помните моё поздравление с &lt;a href="/2012/01/05/~3535/"&gt;Новым годом&lt;/a&gt;, написанное на запутанном Джаваскрипте? Такой же принцип я использовал для привлекающего внимание &lt;a href="https://twitter.com/bolknote/status/315333227718012929/photo/1"&gt;баннера нашей компании&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Я давно уже заметил, что это сильно похоже на язык &lt;a href="http://ru.wikipedia.org/wiki/Brainfuck"&gt;Брейнфак&lt;/a&gt;. Давно хотелось попробовать смешать эти два языка в одном листинге. Со стороны Брейнфака всё довольно гладко — надо только балансировать квадратные скобки (но Джаваскрипт требует того же) и избегать вечных циклов (тут уже сложнее, так как листинги на запутанном Джаваскрипте часто требуют пустых циклов), незнакомые символы этот язык пропускает. В Джаваскрипте синтаксис построже, там нужно было помучаться больше.&lt;/p&gt;
&lt;p&gt;Получилась следующая программа (используется расцветка для Брейнфака, чтобы было видно какие части программы он пропускает):&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="hljs lang-plaintext"&gt;($=!{}&lt;span class="hljs-meta"&gt;[&lt;/span&gt;/&lt;span class="hljs-meta"&gt;-&lt;/span&gt;/&lt;span class="hljs-meta"&gt;+&lt;/span&gt;/\&lt;span class="hljs-meta"&gt;+&lt;/span&gt;@&lt;span class="hljs-meta"&gt;+&lt;/span&gt;@&lt;span class="hljs-meta"&gt;+&lt;/span&gt;!&lt;span class="hljs-meta"&gt;+&lt;/span&gt;/)&lt;span class="hljs-meta"&gt;-&lt;/span&gt;!{$:/&lt;span class="hljs-meta"&gt;&amp;gt;&lt;/span&gt;/&lt;span class="hljs-meta"&gt;+&lt;/span&gt;/!&lt;span class="hljs-meta"&gt;&amp;gt;&lt;/span&gt;/&lt;span class="hljs-meta"&gt;+&lt;/span&gt;/&lt;span class="hljs-meta"&gt;&amp;lt;&lt;/span&gt;/}&lt;span class="hljs-meta"&gt;+&lt;/span&gt;
(_=!&lt;span class="hljs-meta"&gt;-&lt;/span&gt;{}&lt;span class="hljs-meta"&gt;-&lt;/span&gt;$&lt;span class="hljs-meta"&gt;+&lt;/span&gt;/&lt;span class="hljs-meta"&gt;&amp;gt;&lt;/span&gt;/)&lt;span class="hljs-meta"&gt;-&lt;/span&gt;~(/&lt;span class="hljs-meta"&gt;&amp;lt;&lt;/span&gt;/)&lt;span class="hljs-meta"&gt;+&lt;/span&gt;
(_$=&lt;span class="hljs-meta"&gt;-&lt;/span&gt;$&lt;span class="hljs-meta"&gt;-&lt;/span&gt;{}&lt;span class="hljs-meta"&gt;-&lt;/span&gt;$&lt;span class="hljs-meta"&gt;+&lt;/span&gt;/&lt;span class="hljs-meta"&gt;&amp;gt;&lt;/span&gt;/)&lt;span class="hljs-meta"&gt;[&lt;/span&gt;$$=&lt;span class="hljs-meta"&gt;-&lt;/span&gt;(~&lt;span class="hljs-meta"&gt;-&lt;/span&gt;~$&lt;span class="hljs-meta"&gt;+&lt;/span&gt;~&lt;span class="hljs-meta"&gt;-&lt;/span&gt;~$&lt;span class="hljs-meta"&gt;-&lt;/span&gt;!&lt;span class="hljs-meta"&gt;+&lt;/span&gt;{$:/!&lt;span class="hljs-meta"&gt;&amp;lt;&lt;/span&gt;/})&lt;span class="hljs-meta"&gt;+&lt;/span&gt;
_&lt;span class="hljs-meta"&gt;[&lt;/span&gt;$$&lt;span class="hljs-meta"&gt;+&lt;/span&gt;=~&lt;span class="hljs-meta"&gt;-&lt;/span&gt;~{$:/&lt;span class="hljs-meta"&gt;]&lt;/span&gt;/}&lt;span class="hljs-meta"&gt;+&lt;/span&gt;
_$&lt;span class="hljs-meta"&gt;-&lt;/span&gt;~{}&lt;span class="hljs-meta"&gt;+&lt;/span&gt;
_$&lt;span class="hljs-meta"&gt;[&lt;/span&gt;$$&lt;span class="hljs-meta"&gt;+&lt;/span&gt;~{_:&lt;span class="hljs-meta"&gt;-&lt;/span&gt;$&lt;span class="hljs-meta"&gt;&amp;gt;&lt;/span&gt;/&lt;span class="hljs-meta"&gt;]&lt;/span&gt;/}&lt;span class="hljs-meta"&gt;+&lt;/span&gt;
$&lt;span class="hljs-meta"&gt;-&lt;/span&gt;$$&lt;span class="hljs-meta"&gt;]&lt;/span&gt;&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Оба интерпретатора выполняют её с разным результатом, Брейнфак выводит «&lt;i&gt;hello&lt;/i&gt;», а Джаваскрипт — «&lt;i&gt;friends&lt;/i&gt;»:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;bolk@Bolk ~$ ./brainfuck &amp;lt;&amp;lt;&amp;lt;&amp;#039;($=!{}+[/-/]+/\+@+@+!+/)[-!{$:/&amp;gt;/+/!+&amp;gt;/+/&amp;lt;&amp;lt;/}]+(_=!-{}+[-$]+/&amp;gt;/)[-~(/&amp;gt;[-&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;[-&amp;lt;+&amp;lt;+&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;/)]+(_$=[-$][-{}]+[-$]+/&amp;gt;&amp;gt;/)
[$$=-(~-~$+~-~$-!+{$:/!+&amp;gt;+&amp;gt;+&amp;gt;+&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;/})]+_[$$+=~-~{$:/[-&amp;gt;++++&amp;gt;+&amp;gt;++++++++&amp;gt;++++++++&amp;gt;+++++++++++[&amp;lt;]]/}]+_$[-~{}]+_$[$$+~{_:-$&amp;gt;/[.&amp;gt;]/}]+$[-+-$$]&amp;#039;

hello

bolk@Bolk ~$ v8 -e &amp;#039;print(($=!{}+[/-/]+/+@+@+!+/)[-!{$:/&amp;gt;/+/!+&amp;gt;/+/&amp;lt;&amp;lt;/}]+(_=!-{}+[-$]+/&amp;gt;/)[-~(/&amp;gt;[-&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;]&amp;gt;&amp;gt;[-&amp;lt;+&amp;lt;+&amp;gt;&amp;gt;]&amp;lt;&amp;lt;&amp;lt;/)]+(_$=[-$][-{}]+[-$]+/&amp;gt;&amp;gt;/)
[$$=-(~-~$+~-~$-!+{$:/!+&amp;gt;+&amp;gt;+&amp;gt;+&amp;gt;+&amp;gt;+&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;/})]+_[$$+=~-~{$:/[-&amp;gt;++++&amp;gt;+&amp;gt;++++++++&amp;gt;++++++++&amp;gt;+++++++++++[&amp;lt;]]/}]+_$[-~{}]+_$[$$+~{_:-$&amp;gt;/[.&amp;gt;]/}]+$[-+-$$])&amp;#039;

friends&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Повозиться пришлось прилично, если честно, некоторые конструкции ДжЭс делит с Брейфаком (большинство квадратных скобок), а кое-где торчат чистые инструкции Брейнфака, засунутые в те места программы, где они не могут помешать своему соседу. Пустые циклы, которые образуются квадратными скобками я старался сводить к операции зануления ячейки („[-]“), сильно мешали плюсы, используемые в Джаваскрипте для объединения букв — они увеличивали содержимое ячейки в Брейнфаке на единицу, это приходилось учитывать.&lt;/p&gt;
&lt;p&gt;Слово «&lt;i&gt;friends&lt;/i&gt;» я выбрал потому что его легко записать:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="javascript"&gt;&amp;quot;false&amp;quot;[0]+&amp;quot;true&amp;quot;[1]+&amp;quot;undefined&amp;quot;[5]+&amp;quot;true&amp;quot;[3]+&amp;quot;undefined&amp;quot;[1]+&amp;quot;undefined&amp;quot;[2]+&amp;quot;false&amp;quot;[3]&lt;/code&gt;&lt;/pre&gt;&lt;/pre&gt;&lt;p&gt;Принцип я когда-то более-менее &lt;a href="/2012/01/05/~3535/#n32932"&gt;подробно разбирал&lt;/a&gt;.&lt;/p&gt;
</description>
</item>


</channel>
</rss>