<?xml version='1.0' encoding='utf-8' ?>

<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>amarao</title>
  <link>https://amarao.dreamwidth.org/</link>
  <description>amarao - Dreamwidth Studios</description>
  <lastBuildDate>Fri, 24 May 2024 07:24:37 GMT</lastBuildDate>
  <generator>LiveJournal / Dreamwidth Studios</generator>
  <lj:journal>amarao</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>https://v2.dreamwidth.org/14605094/3740325</url>
    <title>amarao</title>
    <link>https://amarao.dreamwidth.org/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/103181.html</guid>
  <pubDate>Fri, 24 May 2024 07:24:37 GMT</pubDate>
  <title>Control flow as a type</title>
  <link>https://amarao.dreamwidth.org/103181.html</link>
  <description>Чем больше я про это думаю, тем больше я его хочу.&lt;br /&gt;&lt;br /&gt;Любое замыкание (в расте) может управлять control flow приложения, но только в смысле panic!. Замыкание не может управлять другим control flow, например, break/continue/return.&lt;br /&gt;&lt;br /&gt;Это делает не экивалентным цикл итератора и применение map для того же самого итератора. Несправедливо! Если бы только компилятор понимал управление control flow и мог правильно проверить его совместимость...&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=103181&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/103181.html</comments>
  <category>rust</category>
  <category>программирование</category>
  <lj:security>public</lj:security>
  <lj:reply-count>21</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/66578.html</guid>
  <pubDate>Thu, 02 Feb 2023 12:17:03 GMT</pubDate>
  <title>Проверка на цикличность строки</title>
  <link>https://amarao.dreamwidth.org/66578.html</link>
  <description>Я тут решал какую-то задачу на литкоде, и одна из подзадач была:&lt;br /&gt;&lt;br /&gt;Дано строка str1 и строка str2. Надо проверить, что строка str2 состоит из повторов строки str1. По решению большей задачи размер str2 гарантировано является кратным размеру str1, то есть нужно просто проверить, что str1 снова и снова повторяется в str2.&lt;br /&gt;&lt;br /&gt;str1 и str2 - это [u8].&lt;br /&gt;&lt;br /&gt;Два решения:&lt;br /&gt;&lt;br /&gt;Похожий на сишный вариант с двойным циклом&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace, &amp;#39;Droid Sans Fallback&amp;#39;;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;str2.iter().enumerate().all(|(i, &amp;amp;b1)| b1 == str1[i % str2.len()]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Мой вариант:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace, &amp;#39;Droid Sans Fallback&amp;#39;;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;str2.iter().eq(str1.iter().cycle().take(str2.len()))&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;В целом, дело не в экономии байт, а в логике: первое делает какую-то низкоуровневую циклическую арифметику с неиллюзорным шансом словить панику на out of bound access, а второе конструирует инвариант: мы сравниваем итераторы по str2 и по циклическому повторению str1 с размером, равным длине str2.&lt;br /&gt;&lt;br /&gt;В целом, нам бы мог помочь Iterator.array_chunks, но он не стабильный пока что&amp;nbsp;(то есть его ещё нет в стабильном rust&apos;е).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=66578&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/66578.html</comments>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/63374.html</guid>
  <pubDate>Tue, 10 Jan 2023 20:07:34 GMT</pubDate>
  <title>magical match</title>
  <link>https://amarao.dreamwidth.org/63374.html</link>
  <description>Всё-таки match в Rust - это киллер-фича. Язык должен был называться Match.&lt;br /&gt;&lt;br /&gt;Задача на общую занимаемую площадь двумя прямоугольниками, которые могут перекрываться любым образом.&lt;br /&gt;&lt;br /&gt;https://leetcode.com/problems/rectangle-area&lt;br /&gt;&lt;br /&gt;Общее решение задачи: сумма площадей минус площадь пересечения. То есть задача на самом деле сводится к площади пересечения двух прямоугольников (я когда решал даже забыл про &amp;quot;общую площадь&amp;quot; и писал только пересечение).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Сначала компактный код решения, в котором &amp;quot;всё понятно&amp;quot;.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace, &amp;#39;Droid Sans Fallback&amp;#39;;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; std::cmp;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; Solution {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; compute_area(ax1: i32, ay1: i32, ax2: i32, ay2: i32, bx1: i32, by1: i32, bx2: i32, by2: i32) -&amp;gt; i32 {        &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; combined = (cmp::min(ay2, by2) - cmp::max(ay1, by1)) * (cmp::min(ax2, bx2) - cmp::max(ax1, bx1));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; by2 &amp;lt; ay1 || ay2 &amp;lt; by1 || bx2 &amp;lt; ax1 || ax2 &amp;lt; bx1 {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            combined = &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        (ay2-ay1) * (ax2-ax1) + (by2-by1) * (bx2-bx1) - combined&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;А вот моё решение. Оно сильно больше строк занимает, но, надеюсь, оно лучше объясняет суть решения:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace, &amp;#39;Droid Sans Fallback&amp;#39;;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;#[derive (Copy, Clone, Debug, PartialEq, Eq)]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; Color {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    Pink,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    Violet&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;#[derive (Copy, Clone, Debug)]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; State{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    No,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    One(Color),&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; //Single color zone&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    Intersection(i32)&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; // two color zone&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; State::*;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; Color::*;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; Solution {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; compute_area(ax1: i32, ay1: i32, ax2: i32, ay2: i32, bx1: i32, by1: i32, bx2: i32, by2: i32) -&amp;gt; i32 {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; intersection(a1: i32, a2: i32, b1: i32, b2: i32) -&amp;gt; i32{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; colored_dots = [(a1, Violet), (a2, Violet), (b1, Pink), (b2, Pink)];&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            colored_dots.sort_by(|a, b| a.&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0.&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;cmp(&amp;amp;b.&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; state = No;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; dot &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; colored_dots{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;match&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; (state, dot) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                    (No, (_, color))  =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                        state = One(color);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                    },&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                    (One(color), (start, new_color)) &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; color != new_color =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                        state = Intersection(start);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                    },&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                    (Intersection(start), (end, _)) =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; end-start;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                    _ =&amp;gt; {&lt;/span&gt;&lt;span style=&quot;color: #6a9955;&quot;&gt; // no intersection&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; area(x1:i32, x2:i32, y1:i32, y2:i32) -&amp;gt; i32 {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            (x2-x1)*(y2-y1)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; intersection = intersection(ax1, ax2, bx1, bx2) * intersection(ay1, ay2, by1, by2);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; rect1 = area(ax1, ax2, ay1, ay2);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; rect2 = area(bx1, bx2, by1, by2);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        rect1 + rect2 - intersection&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Когда я написал match, это было ощущение &amp;quot;хорошей презентации&amp;quot;. Вместо каких-то странных cmp/min/max, я объясняю алгоритм. &lt;br /&gt;&lt;br /&gt;Назначим обоим прямоугольникам цвет. Отсортируем точки для оси, сохраняя цвет.&lt;br /&gt;&lt;br /&gt;Идя по всем точкам: для первой точки (state=No), нам важен только цвет.&amp;nbsp;Запомним его. &lt;br /&gt;Далее, для следующей точки, если у нас цвет уже известен, и цвет поменялся, запомним начало пересечения.&lt;br /&gt;Если у нас уже есть пересечение, на следующей точке, вне зависимости от её цвета, находится конец пересечения.&lt;br /&gt;&lt;br /&gt;Если нам не удалось найти пересечения, то его нет.&lt;br /&gt;&lt;br /&gt;Вот это &amp;quot;вне зависимости от цвета&amp;quot; или &amp;quot;нам важен только цвет первой точки&amp;quot; - это же явно написано. &amp;quot;Оставшееся выбросить&amp;quot;. И&amp;nbsp;при написании мы точно знаем, что покрыли все-все варианты, потому что match исчерпывающий.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=63374&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/63374.html</comments>
  <category>rust</category>
  <category>leetcode</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/62002.html</guid>
  <pubDate>Thu, 05 Jan 2023 14:20:05 GMT</pubDate>
  <title>list inversion</title>
  <link>https://amarao.dreamwidth.org/62002.html</link>
  <description>А вот задачу инвертирования списка я считаю очень и очень полезной для понимания Rust&apos;а. Ощупывание границ того, что можно делать с deconstructed structs - это очень и очень важно.&lt;br /&gt;&lt;br /&gt;Об алгоритме.&lt;br /&gt;Есть два алгоритма:&lt;br /&gt;&lt;br /&gt;1)&amp;nbsp;Сложить всё в стек и собрать обратно список в другом порядке. При том, что алгоритмически это такой же уровень сложности, на практике - это ~30-кратное замедление из-за необходимости иметь дополнительные аллокации и копирования.&lt;br /&gt;&lt;br /&gt;2) Пройти по списку и поменять направление ссылок. Было (val1, Link_to_2) -&amp;gt;&amp;nbsp;(val2, Link_to_2) -&amp;gt; (val3, None), должно стать (val1, None) &amp;lt;- (val2, Link_to_1) &amp;lt;- (val3, Link_to_2).&lt;br /&gt;&lt;br /&gt;В условиях указателей (си-подобный язык) эта задача довольно простая, потому что мы казуально допускаем, что в какой-то момент у нас &amp;quot;всё висит&amp;quot; или есть два указателя на одно и то же место. (ну и чё такого?).&lt;br /&gt;&lt;br /&gt;В Rust же всё куда более интригующе. Список - это&lt;br /&gt;&lt;br /&gt;&lt;pre style=&quot;color: black; font-size: 13px; text-shadow: none; font-family: Menlo, Monaco, Consolas; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; line-height: 1.5; tab-size: 4; hyphens: none; padding: 0px; margin: 0px; overflow: auto; background: transparent; overflow-wrap: normal;&quot;&gt;
&amp;nbsp;&lt;/pre&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace, &amp;#39;Droid Sans Fallback&amp;#39;;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; ListNode {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; val: i32,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;  &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; next: Option&amp;lt;Box&amp;lt;ListNode&amp;gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;При этом настоящий тип списка - это &lt;br /&gt;&lt;br style=&quot;white-space: pre;&quot; /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace, &amp;#39;Droid Sans Fallback&amp;#39;;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;Option&amp;lt;Box&amp;lt;ListNode&amp;gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Проговорим это:&lt;br /&gt;&lt;br /&gt;Список это:&lt;br /&gt;&lt;br /&gt;Либо None&lt;br /&gt;Либо enum, который владеет smart pointer&apos;ом на heap, у которого тип Box, внутри которого находится структура ListNode.&lt;br /&gt;&lt;br /&gt;Структура ListNode владеет val и next, который и есть остаток списка.&lt;br /&gt;&lt;br /&gt;Чувствуете, как всё нюасно стало? Не ссылки, а есть владение. Чтобы взять содержимое val или next мы должны:&lt;br /&gt;1. Деконструировать Option.&lt;br /&gt;2. Деконструировать ListNode.&lt;br /&gt;&lt;br /&gt;После того, как мы деконструировали&amp;nbsp; или Option, или ListNode, мы больше не можем передать его куда-то дальше!&lt;br /&gt;&lt;br /&gt;То есть наивное: something.next = cur мы не можем сделать! У нас cur больше не существует.&lt;br /&gt;&lt;br /&gt;В целом, эта задача была бы не решаема, если бы не возможность &amp;quot;реконструировать&amp;quot; ListNode.&amp;nbsp;Если мы для каждого поля, из которого мы &amp;quot;взяли&amp;quot; значения положим назад значения (move, передадим владение туда), то мы получим &amp;quot;реконтструированную&amp;quot; структуру, которую мы можем передавать дальше.&lt;br /&gt;&lt;br /&gt;Деконструированный же Option невозможно реконструировать (его больше нет), вместо этого мы можем создать новый. Что такое &amp;quot;новый Option&amp;quot; и чем он отличается от старого? В целом, ни чем. Я даже не уверен, что это создаст какие-то машинные инструкции, но с точки зрения компилятора новый Some и старый Some (который мы деконструировали) - две совершенно разные вещи.&lt;br /&gt;&lt;br /&gt;Вот решение:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace, &amp;#39;Droid Sans Fallback&amp;#39;;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; reverse_list(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; head: Option&amp;lt;Box&amp;lt;ListNode&amp;gt;&amp;gt;) -&amp;gt; Option&amp;lt;Box&amp;lt;ListNode&amp;gt;&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; prev = None;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; Some(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; node) = head{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        head = node.next;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        node.next = prev;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        prev = Some(node);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    prev&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Проговариваю его по шагам:&lt;br /&gt;&lt;br /&gt;Мы деконструируем head&amp;nbsp;(если есть что деконструировать), и создаём переменную node, которая получает владением над содержимым head. Option&amp;lt;Box&amp;lt;ListNode&amp;gt;&amp;gt; &amp;rarr; Box&amp;lt;ListNode&amp;gt;.&lt;br /&gt;&lt;br /&gt;node имеет тип Box - это умный указатель на кучу, который (за вычетом кучи) просто владеет ListNode.&lt;br /&gt;&lt;br /&gt;К этому моменту у нас head не имеет значения (мы делали move из него в строчке while let).&lt;br /&gt;Мы передаём в head значение поля node.next. В этот момент node становится частично деконструированной. next из неё забрали, а value всё ещё принадлежит node.&lt;br /&gt;&lt;br /&gt;После этого мы перемещаем в node.next значение из prev. prev перестаёт иметь какое-либо значение (т.к. отдал владение значением). Зато node теперь полностью сконструирован, потому что он владеет всеми своими значениями.&lt;br /&gt;Мы создаём новое значение Some(node), забирая значение из переменной node, node перестаёт иметь какое-либо значение (т.к. отдал владение значением в Some), после чего мы отдаём владение Some(node) переменной prev.&lt;br /&gt;&lt;br /&gt;К концу цикла у нас: prev - содержит в себе Some(node), next содержит в себе либо None, либо Some со следующим элементом списка, то есть содержит остаток списка), node - не определён. Цикл заканчивается, у node заканчивается область видимости и она&amp;nbsp;(он?&amp;nbsp;оно?)&amp;nbsp;уничтожается.&amp;nbsp;Т.к. значение уже было move, то ничего делать не надо. Начинается следующая итерация.&lt;br /&gt;&lt;br /&gt;В конце мы отдаём владение prev, внутри которого владение prev.next, внутри которого prev.next.next и т.д., то есть инвертированный список.&lt;br /&gt;&lt;br /&gt;Вот, примерно так устроен процесс думания о Rust программе. Где-то тут был пропущен вопрос, как мы сквозь Box&amp;lt;ListNode&amp;gt;&amp;nbsp;получаем поля ListNode. Я тщательно этот вопрос не продумывал, но насколько я понимаю, это неявно вызываемые функции deref и deref_mut, реализованные через трейты Deref и DeferMut.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=62002&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/62002.html</comments>
  <category>rust</category>
  <category>leetcode</category>
  <lj:security>public</lj:security>
  <lj:reply-count>15</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/61604.html</guid>
  <pubDate>Sun, 01 Jan 2023 12:28:41 GMT</pubDate>
  <title>tree traversal</title>
  <link>https://amarao.dreamwidth.org/61604.html</link>
  <description>Все эти возни на leetcode привели к тому, что я нашёл минималистичную конструкцию для обхода их странного Rc RefCell дерева.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;postorder_traversal&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;root&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;dive&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;acc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;){&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;Some&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;borrow&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;dive&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;left, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;acc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;dive&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;right, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;acc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;acc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;text-decoration: underline;&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;val);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;acc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;dive&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;root&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;acc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;acc&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Ключевое открытие тут: с любым Rc надо работать только через ref/mut ref. Как только появляется владение Rc, начинаются массовые проблемы, потому что rc.as_ref() создаёт короткоживущий референс и начинаются всякие выкрутасы. А c ref всё очень хорошо. Во-первых &amp;amp;option&amp;lt;T&amp;gt; автоматом конвертируется в &amp;amp; T после `if let Some...`. После того, как у нас  появляется &amp;amp;T, простой .borrow() даёт нам правильную сущность с lifetime блока Some. Дальше мы можем обращаться к содержимому по точке, потому что там Deref реализован (насколько я понимаю, это именно Deref).&lt;br /&gt;&lt;br /&gt;Вторая штука, которую я подглядел у соседей по решению: вложенные функции очень удобны, потому что находятся внутри Solution и их легко рекурсивно вызывать без Solution:: и т.д. Вложенные функции в Rust довольно банальны и всего лишь &amp;quot;записаны локально&amp;quot;. В отличие от питона у них нет никаких признаков захвата замыкания (в питоне вложенные функции - метод создания замыканий), т.е. это исключительно кнопкодавное удобство.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=61604&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/61604.html</comments>
  <category>leetcode</category>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/61065.html</guid>
  <pubDate>Sat, 31 Dec 2022 14:30:15 GMT</pubDate>
  <title>add two numbers</title>
  <link>https://amarao.dreamwidth.org/61065.html</link>
  <description>Одна из простых задач, которые сложны в Rust&apos;е: даны числа в виде списка чисел (десятичные знаки в i32), список в обратном порядке &lt;br /&gt;(то есть head списка - самое крупное число). Надо в таком же виде (списка) вернуть сумму этих чисел.&lt;br /&gt;&lt;br /&gt;https://leetcode.com/problems/add-two-numbers&lt;br /&gt;&lt;br /&gt;Rust&apos;овые проблемы:&lt;br /&gt;&lt;br /&gt;1. Чтобы в том же порядке сложить числа, их нужно засовывать в хвост по мере складывания. В Rust значительно проще было бы делать это в обратном порядке, но увы. Засовывание в хвост чревато тем, что мы должны иметь значение головы для возврата, то есть по списку по мере построения мы двигаемся с помощью &amp;amp;mut, что приводит к тому, что нам надо менять head по &amp;amp; mut, а это означает чёрную магию mem::swap. (Магия хоть и чёрная, но safe, ура).&lt;br /&gt;&lt;br /&gt;2. Когда мы ползём по списку, мы не можем казуально заглядывать в tail полученного списка несколько раз, т.к. происходит move (передача владения), в момент заглядывания. Обходные пути через ссылки не очень работают, потому что компилятор не понимает, можно ли нам верить с сроком жизни полученных ссылок (точнее, он знает, что верить нельзя).&lt;br /&gt;&lt;br /&gt;Получается такое:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;add_two_numbers&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;l1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Box&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;ListNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;l2&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Box&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;ListNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    ) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Box&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;ListNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;carry&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;None&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;tail&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;l1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;is_some&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;l2&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;is_some&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;carry&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;n1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;next_l1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;l1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;map_or&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;None&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;), |&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;| (&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;n2&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;next_l2&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;l2&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;map_or&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;None&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;), |&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;| (&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;n&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;n1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;n2&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;carry&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;new_node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;Some&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Box&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;ListNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;None&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;%&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            }));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;std&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;mem&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;swap&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;tail&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;new_node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;tail&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;tail&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;text-decoration: underline;&quot;&gt;as_mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;carry&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;sum&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;l1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;next_l1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;l2&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;next_l2&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;result&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;трюки:&lt;br /&gt;&lt;br /&gt;1. mem::swap для того, чтобы поменять &amp;amp;mut (ведущий на None)&amp;nbsp;на новое значение.&lt;br /&gt;2. синхронное выковыривание val &amp;amp; next в одну строчку.&lt;br /&gt;&lt;br /&gt;Алготримическое:&lt;br /&gt;&lt;br /&gt;While зависит от обоих цифр и carry. Это позволяет элегантно решать проблему последнего символа.&lt;br /&gt;&lt;br /&gt;Я думал, что это у меня кривые руки и задача решается проще, но не нашёл ни одного соседнего решения, которое было бы элегантным. Пока что основное, что я видел, то предсоздание в качестве result &apos;0&apos; вместо None (что, соотственно,&amp;nbsp; IRL ломает инвариант для add_two_numbers(None, None), который должен сделать None, хотя тут задача становится мутной, потому что 1 +&amp;nbsp;None - это сколько?).&lt;br /&gt;&lt;br /&gt;За что мне при этом дали 31мс решения я не понял, кажется, это флуктуации.&lt;br /&gt;&lt;br /&gt;В рамках гольфа: Если гоняться за оптимизацией памяти, то мы можем переиспользовать полученные l1/l2 для новых нод, таким образом, экономя на аллокациях.&lt;br /&gt;&lt;br /&gt;В рамках экономии строк: если n1/n2 декларировать над циклом, то можно будет делать n1, l1 = ...., без временных переменных и let.&lt;br /&gt;&lt;br /&gt;Upd: могу, но не могу. Моя версия Rust это уже умеет, leetcode&apos;овская утверждает, что destructuring assignments are unstable.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=61065&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/61065.html</comments>
  <category>rust</category>
  <category>leetcode</category>
  <lj:security>public</lj:security>
  <lj:reply-count>4</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/60909.html</guid>
  <pubDate>Wed, 28 Dec 2022 12:41:41 GMT</pubDate>
  <title>итераторы</title>
  <link>https://amarao.dreamwidth.org/60909.html</link>
  <description>!markdown&lt;br /&gt;&lt;br /&gt;А вот я и дошёл до странной проблемы, которую я не могу понять.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;#[&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;derive&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Count&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;u32&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;u32&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;#[&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;derive&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Debug&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;CountIterator&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;params&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Count&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;cur&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;u32&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Count&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;u32&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;u32&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;Self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Count&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Iterator&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;CountIterator&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Item&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;u32&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;text-decoration: underline;&quot;&gt;next&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;text-decoration: underline;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;Self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Item&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;text-decoration: underline;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;cur&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;text-decoration: underline;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;params&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;to&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #569cd6;text-decoration: underline;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;cur&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;text-decoration: underline;&quot;&gt;+=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;Some&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;text-decoration: underline;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;cur&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        }&lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;None&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;IntoIterator&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Count&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Item&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;u32&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;IntoIter&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;CountIterator&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;into_iter&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;&apos;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;a&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;Self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;IntoIter&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;CountIterator&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;params&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;cur&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;И&amp;nbsp;этот код неправильный, потому что &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 222 | impl&amp;lt;&apos;a&amp;gt; IntoIterator for Count{&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; |&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ^^ unconstrained lifetime parameter&lt;br /&gt;&lt;br /&gt;И я не понимаю, почему так. И оно неприятно щекочет где-то в районе type parameters,&amp;nbsp;потому что редактор подсказывает, что на месте IntoIter = надо писать &lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;IntoIter&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Iterator&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Item&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;Self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Item&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; .....;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;И я ни черта не понимаю в написанном.&amp;nbsp;Либо это RLS фигню пишет, либо я что-то глубоко не понимаю. Иду пересматривать про итераторы. Что-то я упускаю...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=60909&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/60909.html</comments>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/60582.html</guid>
  <pubDate>Wed, 28 Dec 2022 11:52:43 GMT</pubDate>
  <title>древесное</title>
  <link>https://amarao.dreamwidth.org/60582.html</link>
  <description>И оказалось, что обойти без рекурсии дерево - это не так уж просто.&amp;nbsp;Обход в ширину (мне показался) проще.&lt;br /&gt;&lt;br /&gt;Я попробовал написать 80-строчного монстра, он дерево обходил, но закцикливался (уходил в лево после обхода в право, уходил вправо, после обхода в лево).&lt;br /&gt;&lt;br /&gt;... Я сделал шаг назад и написал рекурсивную реализацию. 6 строк.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;rec_pre_order&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;Some&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;as_ref&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;cloned&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;rec_pre_order&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;borrow&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;as_ref&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;cloned&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;println&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;{&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;}&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;borrow&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;rec_pre_order&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;borrow&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;right&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;as_ref&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;cloned&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;напоминаю, что:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;right&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;И да, я устал от всех этих Ref&apos;ов и as_ref&apos;ов, но таковы условия задачи.&lt;br /&gt;&lt;br /&gt;Честный pre_order. Если подвинуть println! в начало (над первым вызовом rec_pre_order), то получится in-order. Если сдвинуть в конец - будет post-order.&lt;br /&gt;&lt;br /&gt;А теперь задача, взять этот изящный рекурсивный код и превратить его в итератор. Я понимаю, что это возможно, но с ходу не могу придумать как. Альтернативно: штурмовать loop-версию, пытаясь воспроизвести рекурсию на доморощенном стеке данных.&lt;br /&gt;&lt;br /&gt;Пожалуй, я пока займусь идеей итератора из рекурсии. Может быть, это не самая дурная идея?&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=60582&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/60582.html</comments>
  <category>деревья</category>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/60219.html</guid>
  <pubDate>Wed, 28 Dec 2022 10:29:07 GMT</pubDate>
  <title>обходы дерева</title>
  <link>https://amarao.dreamwidth.org/60219.html</link>
  <description>А вот я думал, что задачу symmetric tree я решу в пол-пинка. (Задача: по заданному дереву сказать, симметричное ли оно).&lt;br /&gt;&lt;br /&gt;Теоретическое решение: pre_walk() == post_walk().&lt;br /&gt;&lt;br /&gt;Практические проблемы: наивные методы обхода дерева используют рекурсию, а использовать рекурсию при параллельном обходе дерева двумя разными способами - себе дороже.&lt;br /&gt;&lt;br /&gt;Выгрузка обоих деревьев в список и сравнение - уровень сложности алгоритма `o(позор)`.&lt;br /&gt;&lt;br /&gt;Правильное решение: реализовать стеки из вектора и обходить в цикле. Но два обхода в одной функции уродливо, так что идиоматический подход должен реализовать итератор pre_walk(), итератор post_walk(), и потом просто сравнить их. (то есть решение будет `pre_walk(&amp;amp;tree) == post_walk(&amp;amp;tree)`).&lt;br /&gt;&lt;br /&gt;А вот над реализацией нерекурсивного обхода дерева я сейчас буду думать. Теоретически, ничего сложного, но масса эргономических нюансиков (например, как хранить направление движения (влево или вправо)? Надо ли его хранить или оно само получится?).&lt;br /&gt;&lt;br /&gt;Плюс rust&apos;овая машинерия для итераторов, которая выглядит ясной и простой, пока туда lifetimes для захваченных ref не появятся.&lt;br /&gt;&lt;br /&gt;Короче, задача сводится к pre_order walk&amp;nbsp;через итератор. Решу её, дальше тривиально. Традиционно, сначала решаю, потом читаю умные тексты.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=60219&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/60219.html</comments>
  <category>деревья</category>
  <category>rust</category>
  <category>leetcode</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/59588.html</guid>
  <pubDate>Sat, 24 Dec 2022 14:24:35 GMT</pubDate>
  <title>post-tree</title>
  <link>https://amarao.dreamwidth.org/59588.html</link>
  <description>Интернеты говорят, что во-первых Rc&amp;lt;RefCell&amp;gt; не идиоматично для Rust (деревья правильно держать как банальные вектора, содержащие в себе вектора векторов). Во-вторых, я, в целом, всё правильно сделал.&lt;br /&gt;&lt;br /&gt;После некоторого кумекания получилось вот так вот, и я не вижу как его сделать существенно компактнее. Может быть, можно уйти от Enum и бального true/false хватит?&lt;br /&gt;&lt;br /&gt;Да, получилось.&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;mktree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &amp;amp;[&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;]) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;is_empty&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;() &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;||&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;is_none&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;None&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;new_tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;());&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;buff&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;VecDeque&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;buff&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;text-decoration: underline;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;as_ref&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;cloned&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;source&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;]&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;into_iter&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;subtree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;and_then&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(|&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;| {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;subtree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;new_tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;buff&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;text-decoration: underline;&quot;&gt;push_back&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;subtree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;as_ref&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;cloned&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;false&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;subtree&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        });&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;is_last&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;buff&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;text-decoration: underline;&quot;&gt;pop_front&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;is_last&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;borrow_mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;right&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;subtree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        } &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;as_ref&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;borrow_mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;subtree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;buff&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;text-decoration: underline;&quot;&gt;push_front&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;((&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;as_ref&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;cloned&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(), &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;true&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;tree&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Что меня смущает?&amp;nbsp;Изобилие as_ref().cloned(). Ща буду думать...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=59588&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/59588.html</comments>
  <category>rust</category>
  <category>деревья</category>
  <lj:security>public</lj:security>
  <lj:reply-count>65</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/59161.html</guid>
  <pubDate>Sat, 24 Dec 2022 13:25:09 GMT</pubDate>
  <title>Древесные истории</title>
  <link>https://amarao.dreamwidth.org/59161.html</link>
  <description>Я научился из списка leetcode&apos;а делать дерево! Это было невероятно тяжело, и Rust&amp;nbsp;в этом месте показал learning curve в районе over 60&amp;deg;. Зато к финалу я стал много лучше чувствовать ownership/borrow, особенно, в контексте Rc/RefCell.&lt;br /&gt;&lt;br /&gt;Примерно через три часа размышлений о том, как совместить VecDeqeue.get и VecDequeue.pop_front, я понял, что я не могу решать проблему, игнория существование и свойства Rc&amp;lt;RefCell&amp;lt;TreeNode&amp;gt;&amp;gt;. До этого момента я пытался обойтись голым Option, не используя свойства Rc.&lt;br /&gt;&lt;br /&gt;Потом я написал функцию mktreefull, которая не умеет несбалансированные деревья (то есть у каждой ноды заполнены оба потомка). В этот момент я почувствовал свет истины.&lt;br /&gt;&lt;br /&gt;Потом я ушёл писать walk, чтобы проверить, что я написал правильно, и опять застрял в &amp;quot;получении значения из Rc&amp;lt;RefCell&amp;gt; без .borrow()&amp;quot;. И вот тут-то на меня снизошло понимание, что нельзя их использовать без borrow, и все мои выкрутасы тут - фигня.&lt;br /&gt;&lt;br /&gt;Я на 99% уверен, что мой алгоритм настолько далёк от компактного, насколько можно, но вот он в двух словах.&lt;br /&gt;&lt;br /&gt;У нас есть тип (дерева):&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;struct&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;val&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;i32&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;right&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Нам надо читая список вида &lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;Some(1),&lt;br /&gt;Some(2), Some(3),&lt;br /&gt;Some(4), None, None, Some(7),&lt;br /&gt;Some(8),&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Собрать дерево. Вот такое:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1 &lt;br /&gt;2 3 &lt;br /&gt;4 None None 7 &lt;br /&gt;8 None None None &lt;br /&gt;None None &lt;br /&gt;&lt;br /&gt;(каждая строка - уровень дерева) Можно заметить, что вывод похож на вход, хотя None больше, потому что в компактном вводе &amp;quot;оставшиеся None&amp;quot; не указываются.&lt;br /&gt;&lt;br /&gt;Идея, которая у меня не взлетела - класть в VecDeque left и right ноды&amp;nbsp;(None) и заменять из с помощью mem::swap.&lt;br /&gt;Новая идея, которая сработала: вместо сохранения потомков у узла, сохранять сам узел, и обрабатывать его дважды (для левой и правой части).&amp;nbsp;Грубо говоря, для левой части мы делаем push_back(cur.left), push_front(cur). А когда делаем push_back(curl.right), то не делать push_front(cur). Когда мы обрабатываем новое значение, мы смотрим на текущее значение curl.left, и если оно пустое, то это обработка левого поддерва, если не пустое - правого.&lt;br /&gt;&lt;br /&gt;Это работало для сбалансированного дерева. Для несбалансированного дерева мы, обрабатывая значения можем получить None, то есть &amp;quot;левый лист не нужен&amp;quot;.&amp;nbsp;В этой ситуации, если мы сделаем в следующю итерацию проверку на cur.left.is_none, то получим, что left is none, то есть надо идти на лево, хотя надо было на право.&lt;br /&gt;&lt;br /&gt;Чтобы решить эту проблему я сделал enum для состояния узла в VecDeque:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;enum&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;NodeState&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;Left&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;Right&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;NodeState&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;: &amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;Self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;NodeState&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;Left&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;t&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;as_ref&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;cloned&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;())&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Заметим, тут же происходит магия Rc/RefCell, я использую t.as_ref.cloned.&lt;br /&gt;&lt;br /&gt;напоминаю, что &lt;br /&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;&lt;br /&gt;type&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Tree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;то есть t.as_ref превращает &lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/span&gt;в &lt;span style=&quot;color: #4ec9b0;&quot;&gt;Option&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&amp;amp;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;Rc&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;RefCell&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;TreeNode&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;.&lt;br /&gt;Потом мы дёргаем cloned, что проходит в Rc (сквозь Option за счёт трейта Deref, насколько я понимаю) и это делает магию Rc, то есть приводит к появлению +1 на счётчике и ещё одной ссылки&amp;nbsp;(вместо клонирования содержимого). Я вытащил этот самый as_ref().cloned() в реализацию NodeState просто, чтобы сэкономить нажатие кнопок в основной функции.&lt;br /&gt;&lt;br /&gt;Дальше у нас простая state machine:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;cur&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;text-decoration: underline;&quot;&gt;buff&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;text-decoration: underline;&quot;&gt;pop_front&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;match&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;cur&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;NodeState&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;Left&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;Some&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&amp;gt; {...},&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;NodeState&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;Right&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;Some&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)) &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&amp;gt; {...},&lt;/span&gt;&lt;/div&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;  _&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; {&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;panic&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;!&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;();}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;br /&gt;В которой у нас разное поведение для left и right. Если мы в left, то мы кладём в конец новый узел, а в голову возвращаем текущую ноду, но в состоянии &apos;Right&apos;. &lt;br /&gt;В Right мы кладём новый узел в голову, а текущий узел уже никуда не добавляем.&lt;br /&gt;&lt;br /&gt;Ну, и, разумеется, в текущей ноде поддеревья попадают в разные стороны.&lt;br /&gt;&lt;br /&gt;Процесс модификации текущей ноды целиком зависит от магии Rc (мы делаем borrow_mut из немутабельной ссылки):&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;node&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;borrow_mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;()&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;left&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;subtree&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Повторю, я на 100% уверен, что есть более элегантные решения, но у этого есть неоспоримое достоинство - я его сам думал целиком, а заодно учился жить с Rc/RefCell.&lt;br /&gt;&lt;br /&gt;Код: &lt;a href=&quot;https://github.com/amarao/leetcode-tree-build/blob/master/src/main.rs#L41&quot;&gt;https://github.com/amarao/leetcode-tree-build/blob/master/src/main.rs#L41&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;А вот теперь, я пойду читать как эту проблему решают взрослые мальчики.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=59161&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/59161.html</comments>
  <category>leetcode</category>
  <category>rust</category>
  <category>деревья</category>
  <lj:security>public</lj:security>
  <lj:reply-count>1</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/54610.html</guid>
  <pubDate>Wed, 09 Nov 2022 13:56:26 GMT</pubDate>
  <title>Вернуть пустое</title>
  <link>https://amarao.dreamwidth.org/54610.html</link>
  <description>Вот я прям питон начинаю не любить. Казалось бы, утиная типизация и всеобщая приятность. Никакого фашизма, всё можно.&lt;br /&gt;&lt;br /&gt;А вот вам простая задачка, которую на rust&apos;е generic&apos;и решают в одну строчку, а на питоне я не знаю как (в разумные усилия).&lt;br /&gt;&lt;br /&gt;Есть функция, которая читает вывод (утилиты) и возвращает распашенный json. Она достаточно generic, чтобы в зависимости от вывода утилиты вернуть list или dict.&lt;br /&gt;&lt;br /&gt;Теперь я хочу добавить фэнсервиса - если вывод пустой, то возвращать пустой элемент (список или словарь). Как? КАК?&lt;br /&gt;&lt;br /&gt;    &amp;gt;&amp;gt;&amp;gt; class foo(dict,list):&lt;br /&gt;    ...     pass&lt;br /&gt;    ... &lt;br /&gt;    Traceback (most recent call last):&lt;br /&gt;      File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;&lt;br /&gt;    TypeError: multiple bases have instance lay-out conflict&lt;/module&gt;&lt;/stdin&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=54610&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/54610.html</comments>
  <category>python</category>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>8</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/53513.html</guid>
  <pubDate>Thu, 03 Nov 2022 18:32:44 GMT</pubDate>
  <title>Rust hard task sqrt(n)</title>
  <link>https://amarao.dreamwidth.org/53513.html</link>
  <description>Моя hard task свелась к проблеме поиска структуры, которая есть в стандартной библиотеке, и которая даёт мне возможность вставлять, удалять и находить максимум быстрее, чем o(n). Кроме того, структура должна поддерживать дубликаты. Rust пока не даёт &apos;first/last&apos; для BTree, так что приходится думать самому.&lt;br /&gt;&lt;br /&gt;Правильный ответ - binary search tree, но у меня не хватает сейчас мозгов его хорошо написать, и я не хочу туда коммититься.&lt;br /&gt;&lt;br /&gt;Вот что я придумал &quot;их того что было и палок&quot;.&lt;br /&gt;&lt;br /&gt;объём данных: n&lt;br /&gt;k = sqrt(n) (квадратный корень из n)&lt;br /&gt;&lt;br /&gt;Создадим Vec (массив) и VecDeque (double ended queue) - такие есть в в стандартной библиотеке. Всего будет k (напоминаю, sqrt(n)) Vec&apos;ов при ожидаемом размере каждого элемента - k. Получается sqrt(n) * sqrt(n) = n.&lt;br /&gt;&lt;br /&gt;Все элементы хранятся упорядоченно. Каждый VecDeque упорядочен от младшего к старшему, каждый элемент Vec содержит в себе VecDeque, которые так же полностью упорядочены.&lt;br /&gt;&lt;br /&gt;Вставка:&lt;br /&gt;&lt;br /&gt;Найти двоичным поиском в Vec нужный элемент (VecDeque). o(log(k))&lt;br /&gt;Найти двоичным поиском в VecDeque нужную позицию, либо дописать слева/справа. o(log(k))&lt;br /&gt;Вставить элемент в указанный индекс. Сложность o(k/2), с поправкой на облечение &quot;вставки в начало&quot; (т.к. VecDeque).&lt;br /&gt;После этого произойдёт переполнение VecDeque (размер станет больше k), и надо будет перекинуть элемент вверх или вниз. Возможно, в худшем случае вставка потребует перекидывать элементы между каждой &quot;строкой&quot; (VecDeque), так что худший случай - o(k) pop_back, o(k) push_front. в среднем o(k) операций.&lt;br /&gt;&lt;br /&gt;Сложность: log(k) + log(k) + o(k/2) + o(k/2) + k + k =~= k&lt;br /&gt;&lt;br /&gt;Удаление: &lt;br /&gt;&lt;br /&gt;Найти двоичным поиском в Vec нужный элемент (VecDeque). o(log(k))&lt;br /&gt;Найти двоичным поиском в VecDeque нужную позицию o(log(k))&lt;br /&gt;Перенормировать длины: 2*o(k)&lt;br /&gt;&lt;br /&gt;Сложность: o(k)&lt;br /&gt;&lt;br /&gt;Поиск максимума o(1) - последний элемент последней строки.&lt;br /&gt;&lt;br /&gt;Теперь, вспомним, что k - это sqrt(n), и получаем, что сложность вставки/удаления - sqrt(n), что лучше, чем n.&lt;br /&gt;&lt;br /&gt;При использовании внутри алгоритма со сложностью n*log(n), получаем n*log(n)*sqrt(n), ~n&lt;sup&gt;1.5&lt;/sup&gt;, что лучше, чем o(n).&lt;br /&gt;&lt;br /&gt;Не фонтан, но...&lt;br /&gt;&lt;br /&gt;Вопрос: не могу ли я расширить этот подход на более чем одно измерение? Теоретически, в пределе должно получиться как раз log(n).&lt;br /&gt;&lt;br /&gt;Фактически, я хочу сделать дерево, в котором у меня в векторе хранятся вектора, внутри которых хранятся вектора... и так пока я не дойду до самого дна, то есть до leaf&apos;а. Одним из интересных улучшений в рамках задачи является то, что я знаю максимальный размер (n) заранее и могу посчитать оптимальную глубину в момент создания, то есть мне не нужно пересчитывать глубины.&lt;br /&gt;&lt;br /&gt;&quot;дерево на векторах&quot; мне кажется куда интереснее, чем обычный struct с left/right (как обычно дерево описывается).&lt;br /&gt;&lt;br /&gt;Я сейчас попробую изобрести такое дерево, если не получится, попробую штурмовать задачу с n^(1.5) сложностью решения. Цена вопроса - для 10000 элементов квадратичное решение - это 100 миллионов операций, а 1.5 - это миллион. 100-кратное ускорение. Для 100k элементов - 100 миллиардов против 31 миллиона, 300-кратное ускорение.&lt;br /&gt;&lt;br /&gt;&lt;cut&gt;&lt;br /&gt;&lt;br /&gt;Итак, как будет устроено DQTree? По аналогии с btree, я хочу ограничить глубину сканирования эффективным коэфицентом. Допустим, я выбираю коэфицент B (16).&lt;br /&gt;&lt;br /&gt;У меня N элементов, и мне нужно посчитать, сколько слоёв нужно в дереве. log&lt;sub&gt;16&lt;/sub&gt;N, округлённый вверх. Допустим, у меня 333333 элементов. Это 5 слоёв (из значения логарифма 4.58..)&lt;br /&gt;&lt;br /&gt;В первом слое у меня B элементов (Vec), во втором слое у меня B элементов (тоже Vec), в третьем слое у меня B элементов, в четвёртом у меня B элементов, в пятом у меня Deque... А нужно ли оно тут? Если у меня там up to 16 элементов, то любой insert в  него будет константным. Так что просто Vec. Все слои, кроме нижнего, содержат в себе только Vec следующего уровня. Нижний Vec содержит в себе числа.&lt;br /&gt;&lt;br /&gt;Переименовываем стуктуру в VecTree.&lt;br /&gt;&lt;br /&gt;Создание: Аллоцирвать все Vec&apos;и. WUT? Это же o(n) операций. Нет.&lt;br /&gt;&lt;br /&gt;Вместо Vec у нас появляется Option&lt;vec&gt;... При создании VecTree мы ничего не аллоцируем.&lt;br /&gt;&lt;br /&gt;Вставка:&lt;br /&gt;&lt;br /&gt;Дойти до нижнего элемента за o(log n), вставиться в него за o(B) времени (то есть за o(1)).&lt;br /&gt;Каким образом я знаю, в какой элемент вставляться? Если это первый элемент, то понятно, самая левая ветка.&lt;br /&gt;&lt;br /&gt;А если, допустим, у нас целиком уровень забит Vec&apos;ами? Как нам понять, в какой Vec ходить?&lt;br /&gt;&lt;br /&gt;Допустим, мы будем хранить min/max для обслуживаемого диапазона.&lt;br /&gt;&lt;br /&gt;Итак, пройтись по элементам, выбрать подходящий диапазон. Если слишком маленький - расширить диапазон левого значения, если слишком большой - правого.&lt;br /&gt;&lt;br /&gt;Спуститься на уровень ниже. Повторить.&lt;br /&gt;&lt;br /&gt;Пока не прийдём к нижнему слою.&lt;br /&gt;&lt;br /&gt;Двоичным поиском найти нужное место, вставиться.&lt;br /&gt;&lt;br /&gt;После вставки мы проверяем размер Vec&apos;а и думаем, что с этим делать. Если размер меньше B, то &quot;и пофигу&quot;.&lt;br /&gt;&lt;br /&gt;Если размер больше B, то надо вынуть элемент в ставить &quot;куда&quot; следует:&lt;br /&gt;&lt;br /&gt;Если у нас нет соседа слева, то надо убирать правый элемент.&lt;br /&gt;Если у нас нет соседа справа, то надо убирать левый элемент.&lt;br /&gt;&lt;br /&gt;А если есть оба соседа? Как понять в какую сторону значение надо двигать? По-идее надо двигать в ту сторону, в которой меньше всего элементов.&lt;br /&gt;&lt;br /&gt;Для этого мы записываем число элементов для каджого Vec&apos;а. (не число элементов в Vec, а число элементов в Vec в Vec в Vec ... до самого дна).&lt;br /&gt;&lt;br /&gt;То есть обычная (не leaf) нода выглядит так:&lt;br /&gt;&lt;br /&gt;min&lt;br /&gt;max&lt;br /&gt;count&lt;br /&gt;&lt;br /&gt;При спуске на слой ниже мы смотрим на предпочтения по перекидыванию значений. Для этого мы считаем число элементов в остальных элементах слоя (кроме того, в который мы погружаемся) и вычисляем left_count и right_count, который и известен следующему слою.&lt;br /&gt;&lt;br /&gt;Когда слой решает, какой элемент удалять при переполнении, он смотрит какой меньше и с той стороны удаляет элемент. (Будет обидно, если удаляют элемент, который только что был вставлен... не создаст ли это бесконечный цикл? Удалённый элемент при ребалансировке надо вставлять... Это особый случай и нам надо проверять, к какому потомку мы посылаем элемент, если элемент на границе диапазона - к тому, у которого это будет &quot;левое&quot; значение или правое). Мы на эти вопросы всё равно смотрим, потому что двигаем min/max у элемента. У кого count меньше, того и элемент.&lt;br /&gt;&lt;br /&gt;(возвращаемся к ребалансировке &quot;лишнего&quot; значения с нижнего слоя &apos;leaf&apos;ов&apos;).&lt;br /&gt;&lt;br /&gt;Итак, мы знаем с какой стороны удаляем лишнее значение. Мы его удаляем (размер становится B), после чего мы возвращаемся на уровень выше и вставляем значение в элемент с соотв стороны.&lt;br /&gt;&lt;br /&gt;Это может вызвать ребалансировку в следующий элемент. Можно представить себе крайне неприятную ситуацию, при которой мы проходим все N/B-1 элементы, то есть получаем ребалансировку за o(n). Плохо-плохо.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;А как мы к такой беде пришли? Потому что в старом коде с k=sqrt(n) нужно было не более чем 2*k операций на Dequeue, чтобы ребалансировать всё. Почему так? Потому что при ребалансировке у меня 2 операции на &quot;псевдолиф&quot; (pop_front/push_back).&lt;br /&gt;&lt;br /&gt;А в VTree у меня мало того, что на каждый leaf B операций на вставку, то ещё и надо потенциально пройтись по всем значенниям. И переходов o(n). А было o(sqrt(n)), потому что я променял sqrt n на B, когда делал размер leaf&apos;а снизу. Почему я это сделал? Чтобы сделать вставку дешевле. у старого кода вставка была дорогой o(k), и ребалансировка тоже дорогой. o(k). Получалось, что две условно дорогие операции дешевле, чем, казалось бы, быстрая вставка за o(log(n)), но очень дорогая ребалансировка за n.&lt;br /&gt;&lt;br /&gt;Мы так не договаривались.&lt;br /&gt;&lt;br /&gt;Окей, шаг назад. У нас есть sqrt(n). Там есть Vec&lt;vecdeque&gt;&amp;gt;. Если мы сделаем Vec&lt;/vecdeque&gt;&lt;/vec&gt;&lt;/cut&gt;&lt;div class=&apos;ljparseerror&apos;&gt;&lt;strong&gt;( &lt;a href=&apos;https://amarao.dreamwidth.org/53513.html&apos;&gt;Error: Irreparable invalid markup in entry. Raw contents behind the cut.&lt;/a&gt; )&lt;/strong&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=53513&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/53513.html</comments>
  <category>rust</category>
  <category>leetcode</category>
  <lj:security>public</lj:security>
  <lj:reply-count>3</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/52972.html</guid>
  <pubDate>Tue, 01 Nov 2022 19:24:32 GMT</pubDate>
  <title>hard-Rust&apos;овое</title>
  <link>https://amarao.dreamwidth.org/52972.html</link>
  <description>Я почти-почти-почти решил задачу, но... У BinaryHeap нет remove. pop убирает только самый большой элемент.&lt;br /&gt;&lt;br /&gt;Практически, эпик фейл. Теоретически, BST решает проблему, но в стандартной библиотке нет BST, а есть только &quot;просто дерево&quot; (и BTree).&lt;br /&gt;&lt;br /&gt;Я пока не готов коммититься на написание дерева (кроме того, я знаю, что растовая реализация BTree на много голов выше любой моей наивной реализации).&lt;br /&gt;&lt;br /&gt;Видимо, я пока признаю своё поражение, и использую внешний крейт с binary_search_tree.&lt;br /&gt;&lt;br /&gt;(обидно, потому что first/last для BTreeMap/Set уже стабилизировано, но ещё не зарелижено. Увы).&lt;br /&gt;&lt;br /&gt;UPD: его стабилизируют в 1.66, 1.65 выходит послезавтра, а сколько ждать до 1.66 - даже не известно. Увы, binary_search_tree.&lt;br /&gt;&lt;br /&gt;UPD2: на leetcode нет крейта binary_search_tree. Либо писать своё дерево (конкретно binary search tree), либо писать всю структуру с нуля.&lt;br /&gt;&lt;br /&gt;Мой хак состоял в том, чтобы переопределить Ord таким образом, чтобы точка была равна range в который она попадает. Это позволяло извлекать range по точке из range&apos;а. Если писать свою структуру, хак тут не нужен.&lt;br /&gt;&lt;br /&gt;Пока что сохраняю для истории версию с (unstable) BTreeSet.first(): &lt;a href=&quot;https://gist.github.com/amarao/9126e51f9587186fc95a79e3339bf884&quot;&gt;https://gist.github.com/amarao/9126e51f9587186fc95a79e3339bf884&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;и пойду ваять дерево. Совершенно отдельная дисциплина.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=52972&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/52972.html</comments>
  <category>leetcode</category>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/51476.html</guid>
  <pubDate>Sun, 30 Oct 2022 11:16:21 GMT</pubDate>
  <title>Деревья и Rust</title>
  <link>https://amarao.dreamwidth.org/51476.html</link>
  <description>Я тут решаю одну hard problem на leetcode (в leetcod&apos;овском смысле &apos;hard&apos;, не NP-hard). Я думаю, что я её уже решил оптимально (спустя ~10 исписанных бумажек), но я не знаю как её запрограммировать на Rust. Списки и деревья - моя слабость в Rust, потому что &amp;quot;всё понимает, а сказать не может&amp;quot;.&lt;br /&gt;&lt;br /&gt;Итак, задача: &lt;a href=&quot;https://leetcode.com/problems/maximum-segment-sum-after-removals/&quot;&gt;https://leetcode.com/problems/maximum-segment-sum-after-removals/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Дан массив положительных чисел и массив со списком позиций для удаления чисел. Нужно заменять в первом массиве (чисел) позицию из второго списка нулём. После этого нужно смотреть на массив чисел и отвечать какая сумма сегмента там самая большая. Сегмент - непрерывная последовательность чисел без нулей. Эти суммы надо записать в результат (для каждого удаления - максимальный размер сегмента в после данного удаления).&lt;br /&gt;&lt;br /&gt;Т.е. после каждого удаления старый сегмент может оказаться поделен на два, и возможно что какой-то другой сегмент теперь больший.&lt;br /&gt;&lt;br /&gt;Всего для массива в N чисел будет N удалений.&lt;br /&gt;&lt;br /&gt;Решение в лоб тривиальное - заменяем элемент в массиве, считаем какой сегмент максимальный. Сложность n&amp;sup2;, потому что у нас надо N раз посчитать максимальный сегмент среди N чисел.&lt;br /&gt;&lt;br /&gt;Дальше спойлер&lt;br /&gt;&lt;br /&gt;&lt;span class=&quot;cut-wrapper&quot;&gt;&lt;span style=&quot;display: none;&quot; id=&quot;span-cuttag___1&quot; class=&quot;cuttag&quot;&gt;&lt;/span&gt;&lt;b class=&quot;cut-open&quot;&gt;(&amp;nbsp;&lt;/b&gt;&lt;b class=&quot;cut-text&quot;&gt;&lt;a href=&quot;https://amarao.dreamwidth.org/51476.html#cutid1&quot;&gt;Read more...&lt;/a&gt;&lt;/b&gt;&lt;b class=&quot;cut-close&quot;&gt;&amp;nbsp;)&lt;/b&gt;&lt;/span&gt;&lt;div style=&quot;display: none;&quot; id=&quot;div-cuttag___1&quot; aria-live=&quot;assertive&quot;&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=51476&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/51476.html</comments>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/51288.html</guid>
  <pubDate>Sun, 30 Oct 2022 09:42:39 GMT</pubDate>
  <title>Растовое</title>
  <link>https://amarao.dreamwidth.org/51288.html</link>
  <description>Одна из непроговоренных особенностей Раста состоит в том, что функция - это big deal. В питоне почти любой кусок кода можно вынуть и положить в функцию. После появления yield from, таких кусков стало ещё больше. Фактически, в питоне нельзя вынести в отдельную функцию только control flow (return/break/continue) внутри блоков. Всё остальное - можно.&lt;br /&gt;&lt;br /&gt;В Rust функция, хоть и является существенно более дешёвой (из-за того что у функции неиллюзорные шансы быть inline), вынесение кода в функцию не всегда возможно. Функции нужны сигнатуры, а некотрые сигнатуры чертовски тяжело написать, и даже если это возможно, сложность &quot;думания&quot; в этот момент в разы выше. В Расте постепенно появляются всякие безумия с GAT&apos;ами, которые расширяют список того, что может быть функцией ... точнее, методом, но общий принцип раста - не всё возможно.&lt;br /&gt;&lt;br /&gt;В целом, я бы сказал, что это именно набор ограничений. Берём условный язык опасно близкий к ассеблеру, натягиваем на него вкусный синтаксический сахар, который его превращает в язык высокого уровня, а потом запрещаем крупными мазками &quot;чаще всего плохие вещи&quot;. В замен мы получаем песочницу для программиста (где большая часть опасностей предотвращена), массу подсказок для компилятора для оптимизации последствий песочницы. Но ещё при этом получаем запрет на, казалось бы, нормальные вещи. Некоторые из которых - скрытая опасность (и за это хвалят Rust), а некоторые - вполне себе sound код, но &quot;ну так получилось&quot;.&lt;br /&gt;&lt;br /&gt;С каждой версией в Rust&apos;е всё больше &quot;ну так получилось&quot; убирают, добавляя механизмы для sound &amp; safe реализации новых нюансов.&lt;br /&gt;&lt;br /&gt;Но сам принцип &quot;denied by default&quot; остаётся, то есть с точки зрения программиста Rust куда более ограничивающий язык, чем большинство языков низкого уровня и языков с расслабленной типизацией (к которой относится и Питон).&lt;br /&gt;&lt;br /&gt;Соответственно, это приводит к двум отношениям с языком:&lt;br /&gt;&lt;br /&gt;Пишу как хочу и не думаю, если ошибусь, компилятор поймает (и может даже, предложит исправление). Это основной режим, no thinking required. Точнее, думать можно уже не о языке, а о решаемой проблеме, а всю рутину язык либо сам сделает. Это выведение типов, AsRef/Borrow/Copy трейты, generic&apos;и, которые &quot;сами всё делают&quot;, как .collect(). Последний я как раз считаю ярчайшим примером &quot;магии раста&quot;. Итератор сам превращается в нужный тип, причём практически любой возможный.&lt;br /&gt;&lt;br /&gt;Второе отношение с языком: &quot;да что за хрень?&quot;. ~70% этой хрени по делу, то есть компилятор конкретно запрещает делать unsound вещи (например, менять вектор, по которому итерация, или вызывать второй раз FnOnce функцию). Примерно 5-7% - это мелкие придирки (Пиши `foo as i64`, когда `foo: i32`) или шероховатости типов (например type(&amp;str[0]) != char).&lt;br /&gt;&lt;br /&gt;Оставшиеся 20-25% режима &quot;что за хрень&quot;, это праведное возмущение, потому что я знаю, что так можно, а компилятор мне не верит, или я хочу, но не могу написать (сигнатуру для замыкания). С временем эта область подсокращается (чаще всего через сложные механизмы для тех, кто очень хорошо знает язык, те же GAT&apos;ы), но в целом она есть и никогда не исчезнет.&lt;br /&gt;&lt;br /&gt;Это сильно противоречит питону или C, где практически нет мест, где &quot;нельзя написать&quot;. Можно, но последствия остаются на совести написавшего, а иногда бывает так, что написать можно, а написать sound (непротиворечиво) нельзя, и языку пофиг.&lt;br /&gt;&lt;br /&gt;(уклонился от исходной темы).&lt;br /&gt;&lt;br /&gt;Так вот, функции в rust - это big deal. Если пишешь функцию, это контракт, интерфейс, на написание которого может уйти больше времени, чем на сам код (самой функции и кода, который эту функцию вызывает). Более того, однажды написанный контракт (сигнатура функции) потом давлеет, и шаг влево/шаг вправо вызывает необходимость изменять сигнатуру функции, что автоматически приводит к необходимости думать про все места использования функции... Это частично обходится generic&apos;ами, но generic&apos;и повышают уровень &quot;думания&quot;, и часто уводят в те самые углы, где &quot;компилятор неправ&quot; (например, если он выбирает неправильный метод построения generic&apos;а и не хочет вывести типы корректно, то есть ругается при компиляции).&lt;br /&gt;&lt;br /&gt;С другой стороны, когда знаешь, что пишешь, написанные сигнатуры - 80% программы. Дальше каждый кусок пишется под сигнатуру в режиме &quot;no thinking required&quot;. Если оно по типам сходится, значит всё в программе правильно. Может быть ошибочный алгоритм (об этом думать надо), но код функции точно делает то, что написано в сигнатуре.&lt;br /&gt;&lt;br /&gt;Это очень сильно меняет процесс программирования, особенно, если кода много. Я ещё не дошёл до того уровня, в котором могу планировать модули (не хватает интуиции и практики), но написать парочку трейтов для структуры ещё до написания полей самой структуры - это да, это совершенно другой уровень программирования.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=51288&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/51288.html</comments>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/50024.html</guid>
  <pubDate>Thu, 20 Oct 2022 11:53:24 GMT</pubDate>
  <title>Мой раст становится лучше</title>
  <link>https://amarao.dreamwidth.org/50024.html</link>
  <description>Задача: конвертация из числа в roman numerals:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #d4d4d4;background-color: #1e1e1e;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace, &amp;#39;Droid Sans Fallback&amp;#39;;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; Solution {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; next_biggest(num: i32) -&amp;gt; (&amp;amp;&apos;static [u8], i32) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;match&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; num {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;M&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1000&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;900&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;CM&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;900&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;D&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;500&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;CD&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;400&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;C&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;100&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;90&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;XC&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;90&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;L&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;50&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;40&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;XL&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;40&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;X&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;10&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;9&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;IX&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;9&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;V&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;5&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;IV&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;4&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;.. =&amp;gt; (&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;b&amp;quot;I&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;),&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            _ =&amp;gt; unimplemented!(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;quot;Unable to represent in Roman&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; int_to_roman(&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; num: i32) -&amp;gt; String {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; acc = Vec::new();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;while&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; num &amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;{&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt; (rom, value) = &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;Self&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;::next_biggest(num);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            acc.extend_from_slice(rom);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;            num -= value;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;        String::from_utf8(acc).unwrap()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Ключевое know-how: Возвращать reference&apos;ы на &amp;amp;&apos;static [u8], который на самом деле кусок будущей строки и использовать &amp;quot;байтовые строки&amp;quot; для констант (b&amp;quot;str_content&amp;quot;).&lt;br /&gt;&lt;br /&gt;Не то, чтобы это был Trait&amp;nbsp;Science, но любые другие выкрутасы с String или Vec&amp;lt;char&amp;gt; были бы куда более уродливыми&amp;nbsp;или неэффективными. А тут я беру и возвращаю указатели на статические строки (которые и так и так у меня в .data будут), и из них мирно собираю строку. Точнее, я собираю в [u8], которую потом копирую в String.&lt;br /&gt;&lt;br /&gt;Возможно, вместо while можно было бы иметь итератор, но я не уверен в выполнимости этого.&lt;br /&gt;Ещё одно место &amp;quot;думать&amp;quot; - в районе extend_from_slice, т.к. я могу вызывать несколько реаллоакций в процессе &apos;extend&apos;, а мне по-хорошему надо было бы знать длину строки с самого начала. Но это отдельная интересная задача - определить размер строки для roman numeral по числовому значению.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=50024&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/50024.html</comments>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>8</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/47866.html</guid>
  <pubDate>Tue, 11 Oct 2022 12:30:42 GMT</pubDate>
  <title>уважать ли  TERM?</title>
  <link>https://amarao.dreamwidth.org/47866.html</link>
  <description>А вот тут у меня спор с автором ripgrep&apos;а: надо ли уважать TERM? Всем понятно, что TERM=dumb надо уважать. А вот какой-нибудь t10, который от dumb отличается едва-едва, надо?&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://www.reddit.com/r/rust/comments/y0oz86/comment/irvo53s/?utm_source=share&amp;utm_medium=web2x&amp;context=3&quot;&gt;https://www.reddit.com/r/rust/comments/y0oz86/comment/irvo53s/?utm_source=share&amp;utm_medium=web2x&amp;context=3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Говорит, что не надо, иначе никакого спасения от всяких TERM=screen.linux.&lt;br /&gt;&lt;br /&gt;А вот мне кажется, что надо уважать. Не только от практичности, но и с целью закрыть все corner case&apos;ы. По крайней мере, для меня тотальность и отсутствие исключений - это привлекательные черты раста.&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=47866&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/47866.html</comments>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/47558.html</guid>
  <pubDate>Mon, 10 Oct 2022 18:34:35 GMT</pubDate>
  <title>I f.. love it</title>
  <link>https://amarao.dreamwidth.org/47558.html</link>
  <description>Некоторые задачи на leetcode доставляют трушное настоящее удовольствие.&lt;br /&gt;&lt;br /&gt;https://leetcode.com/problems/break-a-palindrome/&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Given a palindromic string of lowercase English letters &lt;code&gt;palindrome&lt;/code&gt;, replace &lt;strong&gt;exactly one&lt;/strong&gt; character with any lowercase English letter so that the resulting string is &lt;strong&gt;not&lt;/strong&gt; a palindrome and that it is the &lt;strong&gt;lexicographically smallest&lt;/strong&gt; one possible.&lt;/p&gt;  &lt;p&gt;Return &lt;em&gt;the resulting string. If there is no way to replace a character to make it not a palindrome, return an &lt;strong&gt;empty string&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;A string &lt;code&gt;a&lt;/code&gt; is lexicographically smaller than a string &lt;code&gt;b&lt;/code&gt; (of the same length) if in the first position where &lt;code&gt;a&lt;/code&gt; and &lt;code&gt;b&lt;/code&gt; differ, &lt;code&gt;a&lt;/code&gt; has a character strictly smaller than the corresponding character in &lt;code&gt;b&lt;/code&gt;. For example, &lt;code&gt;&amp;quot;abcc&amp;quot;&lt;/code&gt; is lexicographically smaller than &lt;code&gt;&amp;quot;abcd&amp;quot;&lt;/code&gt; because the first position they differ is at the fourth character, and &lt;code&gt;&apos;c&apos;&lt;/code&gt; is smaller than &lt;code&gt;&apos;d&apos;&lt;/code&gt;.&lt;/p&gt;тесткейсы:&lt;br /&gt;&lt;br /&gt;&amp;quot;&amp;quot; =&amp;gt;&amp;nbsp;&amp;quot;&amp;quot;&lt;br /&gt;&amp;quot;a&amp;quot; =&amp;gt;&amp;nbsp;&amp;quot;&amp;quot;&lt;br /&gt;&amp;quot;aa&amp;quot; =&amp;gt;&amp;nbsp;&amp;quot;ab&amp;quot;&lt;br /&gt;&amp;quot;zz&amp;quot; =&amp;gt;&amp;nbsp;&amp;quot;az&amp;quot;&lt;br /&gt;&amp;quot;aba&amp;quot; =&amp;gt;&amp;nbsp;&amp;quot;abb&amp;quot; (самый сложный случай, на котором я сначала попался).&lt;br /&gt;&lt;br /&gt;Я получил реальное неиллюзорное удовольствие от языка и от задачи.&amp;nbsp;Я не уверен, что на питоне у меня бы получилось компактнее и выразительнее&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #000000;background-color: #ffffff;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace, &amp;#39;Droid Sans Fallback&amp;#39;;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;break_palindrome&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;palindrome&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) -&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;bytes&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;palindrome&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;into_bytes&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;bytes&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;lt; &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;from&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        } &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;else&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;mid&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; / &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;odd&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; % &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) == &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;last&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; - &lt;/span&gt;&lt;span style=&quot;color: #098658;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;idx&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;bytes&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;iter_mut&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;enumerate&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;() {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;match&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;                    &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;b&apos;a&apos;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;idx&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;last&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; =&amp;gt; *&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;b&apos;b&apos;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;                    &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;b&apos;a&apos;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; =&amp;gt; {}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;                    &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;_&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;odd&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;idx&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; == &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;mid&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; =&amp;gt; {}&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt; // mid char, can&apos;t change&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;                    &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;_&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; =&amp;gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;                        *&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;c&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #a31515;&quot;&gt;b&apos;a&apos;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;                        &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;break&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;                    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;                }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;from_utf8&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;bytes&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;unwrap&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=47558&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/47558.html</comments>
  <category>leetcode</category>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/45915.html</guid>
  <pubDate>Wed, 28 Sep 2022 10:59:28 GMT</pubDate>
  <title>The программирование, часть вторая</title>
  <link>https://amarao.dreamwidth.org/45915.html</link>
  <description>Усилиями r/rust с Реддита&amp;nbsp;(note: реддит живее, чем&amp;nbsp;SO, причём не только в программировании) проблема quick fail была решена, причём идиоматически. Исчезли две аллокации (из четырёх), и как мне кажется, алгоритмически его быстрее уже не сделать. (Да, я понимаю про идею использовать буквы из шаблона как индексы, но на практике это потребует аллокации вектора букв, и врят ли будет лучше).&lt;br /&gt;&lt;br /&gt;Задача:&amp;nbsp;https://leetcode.com/problems/word-pattern/submissions/&lt;br /&gt;&lt;br /&gt;В двух словах: дана строка из букв и из слов, надо ответить, эквивалентны ли они друг другу в режиме &amp;quot;шаблона&amp;quot;&amp;nbsp;:&amp;nbsp;&amp;quot;aab&amp;quot; эвивалентна &amp;quot;dog dog cat&amp;quot;, &amp;quot;abca&amp;quot; эвивалентна &amp;quot;foo bar baz foo&amp;quot;.&lt;br /&gt;&lt;br /&gt;(предыдущее обсуждение и текст полный задачи: https://amarao.dreamwidth.org/45539.html)&lt;br /&gt;&lt;br /&gt;К предыдущему решению претензия была в отсутствии quick fail, то есть если с самого начала строки различаются, старый алгоритм продолжал &amp;quot;варить&amp;quot; до упора. (aaaaaaaaaaa и &amp;quot;foo bar bar bar bar bar&amp;quot;). Плюс, две аллокации для output.&lt;br /&gt;&lt;br /&gt;r/rust был более чем любезен указать на две важные детали:&lt;br /&gt;&lt;br /&gt;1. Можно возвращать итераторы вместо векторов.&lt;br /&gt;2. Итераторы лего сравнить.&lt;br /&gt;&lt;br /&gt;Кроме того, можно требовать не Iterator, а IntoIterator, так что можно передать любой &amp;quot;итрабельный&amp;quot; объект без вызова его iter(), хотя в конкретном этом случае это не работает, потому что итераторы у строки и шаблона разные и странные (split_whitespace&amp;nbsp;и chars).&lt;br /&gt;&lt;br /&gt;Получившийся код для меня находится чуть выше моего свободного понимания Rust: я его могу прочитать, но второй такой же не напишу (или уже напишу после этой истории?):&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #000000;background-color: #ffffff;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace, &amp;#39;Droid Sans Fallback&amp;#39;;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;std&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;hash&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Hash&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;use&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;std&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;collections&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;HashMap&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Solution&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;abstract_iterator&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;IntoIterator&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Item&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Hash&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; + &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Eq&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;) -&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Iterator&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Item&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;usize&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt; &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;HashMap&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;input&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            .&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;into_iter&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            .&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;move&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; |&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;elem&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;| {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;                &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;                *&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;entry&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;elem&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;or_insert&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        })&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;word_pattern&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;pattern&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) -&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;Self&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;abstract_iterator&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;pattern&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;chars&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;()).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;eq&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;Self&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;abstract_iterator&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;split_whitespace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;())&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        )&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;Глядя на этот код, мне немного не нравится word_pattern своей некрасивостью.&lt;br /&gt;&lt;br /&gt;Наверное, лучше было бы написать свой трейт, чтобы функция стала такой:&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;&lt;span style=&quot;color: #001080;&quot;&gt;pattern&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;            .&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;chars&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;()&lt;br /&gt;            .&lt;/span&gt;abstract_iterator&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;br /&gt;            .&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;eq&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;   s&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;                .&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;split_whitespace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;()&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;                .&lt;/span&gt;abstract_iterator&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;             )&lt;br /&gt;&lt;br /&gt;Но в целом - это огонь. Это совсем не похоже на &amp;quot;низкоуровневый язык,&lt;br /&gt;соревнующийся С++ за системность и поглядывающий на лавры С&amp;quot;.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=45915&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/45915.html</comments>
  <category>rust</category>
  <category>leetcode</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/45539.html</guid>
  <pubDate>Mon, 26 Sep 2022 16:53:57 GMT</pubDate>
  <title>The программирование</title>
  <link>https://amarao.dreamwidth.org/45539.html</link>
  <description>Один из нескольких разов, когда rust взрывает мозг и офигенен.&lt;br /&gt;&lt;br /&gt;Задача: &lt;br /&gt;&lt;br /&gt;&lt;p&gt;Given a &lt;code&gt;pattern&lt;/code&gt; and a string &lt;code&gt;s&lt;/code&gt;, find if &lt;code&gt;s&lt;/code&gt;&amp;nbsp;follows the same pattern.&lt;/p&gt;  &lt;p&gt;Here &lt;b&gt;follow&lt;/b&gt; means a full match, such that there is a bijection between a letter in &lt;code&gt;pattern&lt;/code&gt; and a &lt;b&gt;non-empty&lt;/b&gt; word in &lt;code&gt;s&lt;/code&gt;.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;&lt;/p&gt;  &lt;pre&gt;&lt;strong&gt;Input:&lt;/strong&gt; pattern = &amp;quot;abba&amp;quot;, s = &amp;quot;dog cat cat dog&amp;quot;
&lt;strong&gt;Output:&lt;/strong&gt; true
&lt;/pre&gt;  &lt;p&gt;&lt;strong&gt;Example 2:&lt;/strong&gt;&lt;/p&gt;  &lt;pre&gt;&lt;strong&gt;Input:&lt;/strong&gt; pattern = &amp;quot;abba&amp;quot;, s = &amp;quot;dog cat cat fish&amp;quot;
&lt;strong&gt;Output:&lt;/strong&gt; false
&lt;/pre&gt;  &lt;p&gt;&lt;strong&gt;Example 3:&lt;/strong&gt;&lt;/p&gt;  &lt;pre&gt;&lt;strong&gt;Input:&lt;/strong&gt; pattern = &amp;quot;aaaa&amp;quot;, s = &amp;quot;dog cat cat dog&amp;quot;
&lt;strong&gt;Output:&lt;/strong&gt; false
&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;Constraints:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;code&gt;1 &amp;lt;= pattern.length &amp;lt;= 300&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;pattern&lt;/code&gt; contains only lower-case English letters.&lt;/li&gt;&lt;li&gt;&lt;code&gt;1 &amp;lt;= s.length &amp;lt;= 3000&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;code&gt;s&lt;/code&gt; contains only lowercase English letters and spaces &lt;code&gt;&apos; &apos;&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;code&gt;s&lt;/code&gt; &lt;strong&gt;does not contain&lt;/strong&gt; any leading or trailing spaces.&lt;/li&gt;&lt;li&gt;All the words in &lt;code&gt;s&lt;/code&gt; are separated by a &lt;strong&gt;single space&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Решение:&lt;br /&gt;&lt;br /&gt;&lt;div style=&quot;color: #000000;background-color: #ffffff;font-family: &amp;#39;Droid Sans Mono&amp;#39;, &amp;#39;monospace&amp;#39;, monospace, &amp;#39;Droid Sans Fallback&amp;#39;;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;&quot;&gt;&lt;div&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;impl&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Solution&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;abstract_list&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;G&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) -&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;usize&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;where&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;T&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Iterator&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Item&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;G&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;G&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;std&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;hash&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Hash&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; + &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;std&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;cmp&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Eq&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;HashMap&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;mut&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;output&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;Vec&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #af00db;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;elem&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;let&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;            &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;output&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;push&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(*&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;dict&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;entry&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;elem&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;).&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;or_insert&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;));&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;output&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;pub&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;fn&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;word_pattern&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;pattern&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;String&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;) -&amp;gt; &lt;/span&gt;&lt;span style=&quot;color: #267f99;&quot;&gt;bool&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt; {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;Self&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;abstract_list&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;pattern&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;chars&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;()) == &lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;Self&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;abstract_list&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #001080;&quot;&gt;s&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;split_whitespace&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;())&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #000000;&quot;&gt;}&lt;br /&gt;&lt;br /&gt;Я чертовски горжусь &lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #795e26;&quot;&gt;abstract_list&lt;/span&gt;. Это функция, которую я осмысленно написал&lt;br /&gt;generic&apos;ом, причём с generic&apos;ом для Item.&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=45539&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/45539.html</comments>
  <category>rust</category>
  <category>leetcode</category>
  <lj:security>public</lj:security>
  <lj:reply-count>13</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/40181.html</guid>
  <pubDate>Sat, 09 Jul 2022 12:36:24 GMT</pubDate>
  <title>Очень странный freesync</title>
  <link>https://amarao.dreamwidth.org/40181.html</link>
  <description>Я обнаружил, что если включить freesync на мониторе, то он рисует а) каждый второй кадр. б) неровно (в смысле, третий кадр может нарисовать, а может и нет). Выключил freesync в настройках, стало всё ровно и быстро - каждый кадр. Смысл в freesync, видимо, только в играх, чтобы экономить на рефреше. Или я его не умею готовить. Или либы.&lt;br /&gt;&lt;br /&gt;Но, зато, я нашёл rust&apos;овую либу для быстрого-быстрого рисования и я уверен в скорости рисования (она выше, чем refresh rate у моего монитора).&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://github.com/amarao/fpscount&quot;&gt;https://github.com/amarao/fpscount&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=40181&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/40181.html</comments>
  <category>мониторы</category>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/35922.html</guid>
  <pubDate>Fri, 29 Apr 2022 18:39:52 GMT</pubDate>
  <title>The most hilarious Rust problem</title>
  <link>https://amarao.dreamwidth.org/35922.html</link>
  <description>&lt;p&gt;Задачка на leetcode: To detect if list has a cycle.&lt;/p&gt;

&lt;p&gt;Для Rust этой проблемы нет. В буквальном и переносном смысле. В Rust&apos;е не может быть канонического списка с циклом, потому что если A владеет B, а B владеет A, то вы просто не можете такой список передать по значению, потому что в таком цикле все владельцы заняты. Более того, если A-&amp;gt;B-&amp;gt;C-&amp;gt;B..., то вы не можете такой список сделать, потому что второго владельца у B не может быть.&lt;/p&gt;

&lt;p&gt;Понятно, что в районе unsafe rust можно и не такого накрутить, и есть Rc, но как каноический список вида Option&amp;lt;Box&amp;lt;Node&amp;gt;&amp;gt; с циклами в Rust не возможен.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=35922&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/35922.html</comments>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/18799.html</guid>
  <pubDate>Thu, 30 Sep 2021 18:24:42 GMT</pubDate>
  <title>Я, конечно, не Ньютон...</title>
  <link>https://amarao.dreamwidth.org/18799.html</link>
  <description>&lt;p&gt;Но вот самоизобретённый алгоритм поиска квадратного корня для int&apos;а (на входе только положительные числа). Надо сказать, от Си его отличает только большая словесность (Ordering::Greater вместо 1).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;use std::cmp::Ordering;

pub fn my_sqrt(x: i32) -&amp;gt; i32 {
    if x == 0 || x == 1{
        return x;
    }
    let x = x as u32;
    let sig_bit_count = 31 - x.leading_zeros();
    let mut working_bit = sig_bit_count / 2;
    let mut root = 1u32 &amp;lt;&amp;lt; working_bit;
    while working_bit &amp;gt; 0 {
        working_bit -= 1;                    
        let candidate = 1 &amp;lt;&amp;lt; working_bit; 
        root += match ((root + candidate) * (root + candidate)).cmp(&amp;amp;x) {
            Ordering::Equal | Ordering::Less =&amp;gt; candidate,
            Ordering::Greater =&amp;gt; 0,
        }
    }
    root as i32
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=18799&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/18799.html</comments>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>2</lj:reply-count>
</item>
<item>
  <guid isPermaLink='true'>https://amarao.dreamwidth.org/18674.html</guid>
  <pubDate>Tue, 28 Sep 2021 12:59:29 GMT</pubDate>
  <title>Rust-строковое</title>
  <link>https://amarao.dreamwidth.org/18674.html</link>
  <description>&lt;p&gt;А вот строки в Rust&apos;е неожиданно сложны. Например, такая простая вещь, как strstr() (поиск начала подстроки в строке) с каждой итераций раздумий всё сложнее и сложнее. Особенно, если делать эффективно.&lt;/p&gt;

&lt;p&gt;Во-первых, мы не можем иметь индекс в строку, потому что размер символа в строке плавает. Во-вторых любые байтовые операции не применимы для вычисления индекса, потому что байты в индекс превращаются нетривиальным образом.&lt;/p&gt;

&lt;p&gt;Итератор chars не очень хороший, потому что он из любого символа (даже 1-байтового) делает 4 байта. Это значит, что для поиска подстроки в гигабайтной строке нам нужно будет перемолотить 4 ГБ в режиме записи (вероятнее всего, в регистр, но всё равно...)&lt;/p&gt;

&lt;p&gt;Т.е. первая задача, которая у нас будет, это реализация считающего Window поверх String/str без копирования. Внутри это указатель на первый символ и байтовая длина (при том, что количество символов в window фиксировано, байтовый размер будет прыгать очень неровно).&lt;/p&gt;

&lt;p&gt;Основываться она должна на str-итераторе по символам. Такой итератор получает &amp;amp;str, после чего начинает возвращать &amp;amp;str в один символ (in-place, без копирования!). Т.е. ещё уровнем ниже, это fat pointer на байты строки, который указывает на начало символа и содержит в себе его длину, кроме того, он содержит в себе (для удобства, видимо), адрес начала строки, и её оригинальный размер.&lt;/p&gt;

&lt;p&gt;Перед тем, как изобретать всё своё с нуля, надо ещё раз перечитать что String и str умеют из коробки (игнорируя существование find и matches, разумеется).&lt;/p&gt;

&lt;p&gt;Чем глубже я в это погружаюсь, тем тоньшее все нюансы становятся. Я чувствую, что пока что я сделаю очень грубо, с использованием Vec&lt;char&gt;.&lt;/char&gt;&lt;/p&gt;

&lt;p&gt;.. Сделал. Получил заслуженные 40мс (нижние 27% всех решений). Нырять в устройства fat pointers я пока не готов.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;pub fn str_str(haystack: String, needle: String) -&amp;gt; i32 {
    if needle.len() == 0 {return 0};
    let haystack_vec: Vec&amp;lt;char&amp;gt; = haystack.chars().collect();
    let needle_vec: Vec&amp;lt;char&amp;gt; = needle.chars().collect();
    let mut pos = 0;
    for candidate in haystack_vec.windows(needle_vec.len()){
        if candidate == needle_vec.as_slice(){
            return pos as i32;
        }
        pos += 1;
    }
    -1
}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=amarao&amp;ditemid=18674&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://amarao.dreamwidth.org/18674.html</comments>
  <category>rust</category>
  <lj:security>public</lj:security>
  <lj:reply-count>7</lj:reply-count>
</item>
</channel>
</rss>
