<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title type="text">Workshop Hub Notes</title>
  <updated>2026-11-06T13:36:52+02:00</updated>
  <generator uri="http://rohea.com" version="0.1">Blog Integration Feed Generator</generator>
  <link rel="alternate" type="text/html" href="https://workshopnotes.vuodatus.net/"/>
  <link rel="self" type="application/atom+xml" href="https://workshopnotes.vuodatus.net/feeds/atom"/>
  <id>https://workshopnotes.vuodatus.net/</id>
  <author>
    <name>Workshop Hub</name>
    <uri>https://workshopnotes.vuodatus.net/</uri>
  </author>
  <entry>
    <title type="html"><![CDATA[Два способа решения: бинарный поиск]]></title>
    <summary type="html"><![CDATA[<p>Разберём решение и посмотрим, как та же задача решается другим способом.</p>
<h2>Задача</h2>
<p>Дан отсортированный список чисел <code>arr</code> и число <code>target</code>. Найти его индекс или вернуть <code>-1</code>, если элемента нет.</p>
<h2>Решение</h2>
<pre><code>
def binary_search(arr: list[int], target: int) -&gt; int:
    lo, hi = 0, len(arr) - 1
    while lo &lt;= hi:
        mid = (lo + hi) // 2
        if arr[mid] == target:
            return mid
        if arr[mid] &lt; target:
            lo = mid + 1
        else:
            hi = mid - 1
    return -1


print(binary_search([1, 3, 5, 7, 9, 11], 7))
</code></pre>
<h2>Как это работает</h2>
<p>На каждом шаге диапазон поиска сокращается вдвое: если середина меньше цели — ищем справа, иначе слева. Отсюда и логарифмическая скорость.</p>
<h2>Пример работы</h2>
<pre><code>
3
</code></pre>
<h2>Сложность</h2>
<p>O(log n) по времени, O(1) по памяти.</p>
<h2>Альтернативный подход</h2>
<p>Ту же задачу часто решают иначе: например, через рекурсию вместо цикла или через стандартную библиотеку вместо ручной реализации. Альтернатива обычно короче, но первое «ручное» решение лучше показывает механику работы алгоритма. Полезно написать оба и сравнить на одинаковых тестах.</p>
<p>Выбор между решениями — это баланс читаемости и скорости: для учебной задачи важнее первый.</p>
<p>---</p>
<p><strong>Related:</strong></p>
<p>- <a href="https://paste2.org/tvIv2pn4" rel="nofollow">مصريات تويتر مقاطع وصور جريئة من حسابات مصرية وعربية</a> - <a href="https://workshopfe622386.vuodatus.net/lue/2026/11/1" rel="nofollow">Рассматриваем задачу: вычисление факториала</a> - <a href="https://workshoptests372558.vuodatus.net/lue/2026/11/6" rel="nofollow">Типичные ошибки при решении: наибольший общий делитель</a> - <a href="https://isc.sans.edu/diary.html/33478#comment" rel="nofollow">yonlibarry-sf</a> - <a href="https://blog.spikyhair.club/oz3ca505/purenudism" rel="nofollow">purenudism</a> - <a href="https://ink.synkosmos.org/ozbbfb7d/tetarracas" rel="nofollow">tetarracas</a> - https://paper.wf/almanovak76log/fantasyuanm - <a href="https://amiller951.wixsite.com/my-site-1/post/alexandra-ayala-xxx" rel="nofollow">alexandra ayala xxx</a> - <a href="https://yakihonne.com/article/naddr1qvzqqqr4gupzp4tul0vsfvv4a3gch6pxuvl2wdsh042fjs3lheafaerw33ls35flqy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0yknywp3xg6kvdnz95ukxwtx956xgefn94skzdps94skzcfs8pjkgwphxajxz9gw497" rel="nofollow">Pure Nudist: My Filipina Wife and I Enjoying Naturism in Private Villa</a> - https://paper.wf/ninakrause79log/ebony-anal-twitter - <a href="https://blogfreely.net/nathannazarov26/turbanli-turk-sakso" rel="nofollow">türbanlı türk sakso</a> - <a href="https://igorc58.wixsite.com/my-site-1/post/porno-egresadas-desnudas" rel="nofollow">porno egresadas desnudas</a> - <a href="https://pastelink.net/omlarlgo" rel="nofollow">سكس مصري مراهقات جديد | نيك مراهقات مصرية فيديو كامل</a> - <a href="https://rimworld.gallery/m/random/t/16309" rel="nofollow">türk türbanlı porno twitter</a> - <a href="https://statics.pancake.vn/web-media-264/1e/21/a5/7a/dd064877957bd77ebe40a2f5d6c9e12b2d9299e8da0a0b59af35a341.pdf" rel="nofollow">bokep tante vs bocah video viral tante dan bocah terbaru</a> - <a href="https://workshopnotes.vuodatus.net/lue/2026/11/3" rel="nofollow">Типичные ошибки при решении: возведение в степень</a> - <a href="https://workshopfe622386.vuodatus.net/lue/2026/11/5" rel="nofollow">Решаем и тестируем: проверка анаграмм</a> - <a href="https://statics.pancake.vn/web-media-264/39/4f/3a/b8/00162df1809163b9f7be39d69783f6493027201a4a66a3e2163354aa.pdf" rel="nofollow">28aca5c9e1a84eb60 - putmega עברית</a> - <a href="https://yakihonne.com/article/naddr1qvzqqqr4gupzpjdv3qdfewgy6xn23pfk9npg2lypj9xzdu99xz70nl8a46jaa2e9qy28wumn8ghj7un9d3shjtnyv9kh2uewd9hszrthwden5te0dehhxtnvdakqzynhwden5te0danxvcmgv95kutnsw43qqtr8v9kxcetj0yknyepjxqckvdtz95ukyce4956xgcmx943rwc3494jryefsv5cnqetpxcmnssztvuu" rel="nofollow">Caine x Kinger The Amazing Digital Circus Photo Gallery</a> - <a href="https://workshoptests372558.vuodatus.net/lue/2026/11/2" rel="nofollow">Осваиваем задачу: решето Эратосфена</a></p>]]></summary>
    <published>2026-11-06T13:36:00+02:00</published>
    <updated>2026-11-06T13:36:52+02:00</updated>
    <link rel="alternate" type="text/html" href="https://workshopnotes.vuodatus.net/lue/2026/11/12"/>
    <id>https://workshopnotes.vuodatus.net/lue/2026/11/12</id>
    <author>
      <name>Workshop Hub</name>
      <uri>https://workshopnotes.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Решаем и тестируем: удаление дубликатов из списка]]></title>
    <summary type="html"><![CDATA[<p>Посмотрим на задачу глазами разработчика: сначала решение, затем убеждаемся в его корректности.</p>
<h2>Задача</h2>
<p>Убрать из списка повторы, сохранив порядок первого появления элементов.</p>
<h2>Решение</h2>
<pre><code>
def unique(arr: list) -&gt; list:
    seen = set()
    result = []
    for x in arr:
        if x not in seen:
            seen.add(x)
            result.append(x)
    return result


print(unique([1, 2, 2, 3, 1, 4]))
</code></pre>
<h2>Как это работает</h2>
<p>Множество <code>seen</code> отвечает за быструю проверку «встречался ли элемент», список <code>result</code> сохраняет порядок. Простое приведение к <code>set()</code> порядок бы не сохранило.</p>
<h2>Пример работы</h2>
<pre><code>
[1, 2, 3, 4]
</code></pre>
<h2>Сложность</h2>
<p>O(n) по времени и памяти.</p>
<h2>Проверка тестами</h2>
<p>Хорошая привычка — проверять решение сразу на нескольких примерах, включая крайние случаи.</p>
<pre><code>
assert is_valid(True) is not None  # базовая проверка вызова
assert is_valid(False) is not None  # и второй случай
</code></pre>
<p>Такой минимум уже защищает от случайной ошибки при правках кода.</p>
<p>Тесты вида assert удобны для учебных задач: они короткие, наглядные и не требуют фреймворков.</p>
<p>---</p>
<p><strong>Related:</strong></p>
<p>- <a href="https://ecency.com/@jirisvoboda1887/nurseli-aksoy-if-a-706cac" rel="nofollow">nurseli aksoy ifşa</a> - <a href="https://workshop1e6ce1ce.vuodatus.net/lue/2026/11/2" rel="nofollow">Проверяем решение тестами: проверка числа на простоту</a> - <a href="https://discuss.tchncs.de/post/65439840" rel="nofollow">AI Generated Anime Hentai Art - Uncensored Hentai Manga &amp; Porn Comics</a> - <a href="https://milhench.com/wp-content/uploads/event-manager-uploads/event_banner/2026/11/desi-aunty-big-boobs-video-e599e4.pdf" rel="nofollow">desi aunty big boobs video</a> - <a href="https://milhench.com/wp-content/uploads/event-manager-uploads/event_banner/2026/11/zooskool-67b483.pdf" rel="nofollow">zooskool - zooskool erotic animal art gallery</a> - <a href="https://avdc.org/wp-content/uploads/event-manager-uploads/event_banner/2026/11/30-14992f.pdf" rel="nofollow">слив алиша леманн 30 горячих фото</a> - <a href="https://escapefromquarantine.com/%E5%B0%8F%E8%A1%A8%E5%A6%B9%E4%B8%8D%E8%83%BD%E8%AF%B4%E7%9A%84%E7%A7%98%E5%AF%86?f=instapaper" rel="nofollow">小表妹不能说的秘密</a> - https://paper.wf/dianakoch92log/skandal-selebgram-cantik-spek-tobrut - https://paper.wf/katyaschulz95log/l-b-mthyr-shhd-fylm-sks-mtrjm - <a href="https://workshopnotes.vuodatus.net/lue/2026/11/5" rel="nofollow">Ловушки новичков при решении: подсчёт частот слов</a> - <a href="https://workshoptests372558.vuodatus.net/lue/2026/11/6" rel="nofollow">Типичные ошибки при решении: наибольший общий делитель</a> - <a href="https://ink.synkosmos.org/oz2337b6/montanasvibe" rel="nofollow">montanasvibe</a> - <a href="https://workshoptests372558.vuodatus.net/lue/2026/11/1" rel="nofollow">Два подхода: числа Фибоначчи</a> - <a href="https://exhibit19956.mataroa.blog/blog/doberman-studio-3d/" rel="nofollow">doberman studio 3d</a> - <a href="https://workshop1e6ce1ce.vuodatus.net/lue/2026/11/1" rel="nofollow">Типичные ошибки при решении: переворот строки</a> - <a href="https://pastebin.com/T7Qrw2ZW" rel="nofollow">Walking through the sum of digits</a> - <a href="https://posts.workshop-hub.workers.dev/reverse-string-oshibki-2" rel="nofollow">Типичные ошибки при решении: переворот строки</a> - <a href="https://paste2.org/FPgBIzbp" rel="nofollow">小表妹不能说的秘密</a> - <a href="https://sway.cloud.microsoft/SHEq1T60muw7246R" rel="nofollow">gracexrayne</a> - <a href="https://contracosta.news/wp-content/uploads/event-manager-uploads/event_banner/2026/11/ganyus-unforgettable-night-1eb10d.pdf" rel="nofollow">Ganyu's Unforgettable Night: Genshin Impact Adult Gallery</a> - <a href="https://posts.workshop-hub.workers.dev/fibonacci-dva-sposoba" rel="nofollow">Два подхода: числа Фибоначчи</a> - <a href="https://workshopfe622386.vuodatus.net/lue/2026/11/2" rel="nofollow">Два способа решения: решето Эратосфена</a> - <a href="https://contracosta.news/wp-content/uploads/event-manager-uploads/event_banner/2026/11/event-890526.pdf" rel="nofollow">голые чеченки</a> - <a href="https://archive34716.mataroa.blog/blog/jellybean-brain-nude-jameliz-benitez-smith-social-media-star-gallery/" rel="nofollow">Jellybean Brain Nude: Jameliz Benitez Smith Social Media Star Gallery</a> - <a href="https://workshoptests372558.vuodatus.net/lue/2026/11/4" rel="nofollow">Разбираем задачу: подсчёт частот слов</a> - <a href="https://nowakkristina88.wixsite.com/my-site-1/post/kannada-sex-conversation--adult-video-gallery-online" rel="nofollow">Kannada Sex Conversation | Adult Video Gallery Online</a></p>]]></summary>
    <published>2026-11-06T09:35:00+02:00</published>
    <updated>2026-11-06T09:35:11+02:00</updated>
    <link rel="alternate" type="text/html" href="https://workshopnotes.vuodatus.net/lue/2026/11/11"/>
    <id>https://workshopnotes.vuodatus.net/lue/2026/11/11</id>
    <author>
      <name>Workshop Hub</name>
      <uri>https://workshopnotes.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Рассматриваем задачу: наибольший общий делитель]]></title>
    <summary type="html"><![CDATA[<p>В этом материале мы спокойно и по шагам разберём учебную задачу на программирование.</p>
<h2>Задача</h2>
<p>Найти НОД двух натуральных чисел <code>a</code> и <code>b</code> — классическая задача школьной математики и один из древнейших алгоритмов.</p>
<h2>Решение</h2>
<pre><code>
def gcd(a: int, b: int) -&gt; int:
    while b:
        a, b = b, a % b
    return a


print(gcd(48, 18))
</code></pre>
<h2>Как это работает</h2>
<p>Алгоритм Евклида: НОД(a, b) = НОД(b, a mod b). Остаток всегда меньше делителя, поэтому числа быстро уменьшаются: (48, 18) → (18, 12) → (12, 6) → (6, 0).</p>
<h2>Пример работы</h2>
<pre><code>
6
</code></pre>
<h2>Сложность</h2>
<p>O(log min(a, b)) по времени, O(1) по памяти.</p>
<p>Такой пример хорошо закрепляется практикой — перепишите решение руками и прогоните на своих тестах.</p>
<p>---</p>
<p><strong>Related:</strong></p>
<p>- <a href="https://privatebin.devol.it/?eda6b9572701890b#Cf9KsqqH657aVQpVr1yvDhncTzx6vjq3CeyqgnJpRqH6" rel="nofollow">1silkc00059</a> - <a href="https://milhench.com/wp-content/uploads/event-manager-uploads/event_banner/2026/11/event-b14817.pdf" rel="nofollow">女王圣水调教图集：女S圣水羞辱男奴，厕奴喝圣水、恋足、坐脸、口舌服务等女王调教高清写真大合集</a> - <a href="https://ecency.com/@jirikral2369/zenci-t-rk-2ab397" rel="nofollow">zenci türk</a> - <a href="https://jaflysilve.freeflarum.com/d/14277-14277-jadehedonic-ts-masturbating-big-dick-with-fleshlight-toy" rel="nofollow">jadehedonic - TS Masturbating Big Dick with Fleshlight Toy</a> - <a href="https://blogfreely.net/nataliarussell2/innocam-amateur-nude-photo-gallery-public-nudity-and-flashing" rel="nofollow">Innocam amateur nude photo gallery | Public nudity and flashing</a> - <a href="https://contracosta.news/wp-content/uploads/event-manager-uploads/event_banner/2026/11/black-money-wallpaper-2a9a43.pdf" rel="nofollow">black money wallpaper</a> - <a href="https://workshoptests372558.vuodatus.net/lue/2026/11/1" rel="nofollow">Два подхода: числа Фибоначчи</a> - <a href="https://montage46057.mataroa.blog/blog/400-09-b22/" rel="nofollow">لعبة مثيرة شاهد فيلم سكس مترجم</a> - <a href="https://milhench.com/wp-content/uploads/event-manager-uploads/event_banner/2026/11/bigboob-porns-e75f08.pdf" rel="nofollow">bigboob porns</a> - <a href="https://privatebin.devol.it/?96498b072cab0585#G2nCa77oeGa6iVfFhND4LwVYDdFKUNx4qfFeskUCfLc6" rel="nofollow">deepdicking</a> - <a href="https://workshop1e6ce1ce.vuodatus.net/lue/2026/11/1" rel="nofollow">Типичные ошибки при решении: переворот строки</a> - <a href="https://workshopnotes.vuodatus.net/lue/2026/11/3" rel="nofollow">Типичные ошибки при решении: возведение в степень</a> - <a href="https://ink.synkosmos.org/oz2337b6/elif-tanyelitan-ifsa" rel="nofollow">elif tanyelitan ifşa</a> - <a href="https://newatsapp.altervista.org/wp-content/uploads/event-manager-uploads/event_banner/2026/11/celebjared-desiree-916595.pdf" rel="nofollow">Desiree Dulce Deep Throat Scenes on CelebJared</a> - <a href="https://workshopnotes.vuodatus.net/lue/2026/11/2" rel="nofollow">Рассматриваем задачу: числа Фибоначчи</a> - <a href="https://gitlab.com/chuongnhuhoa/trusrewre/-/blob/main/articles/is-prime-shagi-mw162kko.md" rel="nofollow">Пошаговый разбор: проверка числа на простоту</a> - <a href="https://paste2.org/AELWFPda" rel="nofollow">Poutyrosee SF: Curvy Goddess Itsrose Nude OnlyFans Leaks</a> - <a href="https://jaflysilve.freeflarum.com/d/14338-14338-k-kisssa" rel="nofollow">_k_kisssa</a> - <a href="https://workshopnotes.vuodatus.net/lue/2026/11/7" rel="nofollow">Частые ошибки при решении: сумма цифр числа</a> - <a href="https://radicle.network/nodes/index.radicle.garden/rad%3Az2pFRdwgbWF1yQFVW7eVgiFN635o9/issues/a74015d67e778b94d55ac9a65fec40e11a3be9d3" rel="nofollow">エロ 漫画 暴走</a></p>]]></summary>
    <published>2026-11-04T01:15:00+02:00</published>
    <updated>2026-11-04T01:15:24+02:00</updated>
    <link rel="alternate" type="text/html" href="https://workshopnotes.vuodatus.net/lue/2026/11/10"/>
    <id>https://workshopnotes.vuodatus.net/lue/2026/11/10</id>
    <author>
      <name>Workshop Hub</name>
      <uri>https://workshopnotes.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Пишем решение с тестами: бинарный поиск]]></title>
    <summary type="html"><![CDATA[<p>Посмотрим на задачу глазами разработчика: сначала решение, затем убеждаемся в его корректности.</p>
<h2>Задача</h2>
<p>Дан отсортированный список чисел <code>arr</code> и число <code>target</code>. Найти его индекс или вернуть <code>-1</code>, если элемента нет.</p>
<h2>Решение</h2>
<pre><code>
def binary_search(arr: list[int], target: int) -&gt; int:
    lo, hi = 0, len(arr) - 1
    while lo &lt;= hi:
        mid = (lo + hi) // 2
        if arr[mid] == target:
            return mid
        if arr[mid] &lt; target:
            lo = mid + 1
        else:
            hi = mid - 1
    return -1


print(binary_search([1, 3, 5, 7, 9, 11], 7))
</code></pre>
<h2>Как это работает</h2>
<p>На каждом шаге диапазон поиска сокращается вдвое: если середина меньше цели — ищем справа, иначе слева. Отсюда и логарифмическая скорость.</p>
<h2>Пример работы</h2>
<pre><code>
3
</code></pre>
<h2>Сложность</h2>
<p>O(log n) по времени, O(1) по памяти.</p>
<h2>Проверка тестами</h2>
<p>Хорошая привычка — проверять решение сразу на нескольких примерах, включая крайние случаи.</p>
<pre><code>
assert is_valid(True) is not None  # базовая проверка вызова
assert is_valid(False) is not None  # и второй случай
</code></pre>
<p>Такой минимум уже защищает от случайной ошибки при правках кода.</p>
<p>С добавлением проверок решение становится самодокументируемым — сразу видно, что код делает.</p>]]></summary>
    <published>2026-11-03T13:20:00+02:00</published>
    <updated>2026-11-03T13:20:55+02:00</updated>
    <link rel="alternate" type="text/html" href="https://workshopnotes.vuodatus.net/lue/2026/11/9"/>
    <id>https://workshopnotes.vuodatus.net/lue/2026/11/9</id>
    <author>
      <name>Workshop Hub</name>
      <uri>https://workshopnotes.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Несколько вариантов решения: проверка анаграмм]]></title>
    <summary type="html"><![CDATA[<p>У большинства учебных задач есть минимум два честных решения — сравним их.</p>
<h2>Задача</h2>
<p>Определить, являются ли две строки анаграммами: состоят из одних и тех же букв с одинаковой частотой.</p>
<h2>Решение</h2>
<pre><code>
def are_anagrams(a: str, b: str) -&gt; bool:
    return sorted(a.lower()) == sorted(b.lower())


print(are_anagrams("listen", "silent"))
</code></pre>
<h2>Как это работает</h2>
<p>Анаграммы дают одинаковые отсортированные последовательности букв. Сортировка — простое и наглядное решение; словарь частот дал бы ту же проверку без сортировки.</p>
<h2>Пример работы</h2>
<pre><code>
True
</code></pre>
<h2>Сложность</h2>
<p>O(n log n) из-за сортировки, O(n) по памяти.</p>
<h2>Альтернативный подход</h2>
<p>Ту же задачу часто решают иначе: например, через рекурсию вместо цикла или через стандартную библиотеку вместо ручной реализации. Альтернатива обычно короче, но первое «ручное» решение лучше показывает механику работы алгоритма. Полезно написать оба и сравнить на одинаковых тестах.</p>
<p>Оба подхода рабочие; важно понимать цену каждого, а не копировать первый попавшийся.</p>]]></summary>
    <published>2026-11-03T13:19:00+02:00</published>
    <updated>2026-11-03T13:19:46+02:00</updated>
    <link rel="alternate" type="text/html" href="https://workshopnotes.vuodatus.net/lue/2026/11/8"/>
    <id>https://workshopnotes.vuodatus.net/lue/2026/11/8</id>
    <author>
      <name>Workshop Hub</name>
      <uri>https://workshopnotes.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Частые ошибки при решении: сумма цифр числа]]></title>
    <summary type="html"><![CDATA[<p>Каждая учебная задача таит пару-тройку грабель; вот они.</p>
<h2>Задача</h2>
<p>Найти сумму цифр натурального числа <code>n</code>, например для 1234 ответ 1 + 2 + 3 + 4 = 10.</p>
<h2>Решение</h2>
<pre><code>
def digit_sum(n: int) -&gt; int:
    total = 0
    while n &gt; 0:
        total += n % 10   # берём последнюю цифру
        n //= 10          # отбрасываем её
    return total


print(digit_sum(1234))
</code></pre>
<h2>Как это работает</h2>
<p>Операция <code>n % 10</code> выделяет последнюю цифру, а целочисленное деление <code>n //= 10</code> убирает её. Цикл продолжается, пока число не станет нулём.</p>
<h2>Пример работы</h2>
<pre><code>
10
</code></pre>
<h2>Сложность</h2>
<p>O(log n) по времени — по числу цифр, O(1) по памяти.</p>
<h2>Частые ошибки</h2>
<p>1. <strong>Не обрабатывать крайние случаи.</strong> Пустой ввод, ноль, отрицательные числа — именно там решение чаще всего ломается. 2. <strong>Смешивать типы данных.</strong> Строки и числа ведут себя по-разному; неявное приведение типов — источник неочевидных багов. 3. <strong>Писать код без проверки на маленьких примерах.</strong> Прогоните решение вручную на 2-3 значениях, прежде чем считать задачу решённой.</p>
<p>Если решение заработало с первого раза — всё равно сверьтесь со списком ошибок: половина багов рождается при доработках.</p>]]></summary>
    <published>2026-11-03T01:11:00+02:00</published>
    <updated>2026-11-03T01:11:43+02:00</updated>
    <link rel="alternate" type="text/html" href="https://workshopnotes.vuodatus.net/lue/2026/11/7"/>
    <id>https://workshopnotes.vuodatus.net/lue/2026/11/7</id>
    <author>
      <name>Workshop Hub</name>
      <uri>https://workshopnotes.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Пишем решение с тестами: решето Эратосфена]]></title>
    <summary type="html"><![CDATA[<p>Разберём решение и сразу накроем его тестами — это хороший стиль работы с кодом.</p>
<h2>Задача</h2>
<p>Найти все простые числа, не превосходящие <code>n</code>. Наивный перебор делителей слишком медленен — есть классический алгоритм-решето.</p>
<h2>Решение</h2>
<pre><code>
def primes_up_to(n: int) -&gt; list[int]:
    sieve = [True] * (n + 1)
    sieve[0] = sieve[1] = False
    for p in range(2, int(n ** 0.5) + 1):
        if sieve[p]:
            for multiple in range(p * p, n + 1, p):
                sieve[multiple] = False
    return [i for i, is_prime in enumerate(sieve) if is_prime]


print(primes_up_to(30))
</code></pre>
<h2>Как это работает</h2>
<p>Список-решето помечает составные числа. Для каждого простого <code>p</code> вычёркиваются его кратные, начиная с <code>p * p</code> — меньшие кратные уже обработаны ранее.</p>
<h2>Пример работы</h2>
<pre><code>
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
</code></pre>
<h2>Сложность</h2>
<p>O(n log log n) по времени, O(n) по памяти.</p>
<h2>Проверка тестами</h2>
<p>Хорошая привычка — проверять решение сразу на нескольких примерах, включая крайние случаи.</p>
<pre><code>
assert is_valid(True) is not None  # базовая проверка вызова
assert is_valid(False) is not None  # и второй случай
</code></pre>
<p>Такой минимум уже защищает от случайной ошибки при правках кода.</p>
<p>С добавлением проверок решение становится самодокументируемым — сразу видно, что код делает.</p>]]></summary>
    <published>2026-11-02T13:18:00+02:00</published>
    <updated>2026-11-02T13:19:03+02:00</updated>
    <link rel="alternate" type="text/html" href="https://workshopnotes.vuodatus.net/lue/2026/11/6"/>
    <id>https://workshopnotes.vuodatus.net/lue/2026/11/6</id>
    <author>
      <name>Workshop Hub</name>
      <uri>https://workshopnotes.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Ловушки новичков при решении: подсчёт частот слов]]></title>
    <summary type="html"><![CDATA[<p>Разберём решение и подводные камни — их обычно не видно в готовом коде из учебника.</p>
<h2>Задача</h2>
<p>Дан текст. Посчитать, сколько раз встречается каждое слово, и вывести слова по убыванию частоты.</p>
<h2>Решение</h2>
<pre><code>
from collections import Counter


def word_count(text: str) -&gt; list[tuple[str, int]]:
    words = text.lower().split()
    return Counter(words).most_common()


print(word_count("a b a c b a"))
</code></pre>
<h2>Как это работает</h2>
<p>Текст разбивается на слова, <code>Counter</code> подсчитывает вхождения за линейное время, а <code>most_common()</code> сразу возвращает отсортированный список пар.</p>
<h2>Пример работы</h2>
<pre><code>
[('a', 3), ('b', 2), ('c', 1)]
</code></pre>
<h2>Сложность</h2>
<p>O(n) по времени по числу слов, O(k) по памяти по числу уникальных.</p>
<h2>Частые ошибки</h2>
<p>1. <strong>Не обрабатывать крайние случаи.</strong> Пустой ввод, ноль, отрицательные числа — именно там решение чаще всего ломается. 2. <strong>Смешивать типы данных.</strong> Строки и числа ведут себя по-разному; неявное приведение типов — источник неочевидных багов. 3. <strong>Писать код без проверки на маленьких примерах.</strong> Прогоните решение вручную на 2-3 значениях, прежде чем считать задачу решённой.</p>
<p>Если решение заработало с первого раза — всё равно сверьтесь со списком ошибок: половина багов рождается при доработках.</p>]]></summary>
    <published>2026-11-02T13:17:00+02:00</published>
    <updated>2026-11-02T13:17:25+02:00</updated>
    <link rel="alternate" type="text/html" href="https://workshopnotes.vuodatus.net/lue/2026/11/5"/>
    <id>https://workshopnotes.vuodatus.net/lue/2026/11/5</id>
    <author>
      <name>Workshop Hub</name>
      <uri>https://workshopnotes.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Медленно и подробно: быстрая сортировка]]></title>
    <summary type="html"><![CDATA[<p>Разложим решение на шаги и объясним, что происходит на каждом из них.</p>
<h2>Задача</h2>
<p>Реализовать быструю сортировку — один из самых известных алгоритмов «разделяй и властвуй».</p>
<h2>Решение</h2>
<pre><code>
def quicksort(arr: list[int]) -&gt; list[int]:
    if len(arr) &lt;= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x &lt; pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x &gt; pivot]
    return quicksort(left) + middle + quicksort(right)


print(quicksort([3, 6, 8, 10, 1, 2, 1]))
</code></pre>
<h2>Как это работает</h2>
<p>Выбирается опорный элемент, массив делится на три части (меньше, равно, больше), затем части сортируются рекурсивно и склеиваются.</p>
<h2>Пример работы</h2>
<pre><code>
[1, 1, 2, 3, 6, 8, 10]
</code></pre>
<h2>Сложность</h2>
<p>O(n log n) в среднем, O(n²) в худшем случае.</p>
<h2>Разбор по шагам</h2>
<p>1. <strong>Шаг 1. Входные данные.</strong> Проверяем, что приходит в функцию, и какие значения считаются корректными. 2. <strong>Шаг 2. Основной цикл.</strong> Именно здесь происходит вся работа; следим за изменениями переменных на каждой итерации. 3. <strong>Шаг 3. Результат.</strong> Убеждаемся, что возвращаемое значение соответствует условию задачи, включая крайние случаи.</p>
<p>Читая чужой код, повторите тот же мысленный разбор по шагам — это самый быстрый способ научиться.</p>]]></summary>
    <published>2026-11-02T01:10:00+02:00</published>
    <updated>2026-11-02T01:10:31+02:00</updated>
    <link rel="alternate" type="text/html" href="https://workshopnotes.vuodatus.net/lue/2026/11/4"/>
    <id>https://workshopnotes.vuodatus.net/lue/2026/11/4</id>
    <author>
      <name>Workshop Hub</name>
      <uri>https://workshopnotes.vuodatus.net/</uri>
    </author>
  </entry>
  <entry>
    <title type="html"><![CDATA[Testing publish state one]]></title>
    <summary type="html"><![CDATA[<p>Testing publish state one</p><p>Body text.</p>]]></summary>
    <published>2026-11-01T14:05:00+02:00</published>
    <updated>2026-11-01T13:13:14+02:00</updated>
    <link rel="alternate" type="text/html" href="https://workshopnotes.vuodatus.net/lue/2026/11/testing-publish-state-one"/>
    <id>https://workshopnotes.vuodatus.net/lue/2026/11/testing-publish-state-one</id>
    <author>
      <name>Workshop Hub</name>
      <uri>https://workshopnotes.vuodatus.net/</uri>
    </author>
  </entry>
</feed>
