<?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>Блоги: заметки с тегом эр</title>
<link>https://blogengine.ru/blogs/tags/er/</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>Задача «Шпионы и яд»</title>
<guid isPermaLink="false">135546</guid>
<link>https://bolknote.ru/all/zadacha-shpiony-i-yad/</link>
<pubDate>Sun, 13 Apr 2025 11:16:59 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/zadacha-shpiony-i-yad/</comments>
<description>
&lt;p&gt;&lt;a href="https://bolknote.ru/"&gt;Евгений Степанищев&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;Давно хотел проверить не забыл ли я язык «Эр» («&lt;i&gt;R&lt;/i&gt;»). В 2017-м &lt;a href="https://bolknote.ru/tags/r/"&gt;много на нём программировал&lt;/a&gt; — было интересно изучить, но с тех пор как-то и не трогал. Интересно было посмотреть что в мозге осталось, а что улетучилось за восемь лет.&lt;/p&gt;
&lt;p&gt;А тут — оказия, у Романа Парпалака в блоге появилась небольшая заметка о задаче «&lt;a href="https://parpalak.com/blog/2025/04/12/spies_at_the_round_table"&gt;Шпионы за круглым столом&lt;/a&gt;»:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;На банкете за круглым столом сидят n шпионов. Каждый шпион независимо от остальных случайным образом выбирает одного из двух соседей — левого или правого — и подсыпает яд ему в бокал. Каково математическое ожидание числа выживших шпионов?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Он там её решает аналитически, а я подумал, что это удобный случай запрограммировать что-нибудь на «Эре». Притворимся, что не верим Роману и попробуем сравнить найденное решение и эксперимент (у меня проводится сто тысяч экспериментов на каждое число шпионов за столом).&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2025.04.13@2x.webp" width="1000" height="481" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Написал сначала, разумеется, «в лоб» — цикл в цикле в цикле: для каждого числа шпионов цикл по количеству экспериментов, где каждый шпион в цикле решает кого он будет травить. Получилось медленно — «Эр» не очень быстрый язык.&lt;/p&gt;
&lt;p&gt;После чего я сделал всё более параллельно — сначала готовлю матрицу выбора, где строки — эксперименты. Каждый элемент матрицы содержит выбор — будет отравлен сосед слева или справа. Следующим шагом преобразую эту матрицу в другую, которая содержит уже позиции отравляемых за столом. Дальше в строках подсчитываются уникальные значения и получается количество отравленных. Если вычесть его из количество шпионов за столом, получится количество выживших. После этого уже совсем просто подсчитать требуемое.&lt;/p&gt;
&lt;p&gt;С матрицами получилось намного быстрее, но недостаточно. Поэтому я применил ещё и модуль &lt;tt&gt;parallel&lt;/tt&gt;, который умеет раскидывать задачи по ядрам. Там используются немного другие функции, но в остальном всё работает так же.&lt;/p&gt;
&lt;p&gt;Если кому-нибудь хочется посмотреть на синтаксис «Эра», код есть &lt;a href="https://github.com/bolknote/r-playground/blob/master/survivors.R"&gt;у меня в репозитории&lt;/a&gt;.&lt;/p&gt;
</description>
</item>

<item>
<title>Азбука Морзе на R</title>
<guid isPermaLink="false">135545</guid>
<link>https://bolknote.ru/all/azbuka-morze-na-r/</link>
<pubDate>Tue, 27 Feb 2018 21:23:03 +0500</pubDate>
<author>Евгений Степанищев</author>
<comments>https://bolknote.ru/all/azbuka-morze-na-r/</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://habrahabr.ru/post/349776/"&gt;перекрыв несколько магических методов&lt;/a&gt; у объекта в Пайтоне, смог закодировать операторами азбуку Морзе, решил сделать то же на «Эре». Душа требует веселья, а я кажется с прошлого года ничего не писал на этом языке.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2018.02.27@2x.png" width="750" height="289" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Принцип в основном тот же, что и в оригинальной статье — плюс кодирует «точку», «минус» — тире, а вся магия происходит из-за того, что между буквами кода ставится некий символ, который является экземпляром специального класса с перекрытыми операторами — унарными и бинарными.&lt;/p&gt;
&lt;p&gt;Обратите внимание, это не строка, это выражение языка «Эр», которое, будучи выполненным, выводит закодированную строку:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://bolknote.ru/pictures/2018.02.27.1@2x.png" width="680" height="39" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;У меня специальным символом, в котором хранится объект является точка. Точка не имеет никакого специального значения и является просто частью алфавита, который можно использовать в идентификаторах. В оригинальной программе используется подчёркивание, но в «Эре» его так использовать нельзя.&lt;/p&gt;
&lt;p&gt;У объекта, хранящегося в точке перекрыты унарные и бинарные плюс и минус (а так же специальный метод &lt;i&gt;show&lt;/i&gt;, чтобы вывести хвост на экран), поэтому когда мы этими операторами записываем код Морзе, например, так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class="cpp"&gt;++++-.++---.&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;На самом деле «Эр» видит код как-то так:&lt;/p&gt;
&lt;pre class="e2-text-code"&gt;&lt;code class=""&gt;+(+(+(+(-.)))) + +(-(-(-.)))&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Унарные операторы применяются к объекту, который копит в своём стеке факт применения и порядок, в котором это было сделано, потом то же делается для второго объекта и в конце применяется бинарный оператор, который выводит на экран левый аргумент и создаёт новый объект из правого.&lt;/p&gt;
&lt;p&gt;Можно было бы переливать стек левого операнда в правый, но я не стал так делать для упрощения кода.&lt;/p&gt;
&lt;p&gt;То, что получилось &lt;a href="https://github.com/bolknote/r-playground/blob/master/morse.R"&gt;лежит на гитхабе&lt;/a&gt;. Там же лежит метод &lt;i&gt;toMorseStr&lt;/i&gt;, которым можно перекодировать любую латинскую фразу в нужную последовательность.&lt;/p&gt;
</description>
</item>


</channel>
</rss>