{
    "version": "https:\/\/jsonfeed.org\/version\/1.1",
    "title": "Блоги: заметки с тегом эр",
    "_rss_description": "Автоматически собираемая лента заметок, написанных в блогах на Эгее",
    "_rss_language": "ru",
    "_itunes_email": "",
    "_itunes_categories_xml": "",
    "_itunes_image": false,
    "_itunes_explicit": "no",
    "home_page_url": "https:\/\/blogengine.ru\/blogs\/tags\/er\/",
    "feed_url": "https:\/\/blogengine.ru\/blogs\/tags\/er\/json\/",
    "icon": false,
    "authors": [
        {
            "name": "Илья Бирман",
            "url": "https:\/\/blogengine.ru\/blogs\/",
            "avatar": false
        }
    ],
    "items": [
        {
            "id": "135546",
            "url": "https:\/\/bolknote.ru\/all\/zadacha-shpiony-i-yad\/",
            "title": "Задача «Шпионы и яд»",
            "content_html": "<p>Давно хотел проверить не забыл ли я язык «Эр» («<i>R<\/i>»). В 2017-м <a href=\"https:\/\/bolknote.ru\/tags\/r\/\">много на нём программировал<\/a> — было интересно изучить, но с тех пор как-то и не трогал. Интересно было посмотреть что в мозге осталось, а что улетучилось за восемь лет.<\/p>\n<p>А тут — оказия, у Романа Парпалака в блоге появилась небольшая заметка о задаче «<a href=\"https:\/\/parpalak.com\/blog\/2025\/04\/12\/spies_at_the_round_table\">Шпионы за круглым столом<\/a>»:<\/p>\n<blockquote>\n<p>На банкете за круглым столом сидят n шпионов. Каждый шпион независимо от остальных случайным образом выбирает одного из двух соседей — левого или правого — и подсыпает яд ему в бокал. Каково математическое ожидание числа выживших шпионов?<\/p>\n<\/blockquote>\n<p>Он там её решает аналитически, а я подумал, что это удобный случай запрограммировать что-нибудь на «Эре». Притворимся, что не верим Роману и попробуем сравнить найденное решение и эксперимент (у меня проводится сто тысяч экспериментов на каждое число шпионов за столом).<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2025.04.13@2x.webp\" width=\"1000\" height=\"481\" alt=\"\" \/>\n<\/div>\n<p>Написал сначала, разумеется, «в лоб» — цикл в цикле в цикле: для каждого числа шпионов цикл по количеству экспериментов, где каждый шпион в цикле решает кого он будет травить. Получилось медленно — «Эр» не очень быстрый язык.<\/p>\n<p>После чего я сделал всё более параллельно — сначала готовлю матрицу выбора, где строки — эксперименты. Каждый элемент матрицы содержит выбор — будет отравлен сосед слева или справа. Следующим шагом преобразую эту матрицу в другую, которая содержит уже позиции отравляемых за столом. Дальше в строках подсчитываются уникальные значения и получается количество отравленных. Если вычесть его из количество шпионов за столом, получится количество выживших. После этого уже совсем просто подсчитать требуемое.<\/p>\n<p>С матрицами получилось намного быстрее, но недостаточно. Поэтому я применил ещё и модуль <tt>parallel<\/tt>, который умеет раскидывать задачи по ядрам. Там используются немного другие функции, но в остальном всё работает так же.<\/p>\n<p>Если кому-нибудь хочется посмотреть на синтаксис «Эра», код есть <a href=\"https:\/\/github.com\/bolknote\/r-playground\/blob\/master\/survivors.R\">у меня в репозитории<\/a>.<\/p>\n",
            "date_published": "2025-04-13T11:16:59+05:00",
            "date_modified": "2025-04-13T11:16:01+05:00",
            "tags": [
                "программирование",
                "эр"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Sun, 13 Apr 2025 11:16:59 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "135546",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        },
        {
            "id": "135545",
            "url": "https:\/\/bolknote.ru\/all\/azbuka-morze-na-r\/",
            "title": "Азбука Морзе на R",
            "content_html": "<p>Вдохновившись статьёй с «Хабра», где автор, <a href=\"https:\/\/habrahabr.ru\/post\/349776\/\">перекрыв несколько магических методов<\/a> у объекта в Пайтоне, смог закодировать операторами азбуку Морзе, решил сделать то же на «Эре». Душа требует веселья, а я кажется с прошлого года ничего не писал на этом языке.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2018.02.27@2x.png\" width=\"750\" height=\"289\" alt=\"\" \/>\n<\/div>\n<p>Принцип в основном тот же, что и в оригинальной статье — плюс кодирует «точку», «минус» — тире, а вся магия происходит из-за того, что между буквами кода ставится некий символ, который является экземпляром специального класса с перекрытыми операторами — унарными и бинарными.<\/p>\n<p>Обратите внимание, это не строка, это выражение языка «Эр», которое, будучи выполненным, выводит закодированную строку:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/bolknote.ru\/pictures\/2018.02.27.1@2x.png\" width=\"680\" height=\"39\" alt=\"\" \/>\n<\/div>\n<p>У меня специальным символом, в котором хранится объект является точка. Точка не имеет никакого специального значения и является просто частью алфавита, который можно использовать в идентификаторах. В оригинальной программе используется подчёркивание, но в «Эре» его так использовать нельзя.<\/p>\n<p>У объекта, хранящегося в точке перекрыты унарные и бинарные плюс и минус (а так же специальный метод <i>show<\/i>, чтобы вывести хвост на экран), поэтому когда мы этими операторами записываем код Морзе, например, так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"cpp\">++++-.++---.<\/code><\/pre><p>На самом деле «Эр» видит код как-то так:<\/p>\n<pre class=\"e2-text-code\"><code class=\"\">+(+(+(+(-.)))) + +(-(-(-.)))<\/code><\/pre><p>Унарные операторы применяются к объекту, который копит в своём стеке факт применения и порядок, в котором это было сделано, потом то же делается для второго объекта и в конце применяется бинарный оператор, который выводит на экран левый аргумент и создаёт новый объект из правого.<\/p>\n<p>Можно было бы переливать стек левого операнда в правый, но я не стал так делать для упрощения кода.<\/p>\n<p>То, что получилось <a href=\"https:\/\/github.com\/bolknote\/r-playground\/blob\/master\/morse.R\">лежит на гитхабе<\/a>. Там же лежит метод <i>toMorseStr<\/i>, которым можно перекодировать любую латинскую фразу в нужную последовательность.<\/p>\n",
            "date_published": "2018-02-27T21:23:03+05:00",
            "date_modified": "2025-04-13T10:56:58+05:00",
            "tags": [
                "программирование",
                "эр"
            ],
            "author": {
                "name": "Евгений Степанищев",
                "url": "https:\/\/bolknote.ru\/",
                "avatar": "https:\/\/bolknote.ru\/pictures\/userpic\/userpic@2x.jpg?1760600028"
            },
            "_date_published_rfc2822": "Tue, 27 Feb 2018 21:23:03 +0500",
            "_rss_guid_is_permalink": "false",
            "_rss_guid": "135545",
            "_rss_enclosures": [],
            "_e2_data": {
                "is_favourite": false,
                "links_required": null,
                "og_images": []
            }
        }
    ],
    "_e2_version": 4079,
    "_e2_ua_string": "Aegea 11.0 (v4079e)"
}