<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
  <channel>
    <language>ru</language>
    <title>Задачи умеренной сложности</title>
    <description>Головоломки и задачи с собеседований для новичков и тех, кто еще не набил руку на их решении.</description>
    <link>https://tproger.ru/tag/middle-problems</link>
    <atom:link href="https://tproger.ru/tag/middle-problems/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sun, 27 Sep 2026 21:09:58 GMT</lastBuildDate>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>12</sy:updateFrequency>
    <image>
      <title>Задачи умеренной сложности</title>
      <link>https://tproger.ru</link>
      <url>https://tproger.ru/apple-touch-icon.png</url>
    </image>
    <item>
      <title>Задача про книжного червя</title>
      <link>https://tproger.ru/articles/zadacha-pro-knizhnogo-chervya</link>
      <comments>https://tproger.ru/articles/zadacha-pro-knizhnogo-chervya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ермакова Лиля]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zadacha-pro-knizhnogo-chervya</guid>
      <description><![CDATA[<p>Логическая задачка</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zadacha-pro-knizhnogo-chervya">Задача про книжного червя</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 03 Sep 2026 14:23:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>На курсе по бизнес анализу мне попалась такая задачка. Похоже она достаточно древняя и входит во многие математические сборники. Однако в контексте сбора и уточнения требований задачка заиграла новыми красками.</p><p><b>Задача:</b></p><p>Пятитомник  «История упадка и разрушения Римской империи» Гиббона стоит на полке в обычном порядке. Объем каждой книги 1000 страниц, а общая толщина — 4 см, толщина каждой обложки - 0,1 см. Книжный червь начинает есть бумагу с первой страницы первого тома и ест до последней страницы тома V.</p><p>Необходимо вычислить, сколько см бумаги съел червь.</p><p><b>Дополнительная информация: </b>червь двигается строго по прямой параллельно полке, обложки сделаны из бумаги и червь их ест. Общая толщина тома складывается из 1000 страниц и 2х обложек.</p><p>В 2024 году я пыталась научить нейронные сети решать эту задачу. Никак не получалось ни с подсказками, ни с пошаговым руководством по решению. Теперь, ситуация изменилась, нейронки сразу распознают, что перед ними «классическая» задача, знают ее вариации и знают, как решать.</p>]]></content:encoded>
    </item>
    <item>
      <title>Не только для собеседований: как LeetCode и аналоги помогают новичкам в программировании</title>
      <link>https://tproger.ru/articles/ne-tolko-dlya-sobesedovanij--kak-leetcode-i-analogi-pomogayut-novichkam-v-programmirovanii</link>
      <comments>https://tproger.ru/articles/ne-tolko-dlya-sobesedovanij--kak-leetcode-i-analogi-pomogayut-novichkam-v-programmirovanii?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Диана Тажетдинова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/ne-tolko-dlya-sobesedovanij--kak-leetcode-i-analogi-pomogayut-novichkam-v-programmirovanii</guid>
      <description><![CDATA[<p>Алгоритмические задачи развивают логику, структурное мышление и помогают на собеседованиях и в работе. Узнайте, с чего начать, как избежать выгорания и сохранить мотивацию.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/ne-tolko-dlya-sobesedovanij--kak-leetcode-i-analogi-pomogayut-novichkam-v-programmirovanii">Не только для собеседований: как LeetCode и аналоги помогают новичкам в программировании</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Практика]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Навыки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 21 Aug 2025 14:00:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Многие новички боятся алгоритмических задач. Кажется, что это бустер для кандидатов в Google, которые решают графы на доске маркером, а не для тех, кто только осваивает циклы. Но опыт разработчиков показывает: даже простые задачи могут заметно улучшить качество кода.</p><p>Мы поговорили с экспертами и попросили их поделиться задачами, которые помогут прокачать логику и навыки работы с данными. Заодно узнали, зачем вообще новичку браться за алгоритмы. Решения оставим в комментариях. Не подглядывайте сразу, а сначала попробуйте свои силы.</p><h2>Зачем вообще решать алгоритмические задачи</h2><p>Алгоритмы в начале карьеры нужны не всем. Эксперты честно говорят, что практика на реальных маленьких проектах может дать больше пользы. Но выкидывать алгоритмы из своего обучающего трека точно не стоит, и вот почему.</p><p>Разработчик Валерий Жила говорит, что на алгоритмы можно смотреть по-разному:</p><blockquote>С одной стороны, алгоритмы новичкам не нужны — пусть лучше берутся за практические проекты, даже если это просто репозиторий на GitHub, который можно запустить на локалхосте. С другой — это как классическая литература или высшая математика. Напрямую в работе может не пригодиться, но здорово прокачивает мозги и помогает найти общий язык с другими разработчиками.</blockquote><p>А Константин Шибков, senior Java-разработчик в СДЭК, автор <a href="https://t.me/three_monitors">канала «Три монитора»</a>, вспоминает, что задачи стали для него тренировочным залом для мозгов:</p><blockquote>Когда я был новичком, знаний для полноценного приложения не хватало, а тренироваться хотелось. LeetCode показал мне, когда использовать массивы, деревья, словари, множества, и как эффективно обходить или искать данные. А просмотр чужих решений после своего помогал находить новые приёмы.</blockquote><p>Даже если вы не мечтаете прямо сейчас попасть в Google или Amazon, алгоритмические задачи — это отличная тренировка. Они помогут:</p><ul><li>развить логику и выстроить чёткий план решения,</li><li>натренировать декомпозицию — разбивку сложного на простое,</li><li>мыслить в терминах массивов, графов и деревьев.</li></ul><p>В бигтехе эти навыки проверяют особо тщательно: Яндекс, OZON и другие компании любят устраивать отдельные алгоритмические сессии. Бонусом вы будете готовы и к ним.</p><figure><img src="https://media.tproger.ru/user-uploads/114509/2025-08-15/90914bb0-f966-49e6-aa1e-3c0990809dbb.jpeg" alt="" /></figure><h2>Простые задачи — лучший вход</h2><p>Начинать сразу со сложного или среднего уровня — это как пытаться пробежать марафон без единой тренировки. Эксперты однозначно советуют начинать с чего-нибудь лёгкого. Чем проще задача, тем выше шанс её довести до конца.</p><blockquote>Например, Merge Two Sorted Lists — простая задача, которая учит работать с указателями. Разобравшись, можно попробовать Merge k Sorted Lists — это более сложная задача с тем же базовым подходом.</blockquote><blockquote>Нужно в первую очередь освоить базовые структуры данных. Научиться видеть в них инструмент с понятной и простой функцией, как лопата или молоток.</blockquote><p>Почему простые задачи действительно приносят пользу:</p><ul><li>вы быстро получаете результат и мотивацию продолжать,</li><li>можно сосредоточиться на логике, а не на дебаге сложных условий;</li><li>легче отрабатывать приёмы и паттерны, которые потом повторяются в сложных задачах.</li></ul><h2>Где искать задачи для практики</h2><p>Загляните на специальные онлайн-сервисы для практики алгоритмического программирования. Вот список популярных в русскоязычной среде сайтов:</p><ul><li><a href="https://leetcode.com/">LeetCode</a> — мировой лидер, база задач от простых до сложных для подготовки к интервью</li><li><a href="https://codeforces.com/">Codeforces</a> — сообщество для соревнований и обучения</li><li><a href="https://coderun.yandex.ru/">CodeRun</a> — российская платформа с задачами на алгоритмы и регулярными контестами</li><li><a href="https://acm.timus.ru/">Timus Online Judge</a> — портал с архивом олимпиадных задач, востребованный у студентов и олимпиадников</li><li><a href="https://adventofcode.com/">Advent of Code</a> — ежегодный онлайн-марафон задач в формате адвент-календаря, стилизованный под приключения</li><li><a href="https://www.codewars.com/">Codewars</a> — геймифицированная платформа с заданиями по разным языкам и уровням сложности</li></ul><blockquote>Как-то раз я завалил экзамен по алгоритмам в университете, будучи уверенным, что предмет — элементарный. Взялся за материалы, LeetCode, Advent of Code, Codewars и пару месяцев плотно ими занимался. Решал по 5−10 задач в день. Экзамен я пересдал на отлично. На последующих собеседованиях уже получалось интуитивно нащупывать решения.</blockquote><figure><img src="https://media.tproger.ru/user-uploads/114509/2025-08-15/3383b7e0-2e3c-4157-9f9e-ac37f079a031.png" alt="" /><figcaption>Фишки LeetCode: большое международное комьюнити, 14 языков программирования и возможность получить оффер от IT-гигантов</figcaption></figure><h2>Что решают разработчики, чтобы держать мозг в тонусе</h2><p>Попросили экспертов выбрать задачи, которые они сами считают полезными для развития алгоритмического мышления.</p><p>Валерий Жила:</p><ol><li><a href="https://leetcode.com/problems/two-sum/">Two Sum</a> — найти два числа в массиве, сумма которых равна заданному значению. Чему учит: работать с хэш-таблицами и быстро находить соответствия. Базовый паттерн, который часто встречается в других задачах.</li><li><a href="https://leetcode.com/problems/number-of-islands/">Number of Islands</a> — посчитать количество связных компонент на карте. Чему учит: обходить граф DFS/BFS, думать в терминах связности элементов.</li><li><a href="https://leetcode.com/problems/decode-string/">Decode String</a> — декодировать строку с вложенными структурами. Чему учит: использовать стек, вложенные циклы и парсинг данных.</li></ol><p>Совет: «Если сухой LeetCode наскучил, попробуйте Advent of Code».</p><p>Константин Шибков:</p><ol><li><a href="https://leetcode.com/problems/maximize-distance-to-closest-person/">Maximize Distance to Closest Person</a> — выбрать место в ряду, чтобы максимизировать расстояние до ближайшего соседа. Чему учит: работать с краевыми случаями, искать оптимальную позицию по условию.</li><li><a href="https://leetcode.com/problems/merge-two-sorted-lists/">Merge Two Sorted Lists</a> — объединить два отсортированных списка в один. Чему учит: работать с указателями и аккуратно обрабатывать данные в упорядоченных структурах.</li><li><a href="https://leetcode.com/problems/move-zeroes/">Move Zeroes</a> — переместить все нули в конец массива, сохранив порядок остальных элементов. Чему учит: оптимизировать алгоритм без создания дополнительных структур.</li><li><a href="https://leetcode.com/problems/partition-to-k-equal-sum-subsets/">Partition to K Equal Sum Subsets</a> — разделить массив на K подмножеств с равной суммой элементов. Чему учит: использовать поиск с возвратом, оптимизировать перебор.</li></ol><p>Никита Дубко, старший руководитель продуктов Яндекс Контеста, автор <a href="http://t.me/mefody_dev">канала mefody.dev</a></p><ol><li><a href="https://coderun.yandex.ru/problem/new-year-fruits-2/">Мандарины и апельсины 2.0</a> — выбрать n ящиков так, чтобы в них оказалось не менее половины всех мандаринов и апельсинов. Чему учит: использовать свойства возрастающих последовательностей, минимизировать количество проходов по данным и находить решение без полного перебора.</li><li><a href="https://coderun.yandex.ru/problem/cha_cha/">Ча-ча-ча</a> — определить итоговую оценку по набору буквенных оценок с ограничением, что итог не может быть более чем на балл выше худшей. Чему учит: работать со строками и символами в ASCII/UTF-8, а также применять решение в лоб, когда оно эффективно.</li></ol><p>Совет: «Тренируйтесь не только решать, но и объяснять, почему ваш алгоритм работает и укладывается в ограничения. Этот навык ценят на собеседованиях».</p><h2>Как не сломаться на старте: выгорание и ошибки новичков</h2><p>Практика алгоритмов должна прокачивать мозг, а не выматывать его. Но у многих новичков энтузиазм быстро сменяется усталостью — чаще всего из-за завышенных ожиданий и неверной стратегии.</p><p>Главные ловушки:</p><ul><li>Гонка на износ. План «100 задач за месяц» звучит амбициозно, но в реальности превращается в марафон без подготовки.</li><li>Залипание на одной задаче. Если вы часами бьётесь над решением, азарт сменяется усталостью.</li><li>Кажется, что все остальные ушли далеко вперед. Вы видите только чужие успехи, но не видите их ошибки.</li><li>Синтаксическая ловушка. Новички пытаются угадать код, вместо того чтобы проработать логику на бумаге.</li><li>Держать всё в голове. Легко потеряться в деталях, если не набросать план на бумаге.</li></ul><blockquote>Если задача по зубам, решение само скомпилируется в голове. Иногда полезно просто отойти, попить чаю или лечь спать.</blockquote><p>Что советуют эксперты:</p><ul><li>Решайте по одной задаче в день, как утреннюю разминку для мозга.</li><li>Чередуйте лёгкие и средние задачи, чтобы тренироваться в комфортном темпе, но с небольшим вызовом. Так вы будете расти без ощущения, что тонете.</li><li>Если за час решение не приходит, то посмотрите разбор без кода, а затем напишите свой вариант.</li><li>Отмечайте, какой приём вы отработали — это даёт чувство прогресса.</li><li>Записывайте решение пошагово. Даже опытные разработчики часто начинают с блокнота.</li></ul><blockquote>Я получал удовольствие, когда решал задачу своим способом, проходил все тесты и потом видел в чужом коде приёмы, о которых даже не думал.</blockquote><h2>Как продолжать развиваться</h2><p>Когда лёгкий уровень перестанет пугать, и вы будете уверенно разбираться в массивах, строках и базовых структурах данных, двигайтесь дальше. Как в спорте: если всегда работать с одной гантелью, прогресса не будет.</p><p>1. Освойте новые темы. Начните с самых популярных направлений, которые часто встречаются в реальной разработке и на собеседованиях:</p><ul><li>сортировки,</li><li>графы,</li><li>строковые алгоритмы,</li><li>деревья.</li></ul><p>2. Устройте себе челлендж. Например, «30 задач за 30 дней». Берите не количеством, а регулярностью. Можно чередовать дни по уровням сложности.</p><p>3. Используйте готовые подборки. Есть отличные списки от экспертов. Приведём лишь некоторые из них</p><ul><li><a href="https://seanprashad.com/leetcode-patterns/">LeetCode Patterns</a> — задачи сгруппированы по типам и темам;</li><li><a href="https://leetcode.com/problem-list/oizxjoit/">Blind 75</a> — 75 самых популярных задач для собеседований;</li><li><a href="https://www.geeksforgeeks.org/blogs/gfg160-160-days-of-problem-solving">GfG‑160</a> — 160 задач для тех, кто хочет по-настоящему прокачать алгоритмы</li></ul><p>4. Пробуйте альтернативные платформы. Чтобы не застревать в одном формате, чередуйте площадки. Разные интерфейсы и условия помогут смотреть на задачи с нескольких сторон.</p><figure><img src="https://media.tproger.ru/user-uploads/114509/2025-08-15/fafb8ef0-7b0e-4b0b-bf24-489d7ad426e7.jpeg" alt="" /></figure><blockquote>Однажды на работе мне нужно было распределить посылки по ячейкам постамата так, чтобы максимально эффективно использовать пространство. По сути, это была вариация задачи Partition to K Equal Sum Subsets: разложить элементы по контейнерам без перегруза. Я использовал поиск с возвратом и оптимизацию, которые до этого отрабатывал на алгоритмических задачах. Закрыл задачу быстрее, чем если бы разрабатывал всё с нуля. <br /><br />Но стоит учесть, что код на LeetCode отличается от того, что мы обычно пишем в прод. У нас на работе даже есть локальный мем «по-литкодовски», когда код — максимально короткий, без попытки быть понятным и простым. Главное для него — быть эффективным. Когда переносишь алгоритмы решения в реальный мир, нужно выделять алгоритм в изолированный класс или метод. Так вы сможете проверить его тестами и сделать более понятным для других.</blockquote><h2>Выводы</h2><ul><li>Алгоритмические задачи развивают логику, структурное мышление и умение разбивать проблему на шаги. Навыки пригодятся и на собеседованиях, и в реальной работе.</li><li>Начинать лучше с простых задач, чтобы закрепить основы и избежать выгорания.</li><li>Нужно научиться не только решать задачи, но и объяснять, почему алгоритм работает.</li><li>Ищите задачи на разных платформах, чтобы сохранить интерес и прокачивать навыки в разных форматах.</li><li>Лучше решать по одной задаче в день, чем десяток в выходные.</li><li>Не гонитесь за чужим темпом и чередуйте уровни сложности.</li><li>Личный опыт экспертов показывает, что алгоритмы могут спасти на экзамене и ускорить поиск рабочих решений.</li></ul><p>Читайте также:</p><p><a href="https://tproger.ru/articles/algoritm-dejkstry--kak-rabotaet-i-gde-ispolzuetsya">Алгоритм Дейкстры: как работает и где используется</a></p><p><a href="https://tproger.ru/articles/top-10-algoritmov--kotorye-realno-nuzhny-na-bekende">ТОП-15 алгоритмов, которые реально нужны на бэкенде</a></p><p><a href="https://tproger.ru/articles/chto-takoe-hew-tablicy-i-kak-ih-ispolzovat">Что такое хэш-таблицы и как их использовать</a></p><p><a href="https://tproger.ru/articles/kviz--kakoj-stek-tehnologij-tebe-podhodit-">Квиз: какой стек технологий тебе подходит?</a></p><p><a href="https://tproger.ru/articles/rabochij-plan--kak-izuchit-novyj-stek-za-3-mesyaca">Рабочий план: как изучить новый стек за 3 месяца</a></p>]]></content:encoded>
    </item>
    <item>
      <title>7 легендарных уравнений на JavaScript</title>
      <link>https://tproger.ru/articles/10-legendarnyh-uravnenij-na-javascript</link>
      <comments>https://tproger.ru/articles/10-legendarnyh-uravnenij-na-javascript?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Ирина Тюльпакова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-legendarnyh-uravnenij-na-javascript</guid>
      <description><![CDATA[<p>Математика и компьютерные науки идут рука об руку. Подобрали 7 математических формул разного уровня сложности для проверки — сможете ли вы их реализовать? И на всякий случай снабдили статью нашими решениями.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-legendarnyh-uravnenij-na-javascript">7 легендарных уравнений на JavaScript</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 31 Mar 2024 10:45:56 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы нашли несколько математических формул, которые в своё время внесли значимый вклад в развитие математики, геометрии и физики. Предлагаем разминку для ума: сможете ли вы справиться и реализовать все перечисленные нами формулы?</p><p>Кстати, Kata Academy набирает студентов на обучение JavaScript. Это отличная возможность, так как вы не платите за обучение, пока не устроитесь Javascript-разработчиком! Подробности здесь → <a href="https://tproger.ru/courses/kurs-po-javascript-razrabotke-ot-kata-academy?erid=LjN8KcGuo">Курс по JavaScript-разработке от Kata Academy.</a></p><h2>Теорема Пифагора</h2><p>Начнём с простенькой формулы. Известная всем со школьной скамьи теорема, которая гласит: квадрат гипотенузы равен сумме квадратов катетов в прямоугольном треугольнике. Она широко используется в инженерии (например, архитектуре), физике и информатике.</p><p>Возьмем c как длину гипотенузы, а a и b — длины катетов. Получаем запись a^2 + b^2 = c^2.</p><h2>Логарифмы</h2><p>С логарифмами сталкивались все в старших классах школы — эта функция возведения в степень, только наоборот: у нас есть возведённое в степень число, и мы хотим узнать, в какую степень нужно возвести основание.</p><p>Звучит определение логарифма примерно так: результат логарифма по основанию a от b будет являться такое число c, для которого справедливо a^c = b. Логарифмы, которые записываются без основания как log(x) — натуральные, то есть в его основание будет константа e.</p><p>Сможете реализовать функцию, которая бы проверяла достоверность log(xy)=log(x)+log(y)?</p><h2>Математический анализ</h2><p>f'(x)=lim(h→0)h</p><p>Теперь пример посложнее. Перед вами уравнение определения производной. Сможете реализовать код, который бы аппроксимировал бы производную функцию в заданной точке, вычисляя наклон секущей линии через две точки функции? При условии, что эти две точки находятся очень близко друг к другу.</p><p>Функция derivative() аппроксимирует производную функцию f в точке x. На выходе в примере мы получаем наклон касательной к f(x) = x^2 при заданном x=3. А поскольку производная для квадратичной функции от x всегда равна 2x, мы ожидаем, что скрипт выдаст ответ 6. В реальности, реализованная функция должна выдать очень близкий к нашему значению результат.</p><h2>Универсальный закон всемирного тяготения Ньютона</h2><p>Закон сформулирован следующим образом: сила притяжения прямо пропорциональна произведению их масс и обратно пропорциональна квадрату расстояния между их центрами. Для</p><ul><li>F — вычисляемая сила притяжения;</li><li>G — гравитационная постоянная (6,674 * 10^(-11) Н(м^2)/кг^2);</li><li>m1 и m2 — масса двух объектов;</li><li>r — расстояние между центрами двух масс;</li></ul><p>будет справедлива запись F=G(m1*m2/r^2).</p><h2>Комплексные числа</h2><p>Комплексные числа вселяли в нас ужас — i^2 = -1. Между тем, они часто используются для решения полиномиальных уравнений (то есть таких, в которых используются многочлены типа x^2=x^3).</p><p>Комплексные числа упрощают анализ электрических цепей, облегчают описание квантовой механики и играют ключевую роль в обработке сигналов.</p><p>Реализация комплексных чисел на JavaScript предполагает создание структуры для обработки как действительной, так и мнимой частей комплексных чисел, поскольку JavaScript изначально не поддерживает комплексные числа.</p><p>В нашем примере мы создаём мнимую единицу i в виде комплексного числа с 0 действительной частью и 1 в качестве мнимой, затем возводим i в квадрат чтобы доказать, что результатом будет -1.</p><h2>Нормальное распределение</h2><figure><img src="https://media.tproger.ru/user-uploads/88534/2024-03-29/2aeb39d3-56c8-4873-950b-dc0d38aee765.jpg" alt="" /><figcaption>Тут уж без картинки не обойдёшься</figcaption></figure><p>Основополагающая формула в статистике и теории вероятностей. Она описывает разброс данных вокруг среднего значения.</p><p>Теорема утверждает: сумма многих независимых случайных величин будет приблизительно соответствовать нормальному распределению. Приведенное выше уравнение представляет функцию плотности вероятности нормального распределения, где:</p><ul><li>x — переменная;</li><li>μ — среднее значение распределения;</li><li>σ — стандартное отклонение распределения;</li><li>e — основа натурального логарифма (~2.71828);</li><li>π приблизительно равно 3.14159.</li></ul><p>Сможете написать функцию для вычисления математического ожидания для заданного x?</p><h2>Уравнение Шрёдингера</h2><figure><img src="https://media.tproger.ru/user-uploads/88534/2024-03-29/f27cea60-c373-4e67-8807-3b1d0e0b35f5.jpg" alt="" /></figure><p>Возьмём формулу из квантовой механики. Уравнение Шрёдингера описывает, как квантовое состояние физической системы изменяется со временем. Уравнение предоставляет способ вычисления амплитуды вероятности положения и импульса частиц, позволяя предсказывать множество физических свойств и явлений, таких как уровни энергии, структуры связей и поведение электронов в атомах.</p><p>Реализация этого уравнения на JavaScript, определенно, выходит за рамки простых функций языка. Сможете с ним справиться? Мы не справились, поэтому приводим концептуальное решение.</p><p>Делитесь в комментариях, какие хитрые формулы вы ещё знаете. А если приложите код — то мы обязательно дополним материал вашим примером.</p><p>Интересуетесь новыми возможностями и языками программирования? Возможно, позиция <a href="https://tproger.ru/jobs/sre-inzhener-deckhouse">SRE-инженера в Deckhouse, компании Флант</a>, станет для вас отличным шансом применить свои знания на практике и участвовать в разработке инновационных проектов.</p>]]></content:encoded>
    </item>
    <item>
      <title>10 логико-математических задач для программистов от нейросетей</title>
      <link>https://tproger.ru/articles/10-logiko-matematicheskih-zadach-dlya-programmistov-ot-nejrosetej</link>
      <comments>https://tproger.ru/articles/10-logiko-matematicheskih-zadach-dlya-programmistov-ot-nejrosetej?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Коротков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/10-logiko-matematicheskih-zadach-dlya-programmistov-ot-nejrosetej</guid>
      <description><![CDATA[<p>Попросили ChatGPT и Yandex GPT придумать несколько задач, которые зайдут программистам. Сумеете решить?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/10-logiko-matematicheskih-zadach-dlya-programmistov-ot-nejrosetej">10 логико-математических задач для программистов от нейросетей</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 28 Jan 2024 10:40:54 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы часто предлагаем отвлечься от кода и порешать задачи. В этот раз нам с ними помогли нейросети. Попробуйте решить и напишите свои ответы в комментариях.</p><h2>Задача о хакере и замках</h2><p>Хакер пытается взломать 100 замков на сервере, которые все изначально закрыты. В первый проход, он переключает каждый замок (открытый становится закрытым, закрытый — открытым). Во второй проход, он переключает каждый второй замок. В третий — каждый третий, и так далее до 100-го прохода, где он переключает только 100-й замок. Сколько замков будут открыты после 100-го прохода?</p><h2>Задача о бинарном дереве</h2><p>Дано бинарное дерево, где каждый узел содержит определенное целое число. Напишите функцию, которая будет определять максимальную сумму значений на пути от корня до листьев, так чтобы сумма этих значений была максимально возможной. Учтите, что в бинарном дереве каждый узел имеет не более двух потомков.</p><h2>Задача о сгенерированных паролях</h2><p>Алгоритм генерирует пароли, состоящие из цифр. Каждый новый пароль должен содержать хотя бы одну цифру, которая не входила в предыдущий пароль. Если начать с пароля “1”, каким будет сто первый сгенерированный пароль?</p><h2>Задача о синхронизации данных</h2><p>У вас есть две базы данных, которые должны быть синхронизированы. Однако из-за сбоя сети некоторые записи перестали синхронизироваться. Если каждая запись имеет уникальный идентификатор и время создания, как вы разработаете алгоритм, который минимизирует количество необходимых проверок для восстановления полной синхронизации?</p><h2>Задача о XOR-связи</h2><p>Предположим, что каждое значение в массиве целых чисел представлено в двоичной форме. Напишите функцию, которая находит значение, которое будет получено при XOR-связи всех элементов массива. Рассмотрите оптимизацию для работы с большими массивами.</p><h2>Задача о компиляторе языков</h2><p>Дан набор правил грамматики для создания компилятора некоторого нового программного языка. Каковы будут основные шаги для создания LALR-парсера, и какие сложности могут возникнуть при компиляции языков с амбивалентной грамматикой?</p><h2>Задача о двух компьютерах</h2><p>У вас есть два компьютера, которые начинают одновременно работать над одним и тем же заданием. Первому компьютеру на выполнение задания требуется 4 часа, второму — 6 часов. Спустя какое время после начала работы задание будет завершено, если задание не может быть разделено и каждый компьютер работает с полной производительностью, но с разной скоростью?</p><h2>Задача «Разбитый счётчик»</h2><p>Программист обнаружил, что счётчик на его приложении перестал учитывать каждое пятое нажатие. Если известно, что счётчик показывает 10,000 кликов, сколько кликов было на самом деле, учитывая пропущенные за каждые четыре нажатия?</p><h2>Задача о рекурсивном списке</h2><p>Дан рекурсивно определенный список целых чисел, где каждый элемент равен сумме индекса элемента и значения предыдущего элемента. Программист хочет вычислить n-ный элемент этого списка. Представьте формулу или алгоритм для вычисления n-го элемента, начиная с первого элемента, который равен 0.</p><h2>Задача о оптимальном пути</h2><p>Инженер по программному обеспечению получил карту канализационной сети города в виде взвешенного графа, где узлы представляют соединения, а рёбра — туннели с различной длиной. Как найти кратчайший путь между двумя узлами сети, имея в виду, что некоторые туннели могут временно закрываться для ремонта?</p>]]></content:encoded>
    </item>
    <item>
      <title>7 математических задач на LeetCode для продвинутых</title>
      <link>https://tproger.ru/articles/7-matematicheskih-zadach-na-leetcode-dlya-prodvinutyh</link>
      <comments>https://tproger.ru/articles/7-matematicheskih-zadach-na-leetcode-dlya-prodvinutyh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Мария Кривоченко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/7-matematicheskih-zadach-na-leetcode-dlya-prodvinutyh</guid>
      <description><![CDATA[<p>Собрали несколько математических задач высокого уровня сложности и добавили варианты решения на Python.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/7-matematicheskih-zadach-na-leetcode-dlya-prodvinutyh">7 математических задач на LeetCode для продвинутых</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 26 Jan 2024 15:44:59 GMT</pubDate>
      <content:encoded><![CDATA[<p>LeetCode — одна из самых популярных платформ для решения задач по программированию и подготовки к техническим собеседованиям. Мы выбрали 7 математических задач уровня Medium и Hard и предлагаем вам проверить свои навыки.</p><p>У каждой задачи может быть несколько решений — на разных языках программирования. Мы предложили варианты на Python от участника сообщества.</p><h2>Игра в камни IX</h2><p>Алиса и Боб играют в камни. Они выстроили ряд из n камней, каждому из которых присвоили значение. То есть у них есть массив целых чисел stones, где stones[i] — значение i-го камня.</p><p>Алиса и Боб играют по очереди, Алиса ходит первой. На каждом ходу можно убрать любой камень из stones. Если сумма значений всех убранных камней делится на 3, участник проигрывает. Алиса также проигрывает, если камни заканчиваются.</p><p>Предполагая, что игроки выбрали оптимальные стратегии, верните true, если победит Алиса, и false, если победит Боб.</p><h2>Сколько существует способов достичь пункта назначения через k шагов</h2><p>Вы находитесь на бесконечной числовой оси на точке startPos, положение точки равно положительному целому числу. Цель — прийти к точке endPos, положение которой также равно положительному целому числу. За один шаг вы можете переместиться на одну позицию влево или вправо.</p><p>Вычислите, сколько способов достичь endPos существует, если нужно совершить k шагов (k также равно положительному целому числу)? Количество способов может быть большим, поэтому выведите значение в формате 10^9 + 7.</p><h2>Найдите палиндром определенной длины</h2><p><i>Палиндром — это число, которое читается одинаково справа налево и слева направо.</i></p><p>queries — массив целых чисел; intLength — положительное целое число. Определите массив answer, где answer[i] — либо меньший палиндром  queries[i], длина которого равна intLength либо -1, если такого палиндрома не существует.</p><h2>Сколько прямых линий нужно, чтобы построить диаграмму</h2><p>У вас есть двумерный массив целых чисел stockPrices. stockPrices[i] = [day_i, price_i] — цена акции в день i. Линейный график, отражающий динамику цен, создается из точек stockPrices[i], лежащих на плоскости XY, где ось X — день, а ось Y — цена. Один из таких графиков показан ниже:</p><figure><img src="https://media.tproger.ru/user-uploads/23823/2024-01-26/86a9a875-db15-4f13-ab86-ff33ac841440.png" alt="" /></figure><p>Найдите минимальное число линий, которое нужно, чтобы объединить все точки на плоскости и построить график.</p><h2>Сократить произведение диапазона целых чисел</h2><p>У вас есть два целых числа left и right, где left &lt;= right. Вычислите произведение всех целых чисел, входящих в диапазон [left, right]. Затем сократите произведение, выполнив следующие действия:</p><ul><li>уберите все нули в конце получившегося числа.</li></ul><ul><li>если в получившемся числе больше десяти цифр, представьте его в формате &lt;pre&gt;...&lt;suf&gt;, где &lt;pre&gt; — первые пять цифр, а &lt;suf&gt; — последние.</li></ul><ul><li>представьте получившееся число в виде строки &lt;pre&gt;...&lt;suf&gt;eC.</li></ul><h2>Почитайте число анаграмм</h2><p>У вас есть строка s, в которой находятся одно или несколько слов. Каждая пара слов разделена пробелом.</p><p>Строка t — анаграмма строки s, i-е слово строки t — может быть анаграммой только i-го слова строки s. Например, acb dfe — анаграмма abc def, а def cab и adc bef — нет.</p><p>Вычислите число анаграмм s. Их количество может быть большим, поэтому выведите значение в формате 10^9 + 7.</p><h2>Проверьте, реально ли добраться до точки</h2><p>Есть бесконечно большая сетка. Вы находитесь в точке (1, 1) и должны добраться до (targetX, targetY), используя определенное число шагов. targetX и  targetY — целые числа.</p><p>За один шаг вы можете переместиться из точки (x, y) в любую из следующих:</p><ul><li>(x, y – x);</li></ul><ul><li>(x – y, y);</li></ul><ul><li>(2 * x, y);</li></ul><ul><li>(x, 2 * y).</li></ul><p>Определите, можете ли вы добраться до (targetX, targetY) из (1, 1), верните true, если да, иначе верните false.</p>]]></content:encoded>
    </item>
    <item>
      <title>Сказ о том, как я за год решил более 600 leetcode задач</title>
      <link>https://tproger.ru/articles/skaz-o-tom--kak-ya-za-god-rewil-bolee-600-leetcode-zadach</link>
      <comments>https://tproger.ru/articles/skaz-o-tom--kak-ya-za-god-rewil-bolee-600-leetcode-zadach?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Suleiman Dibirov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/skaz-o-tom--kak-ya-za-god-rewil-bolee-600-leetcode-zadach</guid>
      <description><![CDATA[<p>Личный опыт: как за год решить более 600 задач на LeetCode, пройти coding-интервью в Booking, Careem и Avito и перестать бояться алгоритмических задач. Советы по выбору языка, порядку тем и ресурсам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/skaz-o-tom--kak-ya-za-god-rewil-bolee-600-leetcode-zadach">Сказ о том, как я за год решил более 600 leetcode задач</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 25 Jan 2024 12:23:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>Хочу рассказать вам историю о том, как я начинал с уровня — «не могу решить даже 1 easy задачу из 10» до уровня — «могу решить каждую вторую medium задачу» и прошел несколько coding сессий в таких компаниях как Booking, Careem, Avito…Всем салют!</p><p>Началось все с того, что в конце 2022 года я твердо решил, что хочу устроиться в FAANG компанию, но для этого, как вы наверно все знаете, нужны знания алгоритмов и структур данных, коих у меня не было, потому что в обычной работе тебе не нужны heap, tree, disjoint set и другие структуры данных, поэтому начать пришлось практически с нуля.</p><p>Было очень тяжело, т.к. не знал с чего начинать, по какому принципу решать задачи, что важно, а что не очень, сколько нужно решить задач, чтоб чувствовать уверенность, получится ли вообще перейти на medium задачи, т.к. решение даже easy задач заводило в тупик, ниже постараюсь ответить на все эти вопросы.</p><p>Самое первое, что приходит в голову, когда хочешь начать решать задачи на литкоде — это открыть <a href="https://leetcode.com/problemset/all/">страницу с задачами</a> и начать решать их подряд, но это не очень хорошая идея, даже если вы применили фильтр easy, потому что очень много задач с пометкой easy очень сложно решить и это может сильно демотивировать, а то и понизить самооценку.</p><p>Начинать решать LeetCode нужно не подряд, а по темам: сначала array, hashmap, set — и только потом stack, tree, graphs.</p><p>Если задача не решается за 30–40 минут — смотрите разбор, изучайте решение и возвращайтесь к ней снова. Повторение — ключ к закреплению.</p><p>Python — лучший язык для LeetCode: лаконичный синтаксис и богатая стандартная библиотека (Counter, defaultdict, heapq) экономят время на интервью.</p><p>Уверенность при прохождении coding-интервью появляется примерно после 400–500 решённых задач; 600+ задач снимают страх полностью.</p><h2>Советы</h2><ol><li>Первый совет – обращайте внимание на процент Acceptance, чем этот процент больше, тем лучше, потому что это означает, что у многих людей получается решить эту задачу и есть вероятность, что и у вас получится.Также можете открыть study plan и попробовать решать задачи оттуда:<br /> – <a href="https://leetcode.com/studyplan/top-100-liked/">Топ 100 залайканных задач,</a> если много лайков, значит есть вероятность, что это не какая-то хитросплетеная задача, которая может понизить вашу оценку(есть много задач для которых нужны специфичные знания и это может быть неочевидно с первого взгляда)<br /> – <a href="https://leetcode.com/studyplan/top-interview-150/">Топ 150 задач для подготовки к интервью</a>, вероятность встретить эти задачи на интервью высока, но тут могут быть сложные задачи, которые трудно будет решить в начале пути<br /> – Как пишет leetcode, <a href="https://leetcode.com/studyplan/leetcode-75/">это “Must-do problem list for interview prep”</a>. Задачи в этих списках распределены на разные темы, решать нужно их следуя следующему совету.</li><li>Второй совет – начинайте с самых фундаментальных структур данных, таких как array(одномерный/двумерный), set, hashmap, они будут встречаться вам постоянно, к примеру, во многих задачах время выполнение можно улучшить добавив set или hashmap(но нужно учесть, что увеличится потребление памяти) и только после того как освоите их, можно начинать углубляться в другие структуры как stack, queue, linked list, tree, graphs.<br />На самом leetcode <a href="https://leetcode.com/explore/learn/">есть карточки, в которых дается объяснение структурам данных</a> и алгоритмам + задачи для закрепления этих тем, как и написано выше, начинайте с простых карточек – array, string и постепенно повышайте уровень, я несколько раз возвращался к карточкам, т.к. некоторые моменты порой были непонятны с первого раза, поэтому не думайте, что с вами что-то не так, если что-то непонятно, вернетесь потом и обнаружите, что уже понимаете это.<br /><a href="https://neetcode.io/roadmap">Тут есть roadmap с темами и задачами</a>, очень советую<br /><a href="https://www.techinterviewhandbook.org/grind75">Тут можно создать понедельный план</a> с применением различных фильтров<br /><a href="https://seanprashad.com/leetcode-patterns/">Список из 150 популярных задач</a>, разделенные на темы, сложность и компании</li><li>Третий совет – если не можете придумать оптимальное решение, начинайте с решения “в лоб”, как только получится, подумайте над тем, как это решение можно улучшить, может можно использовать какую-то структуру? может массив можно отсортировать? а что если использовать set или hashmap? можно ли использовать какой-то шаблон? Если ничего не помогает и вы уже потратили 20-40 минут, то смело открывайте решение задачи и изучайте это решение, как только вы это сделали, закройте решение и попробуйте заново решить(таких итераций может быть несколько, это нормально!), если после нескольких итераций не получилось, просто перепечатайте решение(я неоднократно так делал), НО не забудьте через время вернуться к этой задаче и попробовать решить заново(вполне вероятно, что не получится и это тоже нормально, просто повторяете все шаги заново, у меня бывали случаи, когда я одну и ту же задачу решал и по 10 раз, пока точно не буду уверен, что точно понял).</li><li>Четвертый совет – пройдитесь <a href="https://hackernoon.com/14-patterns-to-ace-any-coding-interview-question-c5bb3357f6ed">по этим 14 шаблонам</a>, особенно уделите внимание two pointers, sliding window и fast &amp; slow pointers, т.к. они чаще всего встречаются. Берете шаблон, находите задачи под этот шаблон(на странице с leetcode проблемами есть фильтр по тегам, нужно выбрать нужный тег, к примеру “Two pointers” или “Sliding window” и т.д.) и решаете столько задача, сколько нужно, чтоб закрепить эту тему.</li><li>Пятый и самый важный совет – практика, практика и еще раз практика, в начале мне хотелось каждый раз плакать от своей тупости, потому что не мог решать даже простые задачи и это не преувеличение, фраза – “какой же я тупой” не уходила из головы первые несколько месяцев и даже после решения 600 задач все еще бывают моменты, когда самооценка падает, если не получилось решить какую-то задачу, особенно если оказалось, что решается очень легко, но что важно – с каждой решенной задачей вы будете становиться лучше относительно себя.</li></ol><p>Минус литкода <a href="https://firecode.io/">решили на этой платформе</a>, где задачи даются один за другим, начиная с легких и повторяя уже решенные задачи, чтоб закрепить. Есть объяснение разных тем, после решения задачи можно посмотреть как другие решили, что очень полезно, т.к. ты видишь разные подходы решения одной и той же задачи.</p><h2>FAQ</h2><ol><li>Что делать, если не получается решить задачу?Если после 30-40 минут у вас не получилось решить задачу, то посмотрите решение, попробуйте найти видео решение этой задачи, как только посмотрели и разобрали, попробуйте решить заново, если не получилось, еще раз посмотрите и так по кругу. Время от времени возвращайтесь к старым задачам и решайте их заново, особенно если решение какой-то задачи далось вам с трудом.Я порой одну и ту же задачу решал по 10-15 раз, а то и больше</li><li>Сколько задач нужно решить, чтобы начать откликаться на вакансии?Тут все индивидуально, я полгода каждый день решал(сам или с помощью видео) несколько задач, решил где-то 300 задач и только в этот момент почувствовал почву под ногами, а уверенность почувствовал только после решение где-то 400-500 задач. Некоторым достаточно и 100-200 задач, к сожалению я не из их числа.</li><li>Какой язык программирования выбрать для решения задач?Если коротко – Python.Я начинал решать на php, потом перешел на go, после начал решать на java и наконец <a href="https://www.youtube.com/watch?v=0K_eZGS5NsU">после просмотра видео</a> решил попробовать python и с тех пор решаю на этом ЯП. Java – тратишь время на большие конструкции, к примеру – List&lt;Integer&gt; items = new ArrayList&lt;&gt;();<br />PHP – путался в аргументах функций, неудобно было в целом писать, хотя практически все время пишу на этом языкеGo – мало встроенных функций, даже min/max, теперь уже есть, но тогда не было, также нужно конвертировать int в float и обратно, тратишь лишнее время, хотя код и предсказуемыйPython – лаконичный код, много встроенных функций, которые помогают решать задачи (Counter, defaultdict, divmod, lambda и т.д.), время тратишь именно на решение задачи, а не на печатания и прочее, скорость на собеседовании очень важна.</li><li>Как найти время на задачи?<br />В моем случае я старался решать по 2 задачи в день, одну задачу до начала работы и вторую задачу после работы. На выходных уделял больше времени, смотрел видео, читал статьи, старался решать больше задач, также старался повторно решать старые задачи, чтобы закрепить тему и задачу.</li><li>Нужно ли покупать leetcode premium?<br />Самое полезное у premium – вы можете посмотреть в каких компаниях давали ту или иную задачу, если вы готовитесь к конкретной компании, то рекомендую, иначе достаточно бесплатной версии, т.к. видео объяснение задачи можно найти на канале Neetcode(ссылка ниже) и т.д.</li><li>Стоит ли покупать доступ к educative.io?<br />Очень много видел рекомендаций курса Grokking Coding Interview Patterns от educative, но не нашел этот курс очень полезным, единственное понравилось визуальное объяснение, но на мой взгляд лучше посмотреть видео на ютуб</li><li>Стоит ли покупать доступ к algoexpert.io?<br />На мой взгляд очень полезный ресурс, для каждой задачи есть подробное объяснение, чуть ли не каждое видео по 30-50 минут. На сайте постоянно проходят разные акции и можно ухватить все курсы на год за 99$, адекватная цена, приятный сайт, много тест кейсов для задач и сам редактор приятный и удобный</li></ol><figure><img src="https://media.tproger.ru/user-uploads/96915/2024-01-23/2b2f3e16-2951-4eec-a8ea-0962078e83fe.jpg" alt="" /></figure><h2>Результат</h2><ol><li>Достиг свою изначальную цель, ради которой и начинал решать алгоритмы – прохождение кодинг интервью, один из этапов, которые обязательны в FAANG компаниях, уже прошел в нескольких компаниях и что самое главное – теперь нет страха перед этим этапом.</li><li>Более глубоко начал понимать структуры данных, раньше понятия не имел, что такое heap, а сейчас имею полное представление об этой структуре, а также о других структурах.</li><li>В процессе работы начал чуть иначе смотреть на код, где-то видишь, что можешь использовать больше памяти и сократить time complexity, а где-то наоборот.</li><li>Последнее, но не по важности – фитнес для мозга, перешел из уровня – “не хочу – не буду”, до уровня – “хочу решать задачи каждый день”</li></ol><p>Читайте также на Tproger: <a href="https://tproger.ru/articles/kak-podgotovitsya-k-sobesedovaniyu-v-it-kompaniyu">как подготовиться к техническому интервью в ИТ-компанию</a> и <a href="https://tproger.ru/articles/algoritmy-i-struktury-dannyh-dlya-nachinajushhih">алгоритмы и структуры данных для начинающих</a>.</p><h2>Полезные ссылки</h2><ol><li>Пожалуй <a href="https://www.youtube.com/@NeetCode">самый полезный канал</a>, где человек в доступной форме объясняет задачу и решение.</li><li>Тоже <a href="https://www.youtube.com/@WilliamFiset-videos">очень много полезных видео</a> с объяснениями разных структур данных.</li><li><a href="https://www.youtube.com/c/BackToBackSWE">Объясняет на доске структуры данных, задачи</a>.</li><li><a href="https://www.youtube.com/@insidecode">insidecode</a></li><li><a href="https://www.youtube.com/@geekific/videos">geekific</a></li><li><a href="https://www.youtube.com/@MichaelMuinos/videos">MichaelMuinos</a></li><li><a href="https://www.youtube.com/c/NickWhite/videos">NickWhite</a></li><li><a href="https://www.youtube.com/channel/UCMrgnopgrjjIJn-xyYhZ7nA">Cracking FAANG</a></li></ol>]]></content:encoded>
    </item>
    <item>
      <title>IT-задачи о кофе, switch и шумах</title>
      <link>https://tproger.ru/articles/it-zadachi-o-kofe-switch-i-wumah</link>
      <comments>https://tproger.ru/articles/it-zadachi-o-kofe-switch-i-wumah?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Татьяна Бобкова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/it-zadachi-o-kofe-switch-i-wumah</guid>
      <description><![CDATA[<p>Собрали самые каверзные задачи на тему программирования по Go, C# и QA, которые удивили инженеров Ozon Tech, и делимся решениями.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/it-zadachi-o-kofe-switch-i-wumah">IT-задачи о кофе, switch и шумах</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[C#]]></category>
      <category><![CDATA[Golang]]></category>
      <category><![CDATA[QA]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 12 Dec 2023 08:51:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>В ноябре Ozon Tech и Tproger провели<a href="https://ozontechchallenge.tproger.ru/"> конкурс</a>, в котором участникам не нужно было ничего решать, а наоборот, прислать свои задачи команде инженеров.</p><p>Разобрали решения четырёх лучших задач и предлагаем вам тоже подумать над вариантами.</p><h2>1. Go: нужно ли использовать внешний пул?</h2><p>Дано:</p><ul><li>Master-slave postgres стенд (репликация асинхронная посредством patroni);</li><li>Внешний пул коннекшенов (pgpool/pgbouncer), приконекченный к мастеру.</li><li>Одно/несколько приложений с внутренним реализованным пулером, работающие с внешним пулом из предыдущего пункта.</li></ul><p>Вопросы:</p><ul><li>Не добавляет ли точек отказа наличие внешнего пулера, ведь он не реплицирован как postgres, и в случае его неработоспособности упадёт всё? Как и где архитектурно предусмотреть fallback-механизм для такого?</li><li>Есть ли вообще смысл использовать внешний пул? Если да, то какой, при условии что количество коннекшенов с реплик сервисов (даже с учётом разумной работы автоскейлера, если он есть) разумно и не превосходит значение в конфигурации postgres?</li><li>Предположим, что мы решили отказаться от внешнего пула. На кластере postgres произошёл failover (мастер переключился на реплику). Как быстро приложения переподключатся к новому мастеру? Возможна ли ситуация, что в используемых вами C# и Go пулерах не произойдёт инвалидация коннекшена?</li></ul><p>Автор задачи: Иосиф Петрович</p><p>Если вы хотите сначала решить задачу самостоятельно, то не открывайте решение инженеров сразу.</p><h2>2. C#: сколько кофе пьют коллеги?</h2><p>Разработайте систему для учёта потребления кофе в офисе и автоматического пополнения запаса кофейных зёрен. Система должна учитывать изменение потребительской активности, включая возрастающее потребление при завершении спринтов и снижающееся потребление во время праздничных дней.</p><p>Автор задачи: Александр Катков</p><h2>3. Go: когда лучше использовать оператор switch, а когда if / else?</h2><p>Абстрактный алгоритм в Go можно реализовать оператором switch на четыре варианта событий или четырьмя последовательными if-else. Когда целесообразно сделать через switch и чем тут Go отличается от остальных — С, Java, Kotlin и т. д.?</p><p>Автор задачи: Денис Пащенко</p><p>По его статистике только 10% кандидатов отвечают на вопрос правильно.</p><h2>4. QA: откуда шумы в ШУМе?</h2><p>Когда-то я работал в около-космической сфере. Мы разрабатывали ШУМ — широкополосный усилитель мощности СВЧ. Прибор состоит из трёх модулей:</p><ul><li>алюминиевый корпус, покрытый никелем с впаянными в него разъёмами;</li><li>СВЧ-часть на микрополосках с мощным усилительным транзистором;</li><li>умная система питания с прошивками ПО.</li></ul><p>Я проверял прибор в сборке. Прибор включали на половину мощности, нагревали до +90, охлаждали до -70, трясли сутками, делали вакуум, давление в 10 атмосфер, проверяли на влагостойкость и т. д.</p><p>По итогам проверки приборы показали себя отлично. Пришло время контрольной проверки на максимальную мощность, и тут в сигнале появился шум (паразитный сигнал). Непонятно, откуда он возникал, но этим была поражена вся партия приборов последней сборки.</p><p>Вопрос: как и откуда возникал этот сигнал, и какие действия мы предприняли, чтобы его найти?</p><p>Для меня эта задача оказалась очень сложной, так как пришлось применить все свои знания в материаловедении, микроэлектронике и СВЧ.</p><p>Автор задачи: Илья Баранов</p><p>На время конкурса участники попали в зазеркалье королевства Nozo, где всё происходит наоборот: код пишется слева направо, а тестирование начинается до разработки. Чтобы выбраться из зазеркалья, участники бросили вызов инженерам Ozon Tech и устроили им своё техсобеседование.</p><p>На конкурс прислали больше 90 задач по Go, C# и QA. Мы поделились четырьмя самыми каверзными. Если вы хотите решить задачи остальных участников, переходите <a href="https://ozontechchallenge.tproger.ru/">на сайт конкурса.</a></p><p>Хотя все задачи финалистов были увлекательными, победить и действительно выпить кофе с лидом команды инженеров удалось автору задачи по QA про шумы. Остальные финалисты получили мерч от Ozon Tech. А сколько задач решили вы?</p>]]></content:encoded>
    </item>
    <item>
      <title>Логические задачи для программистов, которые бесят своей простотой</title>
      <link>https://tproger.ru/articles/logicheskie-zadachi-po-programmirovaniyu-kotorye-tolko-kazhutsya-slozhnymi</link>
      <comments>https://tproger.ru/articles/logicheskie-zadachi-po-programmirovaniyu-kotorye-tolko-kazhutsya-slozhnymi?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/logicheskie-zadachi-po-programmirovaniyu-kotorye-tolko-kazhutsya-slozhnymi</guid>
      <description><![CDATA[<p>Собрали каверзные логические задачи с собеседований для SDE. Они кажутся сложными, но на деле довольно простые. Испытайте себя!</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/logicheskie-zadachi-po-programmirovaniyu-kotorye-tolko-kazhutsya-slozhnymi">Логические задачи для программистов, которые бесят своей простотой</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 06 Dec 2023 12:33:53 GMT</pubDate>
      <content:encoded><![CDATA[<p>Составили список каверзных задач по программированию, которые часто встречаются на собеседованиях Software Development Engineer (SDE).</p><p>Сперва они кажутся сложными, и хочется искать мудреные ответы со сложными алгоритмами, но на самом деле они такие простые, что, узнав решение, начинаешь беситься.</p><p>Испытайте себя и узнайте, сможете ли вы найти быстрое и простое решение.</p><p>Оригинальные задачки можно прочесть на сайте <a href="https://www.geeksforgeeks.org/">Geeksforgeeks</a>. В этой статье приведен адаптированный перевод, который мы сделали куда более литературным и чуть более мемным. :)</p><h2>Последний шар в мешке</h2><p>У вас есть мешок, внутри которого 20 красных и 16 синих шаров. Вы должны вытаскивать по два шара из этого мешка за один раз.</p><p>Если шары одного цвета, то вы заменяете их синим шаром, но если они разного цвета, то вы кладете в мешок красный шар. Те шары, которые вы вытащили, в мешок не возвращаются, поэтому их количество в мешке постоянно уменьшается.</p><p>Какого цвета будет последний шар в мешке?</p><h2>Деньрожденный тортик</h2><p>У вас есть День рождения! Поздравляем, черт возьми!</p><p>Гости принесли вам тортик, и его нужно разрезать на 8 равных частей, чтобы каждому гостю достался кусочек. Но вот незадача (или все же задача?..): вы можете сделать только 3 разреза. Как вы это сделаете?</p><h2>Пчела и крушение поездов</h2><p>Два поезда выехали из депо навстречу друг другу. К сожалению, стрелку на путях не перевели, и поезда рано или поздно столкнутся. Железнодорожники этого не заметили, зато заметила прозорливая пчелка. Она летит между поездами, от одного к другому, пытаясь предупредить машинистов.</p><p>Скорость первого поезда составляет 50 км/ч, а скорость второго поезда – 70 км/ч. На старте расстояние между поездами составляет 100 км.</p><p>Сначала пчела летит от первого поезда ко второму. Как только она достигает второго поезда, она сразу же летит обратно к первому поезду. Рассчитайте общее расстояние, которое придется пролететь пчеле. Ее скорость составляет 80 км/ч.</p><h2>Охранник и 100 дверей</h2><p>Охранник работает в большом здании, в котором целых 100 кабинетов и 100 дверей соответственно. Все они изначально закрыты. Поскольку проверить каждый кабинет в течение ночи охранник не успеет, он придумал хитрую систему. Раз в пять минут он проходит вдоль всех кабинетов и открывает или закрывает двери в них следующим образом:</p><ul><li>На первом проходе охранник открывает каждую дверь.</li><li>На втором проходе человек закрывает каждую вторую дверь.</li><li>На третьем проходе человек закрывает каждую третью дверь.</li><li>…</li><li>На 100-м проходе человек открывает или закрывает 100-ю дверь.</li></ul><p>В конце смены охранник должен запереть все двери. Как ему рассчитать, какие двери останутся открытыми в конце?</p><h2>Перепутанные этикетки</h2><p>У вас есть 3 банки с соленьями A, B и C. Вы знаете, что этикетки на них расклеены неправильно. К примеру:</p><ol><li>На банке А висит этикетка “Соленые огурчики”.</li><li>На банке В висит этикетка “Маринованные помидоры”.</li><li>На банке С висит этикетка “Огурчики и помидорки”.</li></ol><p>Вы можете только раз попробовать содержимое одной банки. К примеру, если вы взяли банку “Огурчики и помидорки” и достали помидор, достать второе соленье из той же банки уже не выйдет.</p><p>Каким будет минимальное количество солений, которые вам придется съесть, чтобы понять, как правильно пометить банки?</p><h2>Муравьи в треугольнике</h2><p>На трех углах треугольника сидят 3 муравья. Все муравьи случайным образом выбирают направление и начинают двигаться вдоль края треугольника. Какова вероятность того, что два муравья встретятся?</p><h2>Возраст дочерей</h2><p>Известно, что у синьора Саши есть три дочери. Джун Илюша решил узнать, сколько лет дочкам Саши. Тогда синьор решил загадать джуну загадку, дав три подсказки:</p><ol><li>Произведение их возрастов равно 72.</li><li>Сумма их возрастов равна номеру моего дома.</li><li>Старшая девочка любит клубничное мороженое.</li></ol><p>Подумав, джун Илюша смог угадать возраст. Можете ли вы угадать, сколько лет дочкам Саши?</p><h2>Заключение</h2><p>Надеемся, вам удалось решить все задачки. :)</p><p>Пишите в комментариях, если вы нашли другие, нестандартные решения для задач: они точно есть.</p><p>Если вы сталкивались с логическими задачками на собеседованиях, расскажите, что именно вам встречалось, обсудим! :)</p>]]></content:encoded>
    </item>
    <item>
      <title>Задачи с собеседований для разработчиков в IBM, Amazon и Microsoft</title>
      <link>https://tproger.ru/articles/intervyu-dlya-razrabotchikov-v-ibm-amazon-i-microsoft-raundy-i-zadachi</link>
      <comments>https://tproger.ru/articles/intervyu-dlya-razrabotchikov-v-ibm-amazon-i-microsoft-raundy-i-zadachi?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/intervyu-dlya-razrabotchikov-v-ibm-amazon-i-microsoft-raundy-i-zadachi</guid>
      <description><![CDATA[<p>Собрали отзывы о собеседованиях на должности разработчиков ПО в IBM, Amazon и Microsoft. Составили подборку задач и вопросов от HR.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/intervyu-dlya-razrabotchikov-v-ibm-amazon-i-microsoft-raundy-i-zadachi">Задачи с собеседований для разработчиков в IBM, Amazon и Microsoft</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Microsoft]]></category>
      <category><![CDATA[Карьера]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Amazon]]></category>
      <category><![CDATA[IBM]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 22 Sep 2023 13:26:53 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали отзывы о собеседованиях на должности разработчиков ПО в IBM, Amazon и Microsoft с сайта <a href="https://www.codingninjas.com/">Coding Ninjas</a>.</p><p>Соискатели рассказали, как готовились к интервью, какие задачи решали на первых раундах и на какие вопросы отвечали перед HR.</p><h2>Собеседование в Amazon</h2><p>Автор этого отчета последовательно готовился к собеседованию в “большую пятерку” FAANG еще с обучения в бакалавриате. Также он писал свой диплом так, чтобы он казался более значимым в глазах собеседующих. На подготовку к собеседованиям у автора ушло 3 года, и его взяли на работу.</p><h3>Советы</h3><ol><li>Решайте все задачи по теме “Конкурентное программирование”. Также стоит регулярно решать задачки с сайтов как Leetcode, Interviewbit и Codeforces.</li><li>Регулярно занимайтесь конкурсным программированием.</li><li>Постоянно обновляйте свое резюме. В нем должны быть хотя бы 2-3 проекта хорошего уровня, чтобы впечатлить интервьюера.</li><li>Не врите в резюме.</li></ol><h3>Раунд 1</h3><h3>1. Рассчитать объем воды</h3><p>Дан массив ‘arr’ типа long размера ‘n’. При этом ‘arr[i]’ обозначает высоту столбца ‘i’.</p><p>Рассчитайте объем воды, который можно было бы собрать, если бы из столбцов массива можно было собрать фигуру. Ширина каждого столбца одинакова и равна 1.</p><p>Например, ‘n’ = 6, ‘arr’ = [3, 0, 0, 2, 0, 4]. Тогда ответом будет 10.</p><figure><img src="https://media.tproger.ru/user-uploads/48741/2023-09-22/a2fabd7a-ad52-47c5-bb30-bcf7252a9897.png" alt="" /></figure><p>Нам нужно реализовать функцию, которая высчитывала бы:</p><ol><li>В первой строке целое число ‘n’, обозначающее размер массива/списка.</li><li>Во второй строке ‘n’ целых чисел, разделенных пробелами, представляющих высоту столбиков.</li></ol><p>Вывод должен содержать целое число, обозначающее количество воды, которое может быть собрано.</p><h3>2. Реализация LRU-кеша</h3><p>Разработать и реализовать структуру данных для LRU-кеша для поддержки следующих операций:</p><ol><li>get(key) – Возвращает значение кэша, если он есть в памяти. В противном случае, функция должна вернуть -1.</li><li>put(key, value) – Вставить значение в кэш, если ключа еще не существует, или обновить значение ключа, если ключ уже существует. Перед обновлением элемента кэш должен удалить последнее использованное значение.</li></ol><p>При этом у кэша есть емкость, то есть максимальное количество ключей, которые могут храниться в памяти одновременно. Получение доступа к ключу должно определяться как операция put или get. Также последний использованный или обновленный ключ должен дольше всех храниться в памяти.</p><p>Первая строка ввода должна содержать два разделенных пробелом целых числа ‘C’ и ‘Q’, обозначающих емкость кэш-памяти и количество выполняемых операций соответственно.</p><p>Следующие ‘Q’ строк содержат операции, по одной на строку. Каждая операция начинается с целого числа, обозначающего тип операции.</p><p>Если число равно 0, то операция относится к первому типу, и за ней следует один целочисленный ключ.</p><p>Если число равно 1, то операция относится ко второму типу, и за ней следуют два целых числа key и value (в таком порядке), разделенные пробелами.</p><p>Для каждой операции типа 0 выведите целое число в одной строке, которое обозначало бы значение ключа, если ключ существует, или -1.</p><p>Значение Q не меньше 1 и не больше 10^4. Значение C не меньше 1 и не больше 10^5. В выводе не может быть значения меньше 1 и больше 10^9. Время выполнения операции не должно превышать секунды.</p><h3>Раунд 2</h3><p>На этом раунде присутствовал HR, разговор происходил наедине в Google Meet. Вопросы от HR:</p><ol><li>Кто является для вас примером для подражания?</li><li>Что вы ожидаете от этой работы?</li></ol><h2>Собеседование в IBM</h2><p>Автор этого отзыва готовился к интервью 4 месяца.</p><h3>Советы</h3><ol><li>Отработайте не менее 250 вопросов по программированию и разберитесь с концепциями ОС, сетей и баз данных.</li><li>В резюме должно быть не менее двух хороших проектов.</li><li>Изучите нюансы конкретной компании перед тем, как прийти на интервью.</li><li>Не врите в резюме.</li></ol><h3>Раунд 1</h3><h3>1. Сортировка массива</h3><p>Вам дан массив ‘arr’, состоящий из ‘n’ элементов. Каждый элемент массива равен 0, 1 или 2. Отсортируйте элементы массива в порядке возрастания. Не создавайте новый массив, просто внесите изменения в существующий.</p><p>Ввод должен содержать две строки, в которой первая содержит целое число, обозначающее количество элементов массива, а вторая содержит элементы массива.</p><p>Сперва автор использовал метод сортировки, но интервьюер попросил его не делать этого. Тогда автор просто написал функцию, которая запоминает количество 0, 1 и 2 в массиве.</p><h3>2. Задача об отрезании веревки</h3><p>Дана веревка длиной ‘N’ единиц. Она может быть разрезана на части различной длины, и каждый отрезок имеет свою стоимость. Определите максимальное количество вариантов, на которые можно разрезать веревку, вместе с ценами на каждый отрезок.</p><p>Размеры отрезков могут варьироваться от 1 до N. При этом сумма отрезков должна равняться N.</p><p>Первая строка ввода должна содержать целое число ‘N’, обозначающее длину веревки.</p><p>Вторая строка должна содержать вектор ‘A’ размера ‘N’, который показывает стоимость получившихся отрезков, где каждый индекс массива – это поддлина, а элемент с этим индексом – стоимость для этой поддлины.</p><p>Поскольку длина отрезка не может равняться 0, то нулевой индекс вектора будет представлять первую поддлину отрезка. Следовательно, индекс N-1 будет представлять стоимость для длины ‘N’.</p><h3>Раунд 2</h3><p>Интервьюер спрашивал о проектах, и автор рассказал о них. Затем интервьюер задал несколько вопросов по концепциям ОС.</p><p>Вопросы HR:</p><ol><li>Какие ваши сильные и слабые стороны?</li><li>Кем вы видите себя через 5 лет?</li></ol><h2>Собеседование в Microsoft</h2><p>Автор готовился к собеседованию в течение полугода. В частности, автор решил сделать упор на СУБД и объектно ориентированное программирование.</p><h3>Советы</h3><ol><li>Практикуйтесь в вопросах по структурам данных и алгоритмам. Можете тренироваться на InterviewBit и выполнять все задания по структурам данных и алгоритмам, которые задают на последних интервью.</li><li>Решайте задачи на Leetcode. Также стоит участвовать в еженедельных конкурсах, чтобы знать, какие ваши слабые места нужно улучшить.</li><li>Также стоит изучить основные понятия операционных систем и баз данных.</li><li>Проведите исследование целей компании и будьте готовы задать некоторые вопросы, связанные с компанией, которые покажут ваш интерес к компании.</li><li>Ваше резюме должно состоять в основном из навыков, проектов и достижений.</li><li>Никогда не лгите в своем резюме.</li></ol><h3>Раунд 1</h3><p>В этом раунде были даны три задачи по программированию, на решение которых отводилось чуть больше часа.</p><h4>1. Ближайшее число, кратное 10</h4><p>Вам дано целое число N. Найдите ближайшее к нему число, кратное 10. Если расстояние до чисел равное, выберите меньшее из них. К примеру, если дано число 3, то правильными ответами будут и 30, и 40. В этом случае стоит вывести 30.</p><h3>2. Вычислить день недели</h3><p>Напишите функцию, которая вычисляет день недели для любой даты в прошлом или будущем. К примеру, 28 августа 2020 года приходится на пятницу. Следовательно, ответ должен быть “Пятница”.</p><p>Ввод при этом должен содержать три целых числа, разделенных пробелами, которые обозначали бы день, месяц и год соответственно.</p><p>Вывод должен содержать значения из списка {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}.</p><p>Также есть ограничения по вводу: число дней не должно превышать 31, число месяцев не должно превышать 12, а год не должен превышать 2,000,000. Кроме того, все эти значения не могут быть меньше 1.</p><h4>3. Удалить N значений после M значений</h4><p>У вас есть список и два целых числа «N» и «M». Нужно удалить «N» узлов в списке после количества узлов «M». Иными словами, нужно отсчитать M узлов, после чего удалить N узлов, и так до конца списка.</p><p>Первая строка ввода должна содержать элементы односвязного списка, разделенные одним пробелом. Список должен завершаться -1. Следовательно, -1 никогда не будет элементом списка.</p><p>Вторая строка должна содержать два целых числа ‘N’ и ‘M’, разделенных одним пробелом.</p><p>Вывод должен содержать итоговый список.</p><h3>Раунд 2</h3><p>В этом раунде соискатели должны были написать код на бумаге. Он должен быть полностью рабочим. Можно использовать функции библиотек, но нужно объяснить, зачем они понадобились и как работают.</p><h4>1. Найти элемент последовательности</h4><p>Есть последовательность: 1, 11, 21, 1211, 111221, 312211, 13112221,...</p><p>Она строится так. Первое число читается как “один один”, точнее, как “one One”. Значит, и второе число будет “one one”, то есть 11. Число 11 читается как “two One”, то есть третье число будет равно 21. Число 21 читается как “one Two one One”, то есть четвертое число будет равно 1211. И так далее.</p><p>Нужно написать код, который позволял бы найти N элемент последовательности. При этом N должно быть не меньше 1 и не больше 40.</p><h4>2. Составить самое большое число из элементов массива</h4><p>Вам дан массив ‘ARR’ длины N, состоящий из неотрицательных целых чисел. Используя только эти заданные числа, переставьте их так, чтобы из них составлялось максимально возможное число.</p><p>К примеру, задан массив с элементами ’32’, ‘8’, ’29’. Вы должны расположить числа в порядке ‘8’, ’32’, ’29’. Тогда из них можно будет составить максимальное число 83229. Порядок цифр внутри элементов массива изменить нельзя.</p><h3>Раунд 3</h3><p>На этом этапе интервьюеры общались с каждым соискателем лично, лицом к лицу.</p><h4>1. Упростить путь к файлу</h4><p>Вам дан путь к файлу/каталогу в стиле Unix длиной N. В файловой системе в стиле Unix точка (.) относится к текущему каталогу. Двойная точка (..) относится к предыдущему каталогу относительно текущего каталога. Если между двумя каталогами имеется несколько косых черт, вы должны превратить их в одну косую черту.</p><p>От вас требуется упростить путь и задать конечный пункт в структуре каталогов.</p><p>Упрощенный путь всегда должен начинаться с косой черты (/), а между именами двух каталогов должна быть одна косая черта. На конце пути не должно быть косой черты.</p><p>Ввод должен содержать число Т, которое указывает, сколько каталогов на пути к файлу нужно отобразить. Кроме того, Т не может быть меньше 1 и больше 100.</p><h4>2. Упростить полином</h4><p>В странах бывшего СССР полином называют многочленом. Вам дается полином. К примеру, это будет 5x^3 + 2x^3 + 6x^4 + 2. Нужно упростить его.</p><p>Количество элементов полинома не должно быть равно нулю и превышать 10, а степени чисел и коэффициенты не должны превышать 10^5.</p><h3>Раунд 4</h3><p>На этом этапе интервьюер спрашивал соискателя о его проектах. Вопросы интервьюера:</p><ol><li>Расскажите обо всех своих проектах.</li><li>Какая структура у ваших проектов?</li><li>Как вы проходили летнюю стажировку?</li><li>Что такое линейная регрессия?</li></ol><h3>Раунд 5</h3><p>Этап собеседования с HR. Вопросы:</p><ol><li>Что такое СУБД?</li><li>Объясните ACID.</li><li>Объясните двухуровневую и трехуровневую архитектуру СУБД.</li><li>Что такое независимость от схемы в СУБД?</li></ol><h2>Заключение</h2><p>Надеемся, подборка оказалась полезной. Судя по всему, она предназначена для миддлов: соискатели указывали, что сложности задач была средней, но отнюдь не простой. А получилось ли у вас решить эти задачи?</p><p>Пишите в комментариях, стоит ли и дальше выкладывать подборки задач с интервью и, если стоит, для каких должностей.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 задач с собеседований Amazon для Python-разработчиков</title>
      <link>https://tproger.ru/articles/5-zadach-s-sobesedovanij-ibm-dlya-python-razrabotchikov</link>
      <comments>https://tproger.ru/articles/5-zadach-s-sobesedovanij-ibm-dlya-python-razrabotchikov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-zadach-s-sobesedovanij-ibm-dlya-python-razrabotchikov</guid>
      <description><![CDATA[<p>Составили подборку из 5 задач с собеседований в Amazon, IBM и Apple для Python-разработчиков для джунов и миддлов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-zadach-s-sobesedovanij-ibm-dlya-python-razrabotchikov">5 задач с собеседований Amazon для Python-разработчиков</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 06 Sep 2023 11:55:24 GMT</pubDate>
      <content:encoded><![CDATA[<p>Составили подборку из 5 задач с собеседований в Amazon для Python-разработчиков.</p><p>Они относительно несложные и подойдут для junior и middle программистов, а встретить задачки можно в том числе на собеседованиях в Apple, Samsung, Oracle и IBM.</p><p>В статье собраны решения, которые предложили программисты <a href="https://www.codingninjas.com/">CodingNinjas</a>. Весь код представлен на Python 3.5.</p><h2>Изменить порядок слов</h2><p>Вам дана строка ‘s’ с некоторым количеством слов N. Нужно сделать так, чтобы исходный порядок слов в строке изменился на обратный.</p><p>При этом в исходной строке между словами может быть множество пробелов, но в результате работы скрипта мы должны получить предложение с одним пробелом между словами, без пробелов в начале предложения и после его конца.</p><p>Время выполнения скрипта не должно превышать 1 секунду.</p><h2>Сумма всех чисел до N</h2><p>Вам дано число N. Напишите скрипт, который считал бы сумму всех четных чисел в промежутке от 1 до N, включая N. К примеру, если N равняется 6, то вывод должен быть равен 2+4+6, то есть 12.</p><h2>Палиндромы из чисел</h2><p>У вас есть список из целых чисел. Вам нужно написать скрипт, который определит, является ли последовательность чисел палиндромом. Если это палиндром, нужно вернуть true, а если нет — вернуть false.</p><h2>Заменить пробелы</h2><p>У вас есть строка STR, в которой есть слова с пробелами. Вам нужно заменить пробелы между словами на “@40”.</p><h2>Уровни двоичного дерева</h2><p>Вам дано двоичное дерево, в котором находятся целые числа. Ваш скрипт должен вывести последовательность чисел, которая бы показывала, как он проходил по двоичному дереву.</p><p>При этом количество попыток не должно превышать 100, количество ветвей дерева не должно быть меньше нуля и не должно превышать 1000, а числа дерева не должны быть отрицательными.</p><h2>Заключение</h2><p>Какие задачи из представленных вы смогли решить, не подглядывая под спойлеры? Может быть, задачи оказались сложными для вас? Или, может, вы встречали задачки и посложнее на собеседованиях в компаниях, в которых вы работали? Напишите об этом в комментариях!</p><p>Если вы думаете, что нашли более лаконичные решения задач, опишите их ниже: с радостью их обсудим. 🙂</p>]]></content:encoded>
    </item>
    <item>
      <title>10 логических задач с собеседований, которые заставят задуматься</title>
      <link>https://tproger.ru/articles/zadachi-s-sobesedovanij-kotorye-zastavyat-krepko-zadumatsya</link>
      <comments>https://tproger.ru/articles/zadachi-s-sobesedovanij-kotorye-zastavyat-krepko-zadumatsya?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zadachi-s-sobesedovanij-kotorye-zastavyat-krepko-zadumatsya</guid>
      <description><![CDATA[<p>Составили подборку из 10 логико-математических задач, которые загадывают на рабочих интервью в Microsoft, Google, Amazon, Yahoo и Infosys.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zadachi-s-sobesedovanij-kotorye-zastavyat-krepko-zadumatsya">10 логических задач с собеседований, которые заставят задуматься</a>»</p>]]></description>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Работа]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 05 Sep 2023 10:32:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Составили подборку из 10 логико-математических задач, которые загадывают соискателям во время рабочих интервью в Microsoft, Google, Amazon, Yahoo и Infosys. Мы нашли их на сайте <a href="http://www.crazyforcode.com/brain-teasers/">Crazy for Code</a> и адаптировали для вас.</p><p>Попробуйте решить их самостоятельно, не подглядывая под спойлеры.</p><h2>Отмеряем нужное количество воды</h2><p>Эту задачу могут дать на собеседовании в Amazon. Представьте, что у вас есть две пустых бутыли для воды объемом в 3 и 5 галлонов. Как отмерить ровно 4 галлона воды? Запас воды для решения не ограничен.</p><h2>Самая быстрая лошадь на скачках</h2><p>Задачку дают на собеседованиях Microsoft. У вас есть 25 лошадей и 5 беговых дорожек. Вы не знаете, какая лошадь быстрее другой.</p><p>Найдите за минимально возможное количество забегов тройку самых быстрых лошадей.</p><h2>Делим золотой слиток</h2><p>Это задача с собеседований Amazon. Представьте, что у вас есть сотрудник, который работает на вас в течение семи дней. За всю работу вы должны заплатить ему одним золотым слитком.</p><p>В конце каждого дня вы должны отдавать ему по кусочку золота, то есть 1/7 слитка.</p><p>Как поделить золотой слиток минимальным количеством отрезов, чтобы платить сотруднику по 1/7 части каждый день?</p><h2>Охота лисы за уткой</h2><p>Ещё одна задачка с собеседований Microsoft.</p><p>Лиса охотится за уткой, и последняя приземляется в центр идеально круглого пруда.</p><p>Лиса не может плавать, а утка не может взлететь с воды. Чтобы утка могла сбежать, ей нужно добраться до берега и взлететь. Однако лиса в четыре раза быстрее утки.</p><p>Может ли утка добраться до края пруда и улететь, не будучи съеденной? Если да, то каким образом?</p><h2>Шапки заключённых</h2><p>Задача от Google. Четверо заключенных были арестованы, но тюрьма переполнена, и тюремщику некуда их посадить. Он решает дать им головоломку. Если они справятся, то выйдут на свободу, а если не справятся, то будут казнены.</p><p>Тюремщик выстроил трех человек в линию. Четвертого он посадил за ширму. Каждому заключённому он дал по одной шапке.</p><p>Тюремщик объяснил, что есть две черные и две белые шапочки, и каждый заключенный носит одну из них. При этом каждый из заключенных должен видеть только шапки тех, кто находится перед ним, но не собственные шапки или не шапки тех, кто находится позади. Четвертый человек за ширмой не может видеть шапки других заключённых, а они не видят, какая шапка на его голове. Общаться заключённым тоже нельзя.</p><p>Если кто-либо из заключенных догадается и скажет тюремщику, какого цвета шляпа у него на голове, все четверо будут помилованы. Если кто-то даст неверный ответ, все будут казнены.</p><p>Как заключённым избежать казни?</p><figure><img src="https://media.tproger.ru/user-uploads/48741/2023-09-05/a328c864-a741-48c7-a2e5-14e5183177d6.jpeg" alt="" /></figure><h2>Отравленное вино короля</h2><p>Задача с собеседований Amazon. У короля есть погреб с 1000 бутылок восхитительного вина. Королева по соседству решила убить короля и послала слугу отравить вино. Стражники короля поймали слугу после того, как он отравил только одну бутылку.</p><p>Увы, стражники не знают, в какой именно бутылке находится яд, но знают, что яд настолько сильный, что убьёт короля даже в том случае, если вино разбавят в 100000 раз. Кроме того, яд отравит жертву через месяц после выпитого.</p><p>Король решил заставить заключённых попробовать вино, чтобы выявить отравленную бутылку. При этом король настаивает, что для решения задачи потребуется не более 10 заключенных.</p><p>Задачу нужно решить срочно: через 5 недель у короля юбилей, и он хочет выпить остальные 999 бутылок на королевском рауте.</p><p>Как королю выявить отравленную бутылку при помощи 10 заключённых?</p><h2>Как найти вора</h2><p>Ещё одна задача от Google. Вор пытался скрыться от полиции и забежал в пещеру. Когда полиция зашла в неё, то обнаружила, что внутри по кругу расположены 13 ходов. В одном из них находится вор, который надеется улизнуть.</p><p>Каждый день вор может перемещаться в любой из соседних ходов или остаться на месте и никуда не бежать. При этом каждый день полиции разрешается заходить только в две пещеры по своему выбору.</p><p>Как полиции быстрее всего отыскать вора?</p><h2>Задача о десяти монетах</h2><p>Эту головоломку задают в Yahoo. Вас ослепили и положили перед вами 10 монет. Вам можно трогать монеты, но вы не можете определить на ощупь, какая сторона монеты смотрит вверх.</p><p>Вам сказали, что на столе лежат 5 монет с орлом сверху и 5 монет решкой вверх, но вы не знаете, какие из них именно.</p><p>Как сделать две кучи монет, в каждой из которых одинаковое количество монет смотрят орлом вверх? Вам разрешено переворачивать монеты любое количество раз.</p><h2>Рай или ад</h2><p>Вы умерли и стоите перед двумя вратами. Одна из них ведет в рай, а другая — в ад.</p><p>У каждой двери стоит по одному стражу. Один из них всегда говорит правду, а другой всегда лжет, но вы не знаете, кто из них честен, а кто — лжец.</p><p>Вам нужно найти дорогу в рай, задав одному из стражей только один вопрос. Что это за вопрос?</p><p>Это одна из классических головоломок, задаваемых на собеседовании в Infosys.</p><h2>Тигры и принцессы</h2><p>Суд решил смягчить наказание преступнику, если он сможет решить головоломку.</p><p>Преступник должен открыть одну из дверей. За каждой дверью могут находиться либо принцесса, либо тигр. Также за обеими дверьми могут быть две принцессы или два тигра.</p><p>Если преступник откроет дверь, за которой окажется принцесса, то он женится на ней. Если он откроет дверь, за которой окажется тигр, то будет съеден заживо.</p><p>На каждой из дверей висит табличка. На первой двери написано: “В этой комнате находится принцесса, а в другой — тигр”.</p><p>На второй двери написано: “В одной из этих комнат находится принцесса, а в одной из этих комнат — тигр”.</p><p>Преступнику сказали, что одно из утверждений истинно, а другое — ложно. Какую дверь должен открыть преступник?</p><p>Это — задача с собеседований в Yahoo.</p><h2>Заключение</h2><p>Напишите в комментариях, сколько задач вам удалось решить самостоятельно. Какие задачи понравились вам больше всего?</p><p>Какие из них показались вам простыми, а какие — сложными? Может быть, у вас есть более “тонкие” способы решить их?</p>]]></content:encoded>
    </item>
    <item>
      <title>30+ вопросов с собеседований Apple</title>
      <link>https://tproger.ru/articles/voprosy-s-sobesedovanij-apple</link>
      <comments>https://tproger.ru/articles/voprosy-s-sobesedovanij-apple?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Дух айтишной эмо школы]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/voprosy-s-sobesedovanij-apple</guid>
      <description><![CDATA[<p>Собрали подборку вопросов, которые в Apple задают Data Scientist, QA-инженерам, разработчикам, фронтендерам и продакт-менеджерам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/voprosy-s-sobesedovanij-apple">30+ вопросов с собеседований Apple</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 17 Aug 2023 09:44:15 GMT</pubDate>
      <content:encoded><![CDATA[<p>Apple — одна из крупнейших технологических компаний мира по рыночной капитализации в 3 000 000 000 000 (три триллиона) долларов. Такого успеха Apple удалось достичь благодаря тщательно подобранной командой высококлассных инженеров.</p><p>На своих собеседованиях Apple задаёт вопросы, которые позволяют отобрать лучших программистов с отточенными soft и hard навыками.</p><p>Также Apple делает акцент на коммуникационные способности, на знание структуры данных, алгоритмов и системного дизайна. Кроме того, при составлении вопросов учитываются инновации, последние технологические разработки, рыночные тенденции и требования, специфичные для должности.</p><p>Мы собрали краткую подборку вопросов, которые в Apple задают начинающим Data Scientist-ам, QA-инженерам, разработчикам, фронтендерам и Product Manager-ам.</p><h2>Общие вопросы</h2><h3>1. Какое устройство Apple вы любите больше всего?</h3><p>Этот вопрос направлен на выяснение знания устройств и продукции Apple. Укажите различные устройства Apple, которыми вы пользуетесь, но выделите свое любимое. Распишите его особенности, технологии и преимущества.</p><p>Также расскажите, в чём преимущества устройства перед конкурирующими продуктами: что делает его привлекательным с точки зрения инноваций, дизайна и функциональности.</p><p>Расскажите, как вы планируете применять ваши навыки, чтобы улучшить продукт и компанию.</p><h3>2. Расскажите о случае, когда вы решили разногласия с вашим руководителем.</h3><p>Этот вопрос исследует soft skills кандидата: умение работать в команде, способность решать конфликты и коммуницировать в коллегами. Обязательно упомяните, что вы благодарны тому, чему вас научили ранее.</p><p>“Однажды я не согласился с моим руководителем относительно лучшего способа оказания поддержки клиентам. Вместо того, чтобы понижать его авторитет перед сотрудниками, я поговорил с ним лично в его кабинете. Я предложил свою идею, которая могла бы лучше решить ситуацию. Руководитель согласился, и клиент остался довольным. Эта ситуация научила меня важности открытого общения на рабочем месте.”</p><h3>3. Как бы вы отличили Cocoa от Cocoa Touch?</h3><p>Cocoa Touch и Cocoa — это среды разработки приложений для iOS и OS X. Они обе включают в себя Objective-C runtime, но основные различия заключаются в следующем:</p><ul><li>Cocoa предназначена для разработки под Mac OS, а Cocoa Touch — под iPhone и iPad.</li><li>Cocoa использует фреймворки Foundation и AppKit. Cocoa Touch использует Foundation и UIKit.</li><li>Классы в Cocoa используют префикс NS. Например, класс может называться NSWindow. Cocoa Touch использует префикс UI — UIWindow.</li></ul><h3>4. Какими способами можно достичь параллелизма в iOS?</h3><p>В iOS есть три способа достичь параллелизма:</p><ol><li>Очереди диспетчеризации (Dispatch queues).</li><li>Потоки (Threads).</li><li>Очереди операций (Operation queues).</li></ol><h3>5. Какую библиотеку JSON поддерживает iOS? Каковы ее преимущества?</h3><p>iOS поддерживает библиотеку SBJson. Её основные преимущества:</p><ol><li>Это легкий формат для обмена данными.</li><li>Он легко читается и записывается как компьютерами, так и людьми.</li><li>Поддержка сервером.</li><li>Гибкие API и дополнительный контроль.</li></ol><h2>Вопросы собеседования на должность Data Scientist в Apple</h2><ol><li>Какие существуют виды объединений (joins) в SQL?</li><li>Можно ли выполнить откат (rollback) после использования команды ALTER?</li><li>Чем отличаются команды Truncate и Drop?</li><li>Объясните назначение операторов SELECT и FROM.</li><li>Что бы вы предложили для улучшения Siri?</li></ol><h2>Вопросы собеседования на должность QA-специалиста в Apple</h2><ol><li>Какие шаги вы предпримете для тестирования торгового автомата?</li><li>Как бы вы справились с проблемами масштабируемости (scalability)?</li><li>Расскажите о шагах жизненного цикла ошибки (bug cycle).</li><li>В каких типах тестирования программного обеспечения вы наиболее компетентны?</li><li>Когда бы вы использовали тестирование CRUD?</li><li>Что вы понимаете под термином “матрица прослеживаемости” (traceability matrix)?</li></ol><h2>Вопросы собеседования на должность Product Manager в Apple</h2><ol><li>Что делает вас квалифицированным для этой должности в Apple?</li><li>Как бы вы справились с раздраженным коллегой?</li><li>Как бы вы договорились с клиентом с нереалистическими ожиданиями?</li><li>Если у вас есть задача, с которой вы не знакомы, как быстро вы научитесь ей?</li><li>Apple славится тем, что относится к спискам приложений очень требовательно. Это условие вам нравится? Почему?</li></ol><h2>Вопросы собеседования на должность Front-End Developer в Apple</h2><ol><li>Зачем нужен слой компоновки (composting layer) в CSS3?</li><li>Как бы вы нашли позицию дубликата элемента строки?</li><li>Как браузеры отображают пользовательский интерфейс?</li><li>Какая задача самая сложная для фронтендера?</li><li>На каком языке вы предпочитаете писать фронтенд? Объясните причину выбора.</li></ol><h2>Вопросы собеседования для кодеров в Apple</h2><ol><li>Как проверить полноту заданного двоичного дерева?</li><li>Напишите программу для проверки, является ли любая перестановка заданной строки палиндромом.</li><li>Напишите функцию contains_cycle(), которая показывает, содержит ли список цикл, беря первый узел в односвязном списке и возвращая логическое значение.</li><li>Вам заданы целое положительное число (integer) и target. Напишите программу, которая выводит возможные комбинации целых положительных чисел, сумма которых равна target.</li><li>Есть список интервалов. Объедините пересекающиеся интервалы и получите список, содержащий только взаимоисключающие интервалы.</li><li>Объясните событийно-управляемое программирование на примере языка C.</li><li>Как проверить, установлен ли старший бит в байте?</li><li>Используя корневой узел двоичного дерева, напишите программу, сортирующую “левых” и “правых” children-элементов для каждого узла.</li></ol><h2>Заключение</h2><p>Смогли ответить на вопросы в статье? Напишите в комментариях, кем вы работаете сейчас и какой у вас уровень, и пришлите ваши ответы на вопросы, чтобы сравнить их с ответами других пользователей.</p>]]></content:encoded>
    </item>
    <item>
      <title>Задачи по Java для начинающих</title>
      <link>https://tproger.ru/articles/zadachi-po-java-dlya-nachinayushhih</link>
      <comments>https://tproger.ru/articles/zadachi-po-java-dlya-nachinayushhih?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zadachi-po-java-dlya-nachinayushhih</guid>
      <description><![CDATA[<p>Держите Java задачи с ответами для начинающих разработчиков: подойдут как для практики, так и для подготовки к собеседованию.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zadachi-po-java-dlya-nachinayushhih">Задачи по Java для начинающих</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 20 Jul 2023 11:13:08 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собрали для вас практические задачи по программированию Java для начинающих разработчиков с примерами решений. Это простые задачи с собеседований Java, которые позволят попрактиковаться или самостоятельно подготовиться к интервью.</p><h2>Задача 1</h2><p>Напишите программу, которая выводит на экран числа от 1 до 10.</p><h2>Задача 2</h2><p>Напишите программу, которая находит сумму всех чисел от 1 до 100.</p><h2>Задача 3</h2><p>Найдите факториал заданного числа.</p><h2>Задача 4</h2><p>Напишите проверку, является ли заданное число простым.</p><h2>Задача 5</h2><p>Отсортируйте массив по значению в порядке возрастания и убывания.</p><h2>Задача 6</h2><p>Напишите на Java простой код, который переводит целое число в строку, при том что его можно применить в любой системе счисления.</p><h2>Задача 7</h2><p>Напишите программу, которая инвертирует массив (меняет порядок элементов на противоположный).</p><h2>Задача 8</h2><p>Отсортируйте словарь по значению в порядке возрастания и убывания. Объясните решение.</p><p>Надеемся, вам понравилась подборка задач по Java. Пишите свои варианты решения, а также задачи, которые попадались на собеседованиях вам.</p><p>Также рекомендуем порешать <a href="https://tproger.ru/problems/python-3-exercises-for-beginners-geekbrains/">задачи по Python</a> и <a href="https://tproger.ru/problems/javascript-exercises-for-beginners-geekbrains/">JavaScript</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 логико-математических задач, которые поставят в тупик</title>
      <link>https://tproger.ru/articles/5-logiko-matematicheskih-zadach-kotorye-postavjat-v-tupik</link>
      <comments>https://tproger.ru/articles/5-logiko-matematicheskih-zadach-kotorye-postavjat-v-tupik?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-logiko-matematicheskih-zadach-kotorye-postavjat-v-tupik</guid>
      <description><![CDATA[<p>Собрали для вас пять интересных логико-математических задач, которые кажутся сложными лишь на первый взгляд. Сумеете решить?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-logiko-matematicheskih-zadach-kotorye-postavjat-v-tupik">5 логико-математических задач, которые поставят в тупик</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 23 Mar 2023 12:52:53 GMT</pubDate>
      <content:encoded><![CDATA[<p>А давайте отвлечёмся от кода и перещёлкаем 5 логико-математических задач. Попробуйте решить их в уме и напишите свои ответы в комментариях.</p><h2>1. Возраст мальчика</h2><p>Обилечивая человека, кондуктор поинтересовался, сколько лет его сыну. Человек ответил уклончиво:</p><p>– Моя дочь в пять раз младше моего сына, а моя жена — в 5 раз его старше. Я, в свою очередь, вдвое старше своей жены. Моя мама сегодня отмечает день рождения — ей исполнился 81 год — столько, сколько мне, жене, дочери и сыну вместе взятым.</p><p>Так сколько же лет мальчику?</p><h2>2. Вёдра с водой</h2><p>Стоит два ведра ёмкостью 5 л и 9 л. Из реки необходимо набрать 3 литра воды. Как это сделать, если в распоряжении есть только эти два ведра?</p><h2>3. Лампочки и переключатели</h2><p>Есть две комнаты с низкими потолками. В первой висит три лампы накаливания, а в другой установлено три переключателя. Можно сколько угодно раз щёлкать переключатели, но в комнату с лампочками разрешено перейти только один раз.</p><p>Как узнать, к какому переключателю подсоединена каждая из лампочек?</p><h2>4. Время по верёвкам</h2><p>А как насчёт такой логико-математической задачи? Предположим, у нас есть две верёвки и бесконечное множество спичек. Каждая из этих верёвок сгорает за один час. Но вот беда — горят они неравномерно, поэтому невозможно узнать наверняка, за какое время сгорит какая-то часть веревки.</p><p>Можно ли отмерить этими двумя верёвками 45 минут, и если да, то как это сделать?</p><h2>5. Баночки с таблетками</h2><p>Есть двадцать баночек с таблетками. Почти во всех таблетки весят по 1 г, и только в одной — по 1,1 г. У нас есть точные кухонные весы, с помощью которых нужно определить баночку, каждая таблетка которой весит 1,1 г. Как это сделать, если можно взвесить только 1 раз?</p><p>Понравилось решать логико-математические задачи? Тогда вас могут заинтересовать <a href="https://tproger.ru/articles/10-logicheskih-zadach-s-sobesedovanij-kotorye-zastavjat-zastrelitsja/">хитрые задания на логику с собеседований</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Leetcode 934. Разбор задачи на Python с использованием dfs + bfs</title>
      <link>https://tproger.ru/articles/leetcode-934-razbor-zadachi-s-ispol-zovaniem-dfs-bfs</link>
      <comments>https://tproger.ru/articles/leetcode-934-razbor-zadachi-s-ispol-zovaniem-dfs-bfs?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[hlghl]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/leetcode-934-razbor-zadachi-s-ispol-zovaniem-dfs-bfs</guid>
      <description><![CDATA[<p>Разбираем задачу с сайта Leetcode на языке программирования Python. Решение оказалось лучше 70% всех предложенных пользователями.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/leetcode-934-razbor-zadachi-s-ispol-zovaniem-dfs-bfs">Leetcode 934. Разбор задачи на Python с использованием dfs + bfs</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 18 Feb 2023 08:09:22 GMT</pubDate>
      <content:encoded><![CDATA[<p>Всем привет. Сегодня попробую объяснить моё решение задачи с сайта Leetcode на языке программирования Python.</p><p><b>Формулировка задачи (мой перевод):</b></p><p>Вам дана двоичная матрица размера n x n, где 1 представляет сушу, а 0 представляет воду.</p><p>Остров — это 4-направленно связанная группа 1, не связанная ни с какими другими 1. В сетке ровно два острова.</p><p>Вы можете изменить 0 на 1, чтобы соединить два острова в один остров.</p><p>Возвращает наименьшее количество нулей, которое нужно перевернуть, чтобы соединить два острова.</p><p><b>Официальная формулировка задачи: </b></p><p>1. Для начала я предлагаю найти 1-ый остров в матрице, с помощью обхода в глубину (dfs), если мы нашли элемент 1-го острова, тогда меняем значение в двумерной матрице на 2. Для экономии времени мы будем заранее заполнять очередь для будущего обхода в ширину (bfs).</p><p>2. С помощью обхода в ширину мы найдем кратчайший путь до 2-го острова, для этого мы заполнили очередь координатами элементов 1-го острова.</p><p>Весь код:</p>]]></content:encoded>
    </item>
    <item>
      <title>Решаем популярные задачи с асинхронным кодом на JavaScript: часть вторая</title>
      <link>https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-vtoraja</link>
      <comments>https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-vtoraja?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Oleg Sabitov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-vtoraja</guid>
      <description><![CDATA[<p>Продолжаем разбирать задачи с асинхронным кодом в JS. В этой статье рассмотрим порядок попадания задач в Event Loop и оптимизацию кода.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-vtoraja">Решаем популярные задачи с асинхронным кодом на JavaScript: часть вторая</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Асинхронное программирование]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 02 Feb 2023 12:51:17 GMT</pubDate>
      <content:encoded><![CDATA[<p>В первой части текста мы вспомнили, как устроен цикл событий и разобрали несколько простых задач на асинхронное программирование на JS. В этой статье преподаватель Elbrus Bootcamp Денис Образцов разберёт более сложные примеры на порядок попадания задач в Event Loop и оптимизацию кода.</p><h2>Задача первая</h2><p>Разберём задачу подробно. В первой строке объявляется переменная без присвоения значения, после которой создаётся promise и вывод в консоль значения a. Все перечисленные строки — это синхронный код, поскольку сам по себе promise не является асинхронным.</p><p>После этого ей присваивается значение: a = 25. Следующим шагом появляется таймер setTimeout, внутри которого вывод значения переменной в консоль и функция resolve, в которую вкладывается переменная ‘a’ для успешного исполнения promise c задержкой в 100 миллисекунд.</p><p>Если предыдущий таймер находился внутри promise, то второй setTimeout написан как отдельная функция. Здесь переменной ‘a’ присваивается новое значение, которое выводится в консоль с задержкой в 100 миллисекунд. На последних трёх строчках — обработка promise через then, которая завершается выводом консоли. Очередность вывода и переменная ‘a’ будут выглядеть следующим образом:</p><p>С точки зрения очерёдности самая запутанная часть задачи — promise, внутри которого находится setTimeout. Базово таймер относится к макрозадачам, которые попадают в Call Stack последними и выполняются в последнюю очередь. Поскольку в этой задаче он находится внутри promise — микрозадачи, которая выполняется раньше, — в вывод он попадёт третьим. Сразу после того, как отработал весь синхронный код.</p><p>Если говорить о значениях, которые выводятся в консоль, то в первой строке будет undefined, поскольку никакое значение на этом этапе переменной не присвоено. Это произойдёт только в следующей строке. Консоль, которая выполняется во вторую очередь, выдаст значение 25, так как она расположена в конце кода, и к моменту её появления значение переменной уже присвоено. В следующих выводах в консоль выводится значение переменной.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/3a49b6fa-1bd6-4cc1-ab55-fb5609b32993.jpg" alt="" /></figure><p>Больше задач и историй студентов — в нашем Telegram-канале @Elbrus Bootcamp</p><h2>Задача вторая</h2><p>В этой задаче появляется функция async. Прежде чем приступить к разбору, вспомним, для чего она нужна.</p><p>Функция async позволяет работать с асинхронным кодом так, будто он синхронный. Синхронный код не работает с асинхронным, но в пределах функции async возможно сделать вид, что так можно. Для этой задачи важно отметить, что любая async-функция сразу же возвращает promise. В паре с async идёт ключевое слово await, которое буквально означает «дождись». Сама по себе async-функция, как и promise — не является асинхронной.</p><p>Перейдём к разбору кода. В первой строке находится функция resolveAfter2Seconds, которая принимает аргумент x, выводит его значение в консоль и возвращает его в promise с задержкой в пять секунд.</p><p>Далее следует функция async. Внутри неё — синхронная консоль, за которой следуют две асинхронные функции, которые «дожидаются» своего выполнения через await. Результат их поочередного выполнения попадает в promise, а аргумент x приобретает значение сначала ‘a’, а затем — ‘b’. Затем выводится результат Bye.</p><p>В последней строчке функции указан вывод результата. Так как любая async возвращает promise, в return не удастся получить конкретного результата. Вместо него мы получим promise pending — ожидание. Then в последней строчке — обработчик этого pending.</p><p>В результате порядок выполнения будет следующим:</p><p>Этот код работает медленно: чем больше внутри async-функции add1 вызовов функций resolveAfter2Seconds с ожиданием (await), тем больше времени займёт его выполнение. Если вызовов два, то он будет выполняться 10 секунд. Если их будет 10, ждать придётся почти минуту.</p><p>Попробуем переписать код и сократить время ожидания. Поставим все вызовы в очередь без await, чтобы они выполнялись все одновременно за пять секунд:</p><p>Теперь мы дожидаемся выполнения всех функций уже в конце и только после этого показываем конечный результат. В результате оптимизации ждать придётся не 20 секунд, а всего пять.</p><p>Реклама ООО “Эльбрус Буткемп”</p>]]></content:encoded>
    </item>
    <item>
      <title>Решаем популярные задачи с асинхронным кодом на JavaScript: часть первая</title>
      <link>https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-pervaja</link>
      <comments>https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-pervaja?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Oleg Sabitov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-pervaja</guid>
      <description><![CDATA[<p>В статье разобрали популярные задачи с асинхронным кодом, которые могут попасться начинающему Frontend-разработчику на собеседованиях.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/reshaem-populjarnye-zadachi-s-asinhronnym-kodom-na-javascript-chast-pervaja">Решаем популярные задачи с асинхронным кодом на JavaScript: часть первая</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Асинхронное программирование]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 25 Jan 2023 14:43:29 GMT</pubDate>
      <content:encoded><![CDATA[<p><b>На собеседованиях начинающим Frontend-разработчикам часто попадаются задачи на асинхронный код. Преподаватель Elbrus Bootcamp Денис Образцов выбрал несколько популярных задач, с которыми наши выпускники часто сталкиваются на интервью, и разобрал логику их решения. </b></p><p><i>В первой части текста вспомним, как устроен цикл событий и разберём несколько базовых задач на логику и внимательность. Во второй части перейдём к более сложным примерам на порядок попадания задач в Event Loop и оптимизацию кода.</i></p><h2>Как устроен цикл событий</h2><p>Машина читает код дважды: сначала в память компьютера записываются переменные, потом происходит непосредственное выполнение кода. Часто задач в коде несколько: они попадают в цикл событий (Event Loop) и выполняются в определённой последовательности.</p><p>Последовательность задаётся типом кода: синхронным или асинхронным. В случае с синхронным кодом все задачи попадают сразу в Call Stack и выполняются по очереди.</p><p>Асинхронный код используется, например, когда программе нужно обратиться к базе данных или другому внешнему источнику информации. Этот процесс можно сравнить с телефонным звонком: когда вы звоните кому-то, вы заранее не знаете, когда вам ответят — после первого гудка, после пятого или вообще не возьмут трубку.</p><p>С асинхронным кодом сложнее: во-первых, он всегда выполняется после синхронного, а во-вторых, делится ещё на две очереди — макро- и микрозадачи.</p><p>Микрозадачи — в основном, промисы, которые выполняются в первую очередь. Большие задачи (например, таймеры, AJAX-запросы) попадают в самый конец стека и выполняются последними.</p><p>Теперь, когда мы вспомнили теорию, перейдём к разбору задач на понимание асинхронного кода, которые могут попасться на собеседовании. Все задачи рассчитаны на джунов и собраны командой Elbrus Bootcamp на реальных интервью.</p><figure><img src="https://media.tproger.ru/uploads/2023/04/3a49b6fa-1bd6-4cc1-ab55-fb5609b32993.jpg" alt="" /></figure><p>Больше задач и историй студентов — в нашем Telegram-канале @Elbrus Bootcamp</p><h2>Задача первая</h2><p>Прежде чем разбирать код, рассмотрим пример, к которому мы будем возвращаться на протяжении всей статьи. Он поможет глубже понять принцип работы асинхронного кода.</p><p>Представьте, что вы пришли в фастфуд, сделали заказ, получили специальный пульт и ждёте, пока пульт завибрирует и можно будет пойти и забрать заказ.</p><p>В первой строке кода мы видим promise — это специальный объект, который даёт обещание, что в будущем будет выполнено то или иное действие. Promise выступает аналогом такого пульта и в данном случае обещает уведомить не о готовности заказа, а об ошибке, если она возникнет.</p><p>Под promise прописан вариант развития событий — reject, который выводит в консоль сообщение «Всё сломалось» в случае, если что-то пошло не так. Второй, положительный, вариант resolve в этой задаче не указан.</p><p>Вернёмся к примеру с фастфудом: вы сели за столик и ждёте заказ. Через некоторое время пульт завибрировал. Дальше может быть несколько вариантов развития событий: вы успешно получите заказ или кассир позовёт вас сообщить, что какого-то ингредиента нет и блюдо не смогут приготовить. На этот случай и нужны resolve и reject.</p><p>Следующий шаг — встать и подойти к стойке. За него отвечают обработчики .catch, которые в коде идут в цепочке друг за другом. Это важный момент: между обработчиками нет точки с запятой, и цепочка идёт сразу после объявления переменной ‘p’, поэтому выполняется только первый .catch. Второй выполняет те же действия и не срабатывает.</p><p>Это сравнительно простая задача: в ней нет смешивания синхронного и асинхронного кода. В консоли мы получим результат выполнения promise, а затем — вывод первого .catch.</p><h2>Дополнение первое</h2><p>Здесь происходит то же самое, что и в базовом варианте задачи, но с исключениями. Есть два обращения к константе ‘p2’, нет цепочки, между .catch появилась точка с запятой, поэтому в консоль выводится результат обоих обработчиков.</p><p>Стоит отметить, что смысла в этом немного: обработчики отлавливают одну и ту же ошибку. Но эта задача скорее на внимательность, чем на логику.</p><h2>Дополнение второе</h2><p>В этой версии задачи есть then. Здесь это обработчик положительного результата (resolve), который не выполняет никакую функцию, в этом коде он бесполезен. В тексте задачи по-прежнему упоминается только негативное развитие событий. Поэтому вывод в консоль будет тот же, что и в предыдущей задаче.</p><h2>Задача два</h2><p>Разберём текст задачи. В первой строчке указан таймер setTimeout с нулевой задержкой, следом идут два promise: c пустой функцией обработки положительного ответа и без функции.</p><p>Здесь then — обработчик первого promise, который получает результат выполнения resolve. В последних строчках — консоль завершения и консоль, которая выводит результат выполнения второго promise.</p><p>Вспомним, в каком порядке код попадает в Call Stack. В первую очередь выполняется синхронный код: console.log или promise. По дефолту они не асинхронные, пока вы не сделаете их таковыми (например, добавите .catch или .then).</p><p>Таким образом, вывод консоли будет иметь следующий порядок:</p><p>Строки с консолями внутри promise выполнятся в первую очередь, поскольку в них нет ничего асинхронного, так как promise сам по себе изначально синхронный. Затем выполняются синхронная консоль ‘End’ и консоль, в которой показывается второй promise, находящийся в стадии ожидания ().</p><p>Далее выполняется .then. В базовом варианте promise выполняется синхронно. Только после того, как весь синхронный код отработал, выполняется его асинхронный обработчик. В последнюю очередь выполнится макрозадача с setTimeout.</p><h2>Задача три</h2><p>В этой задаче первый и последний console.log синхронные, поэтому они выполнятся сразу. Следом идёт promise с двумя обработчиками, которые выстроены в цепочку и выполняются друг за другом. Обратите внимание, что между ними нет точки с запятой. В последнюю очередь выполняется setTimeout, поскольку это макрозадача.</p><p>Эти задачи рассчитаны на базовое понимание работы асинхронного кода. В следующей части статьи разберём более сложные кейсы и оптимизируем скорость выполнения задач в Call Stack.</p><p>Реклама ООО “Эльбрус Буткемп”</p>]]></content:encoded>
    </item>
    <item>
      <title>Три задачи на знание Java от ChatGPT</title>
      <link>https://tproger.ru/problems/tri-zadachi-na-znanie-java-ot-chatgpt</link>
      <comments>https://tproger.ru/problems/tri-zadachi-na-znanie-java-ot-chatgpt?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Рафаил Агазода]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/tri-zadachi-na-znanie-java-ot-chatgpt</guid>
      <description><![CDATA[<p>Языковая модель ChatGPT составила простую, среднюю и сложную задачи по Java. Сможете ли вы решить все три задачи?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/tri-zadachi-na-znanie-java-ot-chatgpt">Три задачи на знание Java от ChatGPT</a>»</p>]]></description>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Нейронные сети]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 23 Jan 2023 12:30:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>Попросили языковую модель ChatGPT составить три задачи на знание Java: простую, среднюю и сложную.</p><p>К первым двум нейросеть прикрепила ответы, но третья задача осталась нерешённой. Сможете ли вы справиться с ней?</p><h2>Простая задача по Java</h2><p>Напишите программу на Java, которая будет считывать массив целых чисел и выводить на экран их сумму и среднее арифметическое.</p><p>Подсказки:</p><ul><li>Для считывания массива целых чисел используйте Scanner или BufferedReader.</li><li>Для вычисления суммы и среднего арифметического используйте цикл for.</li><li>Не забудьте проверить ввод на корректность (например, что введено число и не превышает максимально возможное значение для int).</li></ul><h2>Задача средней сложности по Java</h2><p>Напишите класс “Решето Эратосфена” для нахождения всех простых чисел в диапазоне от 2 до n. Класс должен иметь метод “просеивание” для построения решета и метод “вывод” для вывода всех найденных простых чисел.</p><h2>Сложная задача по Java</h2><p>Реализуйте класс “Матрица” с методами:</p><ol><li>Конструктор для создания матрицы размером nxm с нулевыми значениями.</li><li>Метод “setValueAt(int i, int j, int value)” для установки значения элемента в матрице по индексу i, j.</li><li>Метод “getValueAt(int i, int j)” для получения значения элемента в матрице по индексу i, j.</li><li>Метод “multiplyByScalar(int scalar)” для умножения каждого элемента матрицы на скаляр.</li><li>Метод “add(Matrix m)” для сложения двух матриц.</li><li>Метод “transpose()” для транспонирования матрицы.</li><li>Перегрузите оператор “+” для сложения двух матриц и оператор “*” для умножения матрицы на скаляр.</li><li>Реализуйте итератор для класса матрица, чтобы проитерироваться по всем элементам матрицы.</li></ol><p>Проверьте работу класса с помощью JUnit тестов.</p><p>Подсказки:</p><ol><li>Создайте класс “Matrix” с переменными экземпляра для хранения количества строк, столбцов и двумерного массива для хранения элементов матрицы.</li><li>Реализуйте конструктор для инициализации матрицы с заданным количеством строк и столбцов и установите все элементы в 0.</li><li>Реализуйте метод setValueAt() для установки значения элемента матрицы в указанной позиции.</li><li>Реализуйте метод getValueAt() для получения значения элемента матрицы в указанной позиции.</li><li>Реализуйте метод multiplyByScalar() для умножения всех элементов матрицы на указанное скалярное значение.</li><li>Реализуйте метод add() для сложения двух матриц.</li><li>Реализуйте метод transpose() для транспонирования матрицы.</li><li>Переопределите операторы “+” и “*” для сложения и умножения матриц соответственно.</li><li>Реализуйте итератор для класса Matrix, чтобы можно было выполнять итерацию по всем элементам матрицы.</li></ol><p>Напишите тестовые примеры JUnit для проверки всех реализованных методов и убедитесь, что они работают правильно.</p><p>Рекомендуется реализовывать каждый метод по одному и тестировать их по мере выполнения, чтобы избежать большой кучи кода, который трудно отлаживать.</p><p>Ответа к этой задаче нет. ChatGPT призналась, что ей как языковой модели это не по зубам. Найдутся ли среди читателей те, кто сможет решить её?</p><p>Как вы считаете, справилась ли ChatGPT с формулировкой задач и их решением? Если нет, то где ошиблась языковая модель?</p><p>Сколько задач их трёх вам удалось решить? Присылайте свои решения на GitHub в комментарии.</p>]]></content:encoded>
    </item>
    <item>
      <title>Логическая задача про бракованные батарейки</title>
      <link>https://tproger.ru/problems/logicheskaja-zadacha-pro-brakovannye-batarejki</link>
      <comments>https://tproger.ru/problems/logicheskaja-zadacha-pro-brakovannye-batarejki?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/logicheskaja-zadacha-pro-brakovannye-batarejki</guid>
      <description><![CDATA[<p>Анализируем и решаем логическую задачу про бракованные батарейки, которую любят задавать на собеседованиях.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/logicheskaja-zadacha-pro-brakovannye-batarejki">Логическая задача про бракованные батарейки</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 20 Jan 2023 08:30:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Эту логическую задачу про батарейки порой задают на собеседованиях по программированию, чтобы проверить умение кандидата находить правильное решение в стрессовых ситуациях. Также задача про батарейки попадается на ЕГЭ. Давайте разберём условие и решим её.</p><h2>Условие</h2><p>Перед программистом завода по производству батареек поставлена задача: разработать программное обеспечение, которое могло бы контролировать качество выпускаемой продукции. При этом есть два немаловажных нюанса:</p><ol><li>Каждая изготовленная батарейка может оказаться бракованной с вероятностью 2%.</li><li>Система контроля качества в 98% случаев обнаруживает неработающие батарейки и в 1% случаев бракует работающие.</li></ol><p>Разработчик должен определить среднее количество забракованных батареек на партию в 10 000 штук.</p><h2>Решение</h2><p>Сначала выясним, с какой вероятностью система забракует любую батарейку, а затем применим результат к десятитысячной партии.</p><ol><li>Вероятность брака = 0,02, тогда вероятность рабочей батарейки = 0,98.</li><li>Система контроля забракует рабочую батарейку с вероятностью 0,01 (вероятность ошибки) * 0,98 (вероятность изготовления рабочей батарейки) = 0,0098.</li><li>Система контроля забракует нерабочую батарейку с вероятностью 0,98 (вероятность обнаружения брака) * 0,02 (вероятность выпуска брака) = 0,0196.</li><li>Для нахождения вероятности отбраковки любой батарейки выполним сложение этих значений: 0,0098 + 0,0196 = 0,0294.</li></ol><p>Наша партия составляет 10 000 батареек. Применим к этому числу полученный результат:</p><p>10 000 * 0,0294 = 294</p><p>Это и есть среднее количество забракованных батареек на партию в 10 000 штук. Если в одной из таких партий объём отбракованной продукции будет сильно больше, следует проверить корректность работы оборудования.</p><p>Понравилось решение логической задачи про батарейки? Держите ещё несколько <a href="https://tproger.ru/problems/batteries-series-conferences/">задач для программистов</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Прохождение Learn Git Branching</title>
      <link>https://tproger.ru/articles/prohozhdenie-learn-git-branching</link>
      <comments>https://tproger.ru/articles/prohozhdenie-learn-git-branching?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/prohozhdenie-learn-git-branching</guid>
      <description><![CDATA[<p>Если у вас возникли сложности с прохождением интерактивного курса Learn Git Branching, подсмотрите решение в этой шпаргалке.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/prohozhdenie-learn-git-branching">Прохождение Learn Git Branching</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Git]]></category>
      <category><![CDATA[Шпаргалки]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 12 Oct 2022 11:18:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Learn Git Branching — это <a href="https://learngitbranching.js.org/?locale=ru_RU">интерактивный учебник по Git</a>, направленный на закрепление теории прохождением наглядной практики. Если вы столкнулись с трудностью в процессе прохождения, выберите необходимый раздел, уровень и подсмотрите решение.</p><ol><li><a href="https://tproger.ru/#part1">Введение</a></li><li><a href="https://tproger.ru/#part2">Едем дальше</a></li><li><a href="https://tproger.ru/#part3">Перемещаем труды туда-сюда</a></li><li><a href="https://tproger.ru/#part4">Сборная солянка</a></li><li><a href="https://tproger.ru/#part5">Продвинутый уровень</a></li><li><a href="https://tproger.ru/#part6">Push &amp; Pull</a></li><li><a href="https://tproger.ru/#part7">Origin и Git remotes</a></li></ol><h2>Введение</h2><p>Прохождение Learn Git Branching начинается с азов.</p><h3>1. Знакомство с Git commit</h3><p>В этом уровне объясняется, что такое коммиты и как их следует делать. Для прохождения уровня достаточно ввести две команды для коммита, а именно:</p><p>Примечание Чтобы перейти в консоль LearnGitBranching, нажмите Tab.</p><p>Вообще, достаточно и просто двух команд git commit. Однако правилом хорошего тона является указание ветки (у нас это main) и именование коммитов в соответствии с тем, какие изменения были в них внесены.</p><h3>2. Ветвление в Git</h3><p>В этом уровне следует создать и переключиться на новую ветку bugFix:</p><h3>3. Git merge</h3><p>Теперь надо понять, как объединять изменения из двух разных веток. Для этого будем использовать команду git merge. Такой тип слияния создаёт коммит, который имеет сразу двух родителей. Для прохождения уровня введите следующие команды:</p><h3>4. Git rebase</h3><p>Это второй способ объединения изменений в двух ветках. При ребейзе Git по сути копирует набор коммитов и переносит их в другое место. В учебнике сказано, что с rebase история коммитов будет чище, но в основном используется именно merge.</p><p>Давайте посмотрим на решение:</p><h2>Едем дальше</h2><p>Далее в прохождении Learn Git Branching вы столкнётесь с демонстрацией способов перемещения по дереву коммитов.</p><h3>1. HEAD</h3><p>Суть в том, чтобы отделить HEAD от ветки bugFix и присвоить его последнему коммиту в этой же ветке:</p><h3>2. Относительные ссылки: ^</h3><p>Перемещаемся на первого родителя ветки bugFix:</p><h3>3. Оператор «~» и branch forcing</h3><p>Именно на этой задаче у многих возникают проблемы, потому что схема выглядит весьма запутанной. Но чтобы осуществить перемещение, достаточно ввести в консоль Learn Git Branching такие команды:</p><h3>4. Отмена изменений в Git</h3><p>Здесь просто отменяем изменения локально и удалённо. Поскольку изначально мы находимся на локальной ветке (она отмечена звёздочкой), то и начинаем с неё:</p><h2>Перемещаем труды туда-сюда</h2><p>Теперь речь пойдёт о перемещении изменений — возможности, позволяющей разработчику сказать «Хочу, чтобы эти изменения были вот тут, а вот эти — вон там» и получить точные, правильные результаты, не теряя при этом гибкости разработки.</p><h3>1. Git cherry-pick</h3><p>Здесь нужно перенести копии выбранных комитов в main, что делается всего одной строкой:</p><h3>2. Git interactive rebase</h3><p>Это задача с использованием интерактивного окна для перемещения элементов. Для начала впишите код:</p><p>Затем выделите и переставьте элементы в интерактивном окне Learn Git Branching следующим образом:</p><figure><img src="https://media.tproger.ru/uploads/2022/10/Interactive-rebase.jpg" alt="" /></figure><h2>Сборная солянка</h2><p>На этом прохождение основ в Learn Git Branching заканчивается, и дальше именно вы решаете, какую команду выбрать. Я просто приведу свои варианты решения задач из сборной солянки, но вы всегда можете воспользоваться другими.</p><h3>1. Выберем один коммит</h3><h3>2. Жонглируем коммитами</h3><h3>3. Жонглируем коммитами №2</h3><h3>4. Теги</h3><h3>5. Git describe</h3><h2>Продвинутый уровень</h2><p>Вот мы и подошли к продвинутому уровню в прохождении Learn Git Branching.</p><h3>1. Rebase на нескольких ветках</h3><p>Перемещения здесь выглядят сложными, но на деле всё просто:</p><h3>2. Определение родителей</h3><p>Решить можно в три, две и в одну команду. Сделаем в одну:</p><h3>3. Спутанные ветки</h3><p>Задание считается сложным, но достаточно просто абстрагироваться и вспомнить полезную команду git cherry-pick:</p><h2>Push &amp; Pull</h2><p>Теперь переходим к удалённым репозиториям. В этих ответах только код.</p><h3>1. Введение в клонирование</h3><h3>2. Удалённые ветки в Git</h3><h3>3. Git fetch</h3><h3>4. Git pull</h3><h3>5. Коллективная работа</h3><h3>6. Git push</h3><h3>7. Когда наработки расходятся</h3><h3>8. Remote rejected</h3><h2>Origin и Git remotes</h2><p>Это завершающий этап прохождения интерактива Learn Git Branching, в котором, как и в предыдущем, содержится восемь заданий. Здесь я приведу только их решения.</p><h3>1. Слияние фича-бранчей (веток)</h3><h3>2. Merge? Нет, нет, спасибо.</h3><h3>3. Удалённые-отслеживаемые ветки</h3><h3>4. Аргументы команды push</h3><h3>5. Подробности аргумента &lt;пункт назначения&gt;</h3><h3>6. Аргументы git fetch</h3><h3>7. Странный &lt;источник&gt;</h3><h3>8. Аргументы для pull</h3><p>Надеюсь, моё прохождение Learn Git Branching окажется полезным. Старайтесь проходить уровни самостоятельно, чтобы закреплять полученные знания, но если где-то застрянете — обращайтесь за помощью к этой шпаргалке.</p><p>Держите больше <a href="https://tproger.ru/articles/5-shpargalok-po-git-ot-osnov-do-raboty-s-github/">шпаргалок по Git</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>7 заковыристых логико-математических задач</title>
      <link>https://tproger.ru/articles/7-zakovyristyh-logiko-matematicheskih-zadach</link>
      <comments>https://tproger.ru/articles/7-zakovyristyh-logiko-matematicheskih-zadach?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/7-zakovyristyh-logiko-matematicheskih-zadach</guid>
      <description><![CDATA[<p>Не самые сложные, но весьма запутанные логико-математические задачи. Сумеете решить все, не подглядывая в ответы?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/7-zakovyristyh-logiko-matematicheskih-zadach">7 заковыристых логико-математических задач</a>»</p>]]></description>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 25 Jul 2022 09:14:01 GMT</pubDate>
      <content:encoded><![CDATA[<p>Несколько логико-математических задач — это отличный способ скрасить досуг с пользой. Сумеете решить все, не подглядывая в ответы?</p><ol><li><a href="https://tproger.ru/#part1">Парадокс Монти Холла</a></li><li><a href="https://tproger.ru/#part2">Рукопожатия</a></li><li><a href="https://tproger.ru/#part3">Собеседование в Google</a></li><li><a href="https://tproger.ru/#part4">Бита и бейсбольный мяч</a></li><li><a href="https://tproger.ru/#part5">Эскалатор</a></li><li><a href="https://tproger.ru/#part6">Гнутая монета</a></li><li><a href="https://tproger.ru/#part7">Грузовики</a></li><li><a href="https://tproger.ru/#part8">Заключение</a></li></ol><h2>Парадокс Монти Холла</h2><p>Думаю, что многие знакомы с данным парадоксом. Но помните ли вы, как он объясняется?</p><p>Есть 3 пронумерованных ящика: «1», «2» и «3». В одном из них находится приз, а остальные пусты. Вы выбираете ящик «1». Ведущий знает, где лежит приз, специально открывает пустой ящик «2» и демонстрирует вам, что там приза нет. Теперь ведущий предлагает вам либо остаться при своем выборе, либо изменить его на ящик «3».</p><p>Стоит ли менять выбор? Аргументируйте.</p><h2>Рукопожатия</h2><p>А вот ещё одна популярная логико-математическая задача. Предположим, что каждый из участников хакатона единожды поздоровался с каждым. Всего получилось 78 рукопожатий. Сколько было участников?</p><h2>Собеседование в Google</h2><p>На листе бумаги написаны числа: 10, 9, 60, 90, 70, 66. Нужно написать следующее число.</p><p>Примечание Одна из любимых логических задач сотрудников Google, которую дают на собеседовании.</p><h2>Бита и бейсбольный мяч</h2><p>Держите лёгенькую логико-математическую задачку, которую можно решить в уме.</p><p>Комплект из биты и одного бейсбольного мяча стоит $13. Но бита дороже мяча на $3. Сколько стоит каждый предмет спортивного комплекта?</p><h2>Эскалатор</h2><p>Специалист по безопасности допустил ошибку, из-за чего началась утечка данных компании. Чтобы не потерять драгоценное время, он побежал в отдел разработчиков вниз по движущемуся эскалатору. Бзопасник насчитал 140 ступенек, спускаясь со скоростью 2 ступеньки в секунду. Через день ситуация повторилась, но теперь он бежал быстрее — 3 ступеньки в секунду, насчитав при этом на 28 ступеней больше.</p><p>Что ж это получается, чем быстрее бежишь, тем длиннее эскалатор? Сколько ступенек у эскалатора всего?</p><h2>Гнутая монета</h2><p>Вы играете в футбол и хотите подбросить монетку, чтобы решить, какой команде достанется мяч. Единственная монета, что у вас есть, является гнутой, и поэтому вносит явные искажения в результат при подбрасывании. Как вы тем не менее можете использовать такую монету, чтобы принять справедливое решение?</p><h2>Грузовики</h2><p>Держите последнюю заковыристую логико-математическую задачку. Предположим, вы держите парк из 50 грузовиков. Каждая из машин полностью заправлена и может проехать 100 км. Как далеко с их помощью вы сможете доставить определённый груз? Что будет, если в вашем распоряжении есть N грузовиков?</p><p>Учтите, что нет никаких заправочных станций. Единственное место, где можно найти горючее — это топливные баки грузовиков. Пересесть из грузовика в другой легковой автомобиль нельзя. Бросить грузовик без топлива, где бы это ни случилось, и без водителя — в порядке вещей. И единственное, что важно, — доставить ценный груз как можно дальше.</p><h2>Заключение</h2><p>Такие логико-математические задачи помогут с пользой скоротать время. Заметили неточность в решении? Напишите об этом в комментариях.</p><p>И на закуску держите интересную <a href="https://tproger.ru/problems/algoritmicheskaja-zadacha-pro-ostrova/">алгоритмическую задачку про острова</a> с несколькими вариантами решения.</p>]]></content:encoded>
    </item>
    <item>
      <title>ToDoList: Найди ошибку в JS-коде, фреймворк React</title>
      <link>https://tproger.ru/articles/todolist-najdi-oshibku-v-js-kode-frejmvork-react</link>
      <comments>https://tproger.ru/articles/todolist-najdi-oshibku-v-js-kode-frejmvork-react?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Grigorii Sharapov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/todolist-najdi-oshibku-v-js-kode-frejmvork-react</guid>
      <description><![CDATA[<p>Компонент ToDoList принимает массив элементов и отображает их в виде списка. Найди ошибку в JavaScript-коде на React.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/todolist-najdi-oshibku-v-js-kode-frejmvork-react">ToDoList: Найди ошибку в JS-коде, фреймворк React</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 13 Jul 2022 07:40:39 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этой части «Найди ошибку» компонент  ToDoList, принимает массив элементов и отображает их в виде списка. Однако в коде есть небольшая ошибка:</p><h2>Решение</h2><p>Если вы запустите код, вы заметите, что список дел на завтра отображает 0.</p><p>Это связано с тем, как JavaScript обрабатывает оператор &amp;&amp;. В React &amp;&amp; обычно используется для условного рендеринга, если левая часть оператора &amp;&amp; является ложной, тогда оператор &amp;&amp; останавливает дальнейшее вычисление выражения.</p><p>Это работает, потому что React ничего не отобразит для логического значения false. Однако проблема с компонентом  ToDoList заключается в том, что мы проверяем  items.length, который возвращает 0, если элементов нет, что React отобразит как допустимый фрагмент JSX.</p><h2>Как это исправить?</h2><p>Самое простое решение — всегда использовать <a href="https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Conditional_Operator">тернарный оператор</a> при условном рендеринге в React:</p><p>Таким образом, вы явно указываете React, что отображать, если левая часть тернарной операции ложна — в этом случае, если элементов нет, мы хотим отобразить  null. Как и ожидалось, для завтрашнего списка дел ничего не отображается.</p><p>Это хороший шаблон, поскольку он заставляет вас более думать о ложных случаях в вашем коде. Например, в этом случае было бы неплохо отобразить некоторый текст, сообщающий пользователю, что список дел пуст.</p><p>В будущем следует обратить внимание на то, что может помочь с условным рендерингом, это выражение  do, которое позволят нам делать что-то вроде этого:</p><p>В настоящее время do находится на <a href="https://www.proposals.es/proposals/do%20expressions">стадии предложения</a>, но, на мой взгляд, этот способ понятнее и проще в использовании, чем тернарные условия, особенно когда есть несколько вложенных условий.</p><p>Спасибо за внимание!</p><p>Найдите ошибку: <a href="https://tproger.ru/articles/najdi-oshibku-v-react-komponente-funkcionalnoe-karri/">Функциональное Карри</a></p><p><a href="https://medium.com/@jogilvyt/spot-the-bug-to-do-conditionally-19f0e6ce96ba">Источник</a></p>]]></content:encoded>
    </item>
    <item>
      <title>Найди ошибку в React-компоненте: Функциональное Карри</title>
      <link>https://tproger.ru/articles/najdi-oshibku-v-react-komponente-funkcionalnoe-karri</link>
      <comments>https://tproger.ru/articles/najdi-oshibku-v-react-komponente-funkcionalnoe-karri?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Grigorii Sharapov]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/najdi-oshibku-v-react-komponente-funkcionalnoe-karri</guid>
      <description><![CDATA[<p>У нас есть React компонент-переключатель между активным и неактивным состояниями. Однако он не работает как ожидается. Найдите ошибку.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/najdi-oshibku-v-react-komponente-funkcionalnoe-karri">Найди ошибку в React-компоненте: Функциональное Карри</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[React]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 07 Jul 2022 09:10:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>В этом выпуске «Найди ошибку» у нас есть простой React компонент-переключатель, который переключается между активным и неактивным состояниями при нажатии. Однако он не работает как ожидается. Найдите ошибку.</p><figure><img src="https://media.tproger.ru/uploads/2022/07/Screen-Shot-2022-07-06-at-16.52.11.png" alt="" /></figure><h2>Решение</h2><p>Проблема здесь в том, как мы передаем функцию toggleActiveState обработчику события onClick. toggleActiveState— это <a href="https://learn.javascript.ru/currying-partials">каррированная функция</a>, которая принимает логическое значение activeState и возвращает другую функцию, которая заменяет активное состояние переданным значением. Это может быть удобным способом передать функцию принимающую параметры обработчику событий.</p><p>Однако в этом случае мы передаем стрелочную функцию обработчику onClick и вызываем toggleActiveState с состоянием противоположным текущему состоянию isActive, что просто возвращает функцию для обновления состояния с новым значением, которая на самом деле никогда не вызывается.</p><p>Решение состоит в том, чтобы вызвать функцию toggleActiveState непосредственно в обработчике onClick :</p><figure><img src="https://media.tproger.ru/uploads/2022/07/Screen-Shot-2022-07-06-at-16.52.21.png" alt="" /></figure><p>Обработчик onClick еперь вызывает функцию toggleActiveState, которая возвращает новую функцию, которая обновляет активное состояние правильным значением при нажатии кнопки.</p><p>Другим решением было бы вообще избавиться от каррирования и просто установить состояние непосредственно в обработчике onClick:</p><figure><img src="https://media.tproger.ru/uploads/2022/07/Screen-Shot-2022-07-06-at-16.52.27.png" alt="" /></figure><p>Какое решение вам нравится больше?</p>]]></content:encoded>
    </item>
    <item>
      <title>Это просто: пишем свою «Матрицу» на Python</title>
      <link>https://tproger.ru/articles/jeto-prosto-pishem-svoju-matricu-na-python</link>
      <comments>https://tproger.ru/articles/jeto-prosto-pishem-svoju-matricu-na-python?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Клименков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/jeto-prosto-pishem-svoju-matricu-na-python</guid>
      <description><![CDATA[<p>На Python можно создать эффект «Матрицы» с обновляющимися зелёными цифрами; пример показывает принцип такой анимации и требует базовых навыков языка.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/jeto-prosto-pishem-svoju-matricu-na-python">Это просто: пишем свою «Матрицу» на Python</a>»</p>]]></description>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 06 Jul 2022 08:48:35 GMT</pubDate>
      <content:encoded><![CDATA[<p>Изучать новое можно по-разному. Одним нравится сначала штудировать теорию, а потом применять её на практике. Другие предпочитают учиться исключительно на примерах, найденных на любимом Stackoverflow. А кто-то вообще загружает навыки управления вертолётом и технику боевых единоборств по выделенному каналу прямо в мозг.</p><p>В любом случае без практических упражнений не обойтись. После ускоренной загрузки знаний Нео всё равно должен пройти спарринг с Морфеусом, чтобы научиться применять терабайты загруженных навыков на практике. Только вот упражнения бывают разные. Одно дело — лихо взлететь под потолок и проломить балки восточного спортзала, и совсем другое — методично час за часом шлифовать своё мастерство.</p><figure><img src="https://media.tproger.ru/uploads/2022/07/Matrix_01.png" alt="" /></figure><h2>Определяем цели</h2><p>Учебники программирования разнообразием примеров обычно не блещут. Встречаются, конечно, <a href="https://tproger.ru/books/obzor-think-python/">исключения</a>, но в большинстве пособий упражнения похожи друг на друга и не особо интересны: создайте очередную адресную книгу, нарисуйте круг черепашкой, разработайте сайт магазина по продаже какой-нибудь «нужной» рекламной ерунды. Куда уж тут до достоверной имитации матрицы. Хотя…</p><p>Почему бы не взять всё это в свои руки и не начать придумывать упражнения самостоятельно? Да хоть бы и написать свою маленькую личную «Матрицу». Конечно, не ту, в которой будут небоскрёбы, стильные телефоны той эпохи и вездесущие непобедимые агенты Смиты. Для этого нам нужно ещё пару-тройку месяцев поучиться. Но любому начинающему программисту под силу написать модель культовой заставки со стекающими по экрану зелёными струйками цифр. Этим и займёмся.</p><p>Запрограммировать такую заставку можно практически на любом языке. Попробуем это сделать на «великом и могучем» Python.</p><h2>Пишем техническое задание</h2><p>Для начала определимся, что же мы хотим в итоге получить. Напишем сами себе небольшое техническое задание — всегда полезно. Подумайте про «Матрицу», и память сама подскажет образ — тёмное консольное окно, в котором будут стекать струйки зелёных цифр. Чтобы было интереснее, пусть они двигаются с разной скоростью. У каждой струйки должны быть начало — яркий зелёный ноль — и конец. Кстати, пусть скорости движения начала и конца струйки тоже будут разными и определяются случайным образом.</p><p>Звучит не так и сложно. Теперь дело за малым — всего лишь написать код. Приступим.</p><h2>Готовим инструменты</h2><p>Как полагается, подключим все необходимые модули. Сначала стандартные:</p><p>Для работы с консолью Windows нам понадобятся модули bext и colorama. Как их установить с помощью pip, вы уже, наверняка, знаете. Нужно их подключить. Но сделаем это по всем правилам — с проверкой:</p><p>Подготовим к работе консоль:</p><p>Теперь осталось только завести константы с цветами для модуля colorama. Нам нужен зелёный и тёмно-зелёный:</p><p>Windows — штука хитрая и противоречивая. Базовый цвет green в консоли — это тёмно-зелёный.</p><h2>Изобретаем антиматерию</h2><p>Теперь подумаем над самым главным вопросом: как же нам запрограммировать стекающие капли «Матрицы»? Каждая капля — это объект. Все капли разные, но ведут себя одинаково. Поэтому нам надо создать класс, в котором мы опишем основные действия с каплей и все её атрибуты.</p><p>Чтобы капли стекали с разной скоростью, зададим каждой из них случайный тайм-аут задержки — в шагах. Какие-то капли будут перемещаться на каждом шаге обновления нашей картинки, какие-то реже.</p><p>Как же быть с верхним концом струйки? Он должен «высыхать», причём со своей скоростью. Не будем придумывать ничего сложного. Пусть верхний конец тоже будет каплей, но чёрного цвета. Такая «капля» при перемещении будет не добавлять цифры, а наоборот стирать их. Получается прямо какая-то антикапля, антиматерия — красиво и стильно.</p><p>Поскольку капля и антикапля ведут себя одинаково, запрограммируем их в одном классе.</p><h2>Создаём капли</h2><p>Итак, все действия с каплями и антикаплями мы будем выполнять в методах класса. Назовём его Drop и напишем метод создания объекта класса:</p><p>С атрибутами x и y всё понятно. Второй равен -1, чтобы капля раньше времени не показывалась на экране. Атрибуты timeout и wait_count нужны для обеспечения разной скорости падения капель. Первый задаёт постоянную скорость стекания, второй — итерационный счётчик.</p><h2>Перемещаем капли</h2><p>Теперь напишем метод перемещения капли с учётом её скорости.</p><p>Метод возвращает логическое значение — факт перемещения капли. Или антикапли — всё равно.</p><h2>Рисуем струйку</h2><p>С перемещением разобрались. Настало время рисовать.</p><p>Здесь мы вызываем два новых ещё не написанных метода: con_print и zero_draw. Первый будет выводить символ нужного цвета в указанное место консольного окна. Второй будет рисовать дополнительный яркий ноль в начале струйки.</p><p>Вот, собственно, и второй метод:</p><h2>Организуем перерождение капель</h2><p>Мы уже поняли, что у нас получается не простая «Матрица», а философская. Посему, когда капли и антикапли будут достигать нижнего края экрана, заставим их переродиться. Они получат новую жизнь у верхней границы. Это будет стоить нам всего двух строк:</p><p>Теперь у нас есть всё, что нужно. Класс Drop готов.</p><h2>Выводим текст в консоль</h2><p>Вырвемся за границы класса Drop и напишем две функции для вывода текста в консольное окно.</p><p>Если мы попытаемся напечатать что-то в нижнем правом углу консольного окна, то снизу автоматически добавится ещё одна строка. Ничего не поделаешь: в этом месте в нашей идеальной «Матрице» будет «битый пиксель»:</p><p>Теперь всё готово к тому, чтобы напечатать запрошенный символ в нужном месте.</p><h2>Собираем всё воедино</h2><p>Все компоненты нашей будущей «Матрицы» готовы. Теперь осталось всё собрать вместе и запустить.</p><p>Создадим массив капель и антикапель (какого типа родится объект — дело случая).</p><p>И, наконец, самый главный цикл:</p><h2>Вся программа целиком</h2><p>Предлагаю вам поэкспериментировать с этой программой. Попробуйте добавить к «Матрице» свои дополнительные необычные эффекты. Интересно, что у вас получится.</p>]]></content:encoded>
    </item>
    <item>
      <title>Адовые задачи с собеседований для программистов</title>
      <link>https://tproger.ru/articles/zadachi-s-sobesedovanij-dlja-programmistov</link>
      <comments>https://tproger.ru/articles/zadachi-s-sobesedovanij-dlja-programmistov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/zadachi-s-sobesedovanij-dlja-programmistov</guid>
      <description><![CDATA[<p>Держите пять непростых задач с интервью для программистов. Большинство из них имеет несколько решений. Предложите своё?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/zadachi-s-sobesedovanij-dlja-programmistov">Адовые задачи с собеседований для программистов</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 17 Jun 2022 09:03:23 GMT</pubDate>
      <content:encoded><![CDATA[<p>Задачи на собеседованиях для программистов характеризуются видимой сложностью, но если спокойно разобраться, всё решается довольно просто. Мы подготовили несколько заковыристых задач и решения к ним.</p><ol><li><a href="https://tproger.ru/#part1">Алгоритмическая задача про острова</a></li><li><a href="https://tproger.ru/#part2">Поиск знаменитости</a></li><li><a href="https://tproger.ru/#part3">Миллион наименьших чисел</a></li><li><a href="https://tproger.ru/#part4">Сумма чисел</a></li><li><a href="https://tproger.ru/#part5">Тёплые дни: задача на стек</a></li></ol><h2>Алгоритмическая задача про острова</h2><p>Для двумерного массива M x N, состоящего из единиц, которые обозначают сушу, и нулей, обозначающих воду, верните количество островов.</p><p>Остров окружён водой и образован соединением соседних земель по горизонтали и вертикали. Вы можете предположить, что все четыре края матрицы окружены водой.</p><p>Примечание Если островов нет, возвращаем 0.</p><h3>Решение</h3><p>Для начала нам нужно найти в матрице хотя бы одну единицу: начинаем построчный обход с нулевого индекса [0,0]. Когда мы находим единицу, помечаем её, как просмотренную, и также просматриваем соседние клетки по направлениям вправо, вниз, влево, вверх.</p><p>Если предыдущая ячейка была сушей, а следующая оказалась водой, мы возвращаемся к суше и просматриваем ячейки по перечисленным направлением в том же порядке.</p><h3>Код</h3><h2>Поиск знаменитости</h2><p>А эта задача с собеседований встречалась программистам при трудоустройстве в Amazon.</p><p>Дана группа людей из K человек, и эти люди могут знать друг друга, необязательно взаимно. Среди них есть знаменитость. Знаменитость — это человек, который не знает никого в компании, зато каждый из компании знает его. Изначально мы не владеем информацией о том, кто кого знает, но мы можем спросить у каждого участника, знает ли он других людей из группы. Нужно определить знаменитость, используя минимальное количество вопросов.</p><h3>Решение</h3><p>Для начала определимся с тем, что знаменитость всего одна. Чтобы понять следующий алгоритм решения, давайте посмотрим на двух людей из группы. Обозначим их как A и B.</p><figure><img src="https://media.tproger.ru/uploads/2022/06/5507148_account_profile_user_avatar_human_icon.jpg" alt="" /></figure><p>Когда мы спрашиваем у A, знает ли он B, мы получаем два варианта ответа:</p><ol><li>Знает — человек A не знаменитость.</li><li>Не знает — человек B не знаменитость.</li></ol><p>Так, задав всего один вопрос, мы избавляемся от одного кандидата на статус знаменитости. Именно этот алгоритм мы и используем в программе: опрашивается пара человек, после чего один из них вычёркивается из списка, и так пока не останется один кандидат.</p><p>Но наличие одного кандидата ещё не означает, что он знаменитость, ведь её может не быть вовсе. Поэтому последние два действия состоят в том, чтобы спросить у остальных, знают ли они кандидата, а у кандидата — знает ли он всех остальных.</p><h3>Код</h3><h2>Миллион наименьших чисел</h2><p>Опишите алгоритм для нахождения миллиона наименьших чисел в наборе из миллиарда чисел. Память компьютера позволяет хранить весь миллиард чисел.</p><h3>Решение</h3><p>Есть несколько способов решить поставленную задачу:</p><ol><li>Сортировка</li><li>Минимум кучи</li><li>Ранжирование</li></ol><p>Каждый из этих способов мы разобрали в нашей статье по <a href="https://tproger.ru/problems/find-the-smallest-one-million-numbers-in-one-billion-numbers/">нахождению миллиона наименьших чисел</a>.</p><h2>Сумма чисел</h2><p>Такая задача нередко встречается на интервью, и в стрессовой ситуации программист действительно может сразу не сориентироваться.</p><p>Дан отсортированный массив чисел, включая отрицательные, и некое число K. Нужно найти два числа из массива, которые в сумме дадут число K. Если таких чисел нет, в результате возвращаем пустой массив. Если комбинаций чисел, дающих нужную сумму, несколько, возвращаем любую из них.</p><p>Есть несколько вариантов решения задачи:</p><ul><li>перебор всех пар — временная сложность алгоритма O(n²);</li><li>HashSet — O(n);</li><li>бинарный поиск — O(n log n);</li><li>два указателя — O(n).</li></ul><p>Давайте решим задачу с помощью HashSet.</p><p>Примечание Хоть метод HashSet и работает за один проход по массиву, он тратит дополнительную память, так как в худшем случае мы перенесём все элементы из входного массива в наш сет.</p><h3>Решение</h3><p>Создаём пустой сет и смотрим первый элемент массива. Добавляем его в сет. Далее смотрим второй элемент и то, даёт ли он в сумме с вынесенным в сет первым элементом K. Если нет, просто переносим его в сет. Так мы продолжаем до тех пор, пока не найдём число, которое в сумме с другим числом из сета даст число K. Выводим массив из этих двух элементов в качестве ответа.</p><h3>Код</h3><h2>Тёплые дни: задача на стек</h2><p>Дан массив чисел, состоящий из N элементов. Эти числа обозначают температуру в конкретный день. Для каждого дня нужно найти количество суток до наступления более тёплого дня.</p><p>Вот пример того, как это можно изобразить:</p><h3>Решение</h3><p>Используем два цикла. В первом мы будем идти по всем дням, для которых хотим определить ответ, а во втором пробегать направо до тех пор, пока не наткнёмся на более тёплый день.</p><h3>Код</h3><p>Понравились задачки? Держите ещё <a href="https://tproger.ru/articles/10-logicheskih-zadach-s-sobesedovanij-kotorye-zastavjat-zastrelitsja/">десять непростых задач на логику</a>, которые часто задают программистам на собеседованиях.</p>]]></content:encoded>
    </item>
    <item>
      <title>Угадать число от 0 до 100 за 7 попыток — математический трюк</title>
      <link>https://tproger.ru/articles/matematicheskij-fokus-ugadat-chislo-ot-0-do-100-za-7-popytok</link>
      <comments>https://tproger.ru/articles/matematicheskij-fokus-ugadat-chislo-ot-0-do-100-za-7-popytok?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/matematicheskij-fokus-ugadat-chislo-ot-0-do-100-za-7-popytok</guid>
      <description><![CDATA[<p>Математический фокус, который способен удивить. Объясним алгоритм и напишем на Java простенькую программу для решения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/matematicheskij-fokus-ugadat-chislo-ot-0-do-100-za-7-popytok">Угадать число от 0 до 100 за 7 попыток — математический трюк</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Java]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Для начинающих]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 11 Feb 2022 08:30:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Этот математический фокус не так сложен, как может показаться на первый взгляд. Более того, решение мы реализуем программно на языке Java. Приступим?</p><h2>Условие</h2><p>Если расписать весь процесс поэтапно, выглядит это следующим образом:</p><ol><li>Вы загадываете число от 0 до 100.</li><li>Программа выводит целое число в рамках данного диапазона.</li><li>Вы отвечаете, ваше число больше, меньше или равно тому, что вывела программа.</li><li>Если число больше либо меньше, программа продолжает предлагать варианты.</li><li>За 7 или менее попыток число гарантированно угадывается.</li></ol><h2>Решение</h2><p>На самом деле, никакого особого секрета здесь нет, и решение строится на бинарном поиске. Это простая алгоритмическая задача, смысл которой в том, чтобы каждый раз делить оставшийся диапазон на 2. Таким образом мы с каждой попыткой вдвое сокращаем область поиска, увеличивая шансы на успех. Вот и весь математический фокус.</p><p>Допустим, первой догадкой алгоритма будет число 50, после чего становится понятно, в какую сторону исходного диапазона «шагать» дальше: это будет область 0–50 либо 51–100. Если первый вариант, то далее алгоритм предложит число 25 и так далее. Математические законы предполагают, что если число 100 делить вдвое 7 раз, мы гарантированно получим результат в районе единицы.</p><p>Можно найти число и в диапазоне побольше — от 0 до 127 или от 1 до 128. Всё потому, что 27=128. Соответственно, если у нас будет 8 попыток, область можно увеличить до 256, если 9 — до 512 и т. д. По этому же принципу работают <a href="https://tproger.ru/articles/dvoichnoe-binarnoe-derevo-sozdanie-i-obhod/">бинарные деревья</a>.</p><p>Но решать всё вручную с калькулятором наперевес — прошлый век. Давайте подключим код и посмотрим, как с этим справится программа.</p><h2>Решение кодом</h2><p>Воспроизведём решение с помощью Java без использования графического интерфейса. При желании всегда можно подключить Swing или JavaFX.</p><p>Для начала определимся с переменными, которые нам потребуются:</p><p>Поскольку мы будем работать с терминалом, подключим слушатель событий с помощью класса Scanner:</p><p>И объявим переменную слушателя:</p><p>Далее всё просто: программа выводит варианты, а пользователь отправляет +, - или =, в зависимости от того, больше загаданное число, меньше или идентично. Пока введённое значение не = (while (!strInput.equals("="))), продолжаем вычислять и делить заданный диапазон:</p><p>Понравилась задачка? Держите ещё один математический фокус в виде <a href="https://tproger.ru/articles/gipoteza-kollatca-samyj-krutoj-matematicheskij-fokus-vseh-vremjon/">гипотезы Коллатца</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>6 логико-математических задач, которые заставят хорошенько подумать</title>
      <link>https://tproger.ru/quiz/6-logiko-matematicheskih-zadach-kotorye-zastavjat-podumat</link>
      <comments>https://tproger.ru/quiz/6-logiko-matematicheskih-zadach-kotorye-zastavjat-podumat?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/quiz/6-logiko-matematicheskih-zadach-kotorye-zastavjat-podumat</guid>
      <description><![CDATA[<p>Держите несколько логико-математических задач, которые помогут разнообразить досуг. Задачи идут в порядке усложнения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/quiz/6-logiko-matematicheskih-zadach-kotorye-zastavjat-podumat">6 логико-математических задач, которые заставят хорошенько подумать</a>»</p>]]></description>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Викторины]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 06 Jan 2022 10:09:09 GMT</pubDate>
      <content:encoded><![CDATA[<p>Во время праздников как никогда хочется размяться, и поэтому мы подготовили для вас тест из 6 логико-математических задач. Кто-то посчитает их до невозможного простыми, а кому-то предстоит настоящий математический квест. Каждая следующая задача сложнее предыдущей. Готовы их пощёлкать?</p><p>Делитесь результатом в комментариях.</p>]]></content:encoded>
    </item>
    <item>
      <title>4 вопроса для проверки знаний по машинному обучению</title>
      <link>https://tproger.ru/articles/4-voprosa-dlja-proverki-znanij-po-mashinnomu-obucheniju</link>
      <comments>https://tproger.ru/articles/4-voprosa-dlja-proverki-znanij-po-mashinnomu-obucheniju?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Maria Baranova]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/4-voprosa-dlja-proverki-znanij-po-mashinnomu-obucheniju</guid>
      <description><![CDATA[<p>Руководитель ШАД в Москве составил вопросы, которые помогут узнать, какие темы по машинному обучению вам стоит подкачать прямо сейчас.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/4-voprosa-dlja-proverki-znanij-po-mashinnomu-obucheniju">4 вопроса для проверки знаний по машинному обучению</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Машинное обучение]]></category>
      <category><![CDATA[Data Science]]></category>
      <category><![CDATA[Гостевая публикация]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 29 Dec 2021 12:46:22 GMT</pubDate>
      <content:encoded><![CDATA[<p>Недавно у Школы анализа данных Яндекса появился свой <a href="https://ml-handbook.ru">онлайн-учебник</a> по ML, над каждой главой которого трудились преподаватели, выпускники, учёные и практики из индустрии. Он будет полезен начинающим ML-специалистам, разработчикам, аналитикам и исследователям и поможет разобраться в таких темах, как линейные модели и градиентный бустинг, функции потерь и оценка качества моделей. Учебник будет дополняться другими разделами машинного обучения и полезной для data science математики.</p><p>Руководитель Школы анализа данных в Москве Стас Федотов составил список вопросов, которые помогут проверить себя и узнать, какие темы по ML вам стоит подкачать прямо сейчас.</p><p>1. Чем метрика отличается от функции потерь?</p><p><b>Что изучить по теме: </b>оценка качества моделей, функции потерь, метрики.</p><p>2. Что такое ансамбли моделей машинного обучения? Какие вы знаете стратегии построения ансамблей?</p><p><b>Что изучить по теме:</b> ансамбли.</p><p>3. Случайный лес основан на принципе бэггинга — усреднения предсказания нескольких независимых моделей. Но вот проблема: обучающая выборка у нас одна. Как мы можем получить независимые модели? Почему это не приводит к проблемам?</p><p><b>Что изучить по теме:</b> ансамбли.</p><p>4. Какие гиперпараметры вы бы стали настраивать для борьбы с переобучением у градиентного бустинга?</p><p><b>Что изучить по теме: </b>градиентный бустинг.</p>]]></content:encoded>
    </item>
    <item>
      <title>21 задача из опыта DevOps-инженера</title>
      <link>https://tproger.ru/articles/21-zadacha-iz-opyta-devops-inzhenera</link>
      <comments>https://tproger.ru/articles/21-zadacha-iz-opyta-devops-inzhenera?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Mykola Prokopenko]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/21-zadacha-iz-opyta-devops-inzhenera</guid>
      <description><![CDATA[<p>Подборка из 21 практической задачи для начинающих DevOps-инженеров и тех, кто хочет понять, с какими ситуациями сталкиваются специалисты.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/21-zadacha-iz-opyta-devops-inzhenera">21 задача из опыта DevOps-инженера</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[DevOps]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 28 Oct 2021 13:35:29 GMT</pubDate>
      <content:encoded><![CDATA[<p>Я имею опыт системного администрирования различных корпоративных систем и сервисов, успел побывать в роли саппорт-инженера, где приходилось заниматься автоматизацией, что и привело меня в DevOps-инженеры.</p><p>В начале своего пути мне крайне не хватало представления о том, чем занимается DevOps-инженер и какие задачи перед ним ставятся. Сейчас встречаю людей, которые на старте задаются подобными вопросами. Как говорится, если кто-то прошёл путь и дошёл туда, где бы вы хотели быть, то и у вас получится.</p><h2>Перед началом</h2><p>В данном материале не будет решений задач DevOps-инженер, потому что по некоторым из них можно писать отдельный гайд с пояснениями. И объём такого гайда может быть равен отдельной статье. Впрочем, может быть, и стоит этим заняться.</p><p>Поскольку мой личный опыт связан с аутсорс и аутстаф-компаниями, то перечень инструментов разнообразен.</p><p>Задачи являются реальными кейсами, которые взяты из реальных и в основном растущих проектов. Они также несколько упрощены, хотя, можно подумать, куда уж проще.</p><p>Подразумевается, что читатель знаком с Linux, слышал о веб-серверах, IaC-инструментах, понимает, что такое docker, и слышал об инструментах оркестрации и облаках.</p><h2>Реальные кейсы:</h2><h3>Задача 0:</h3><ul><li><i>Написать Ansible-плейбук, для конфигурации веб-сервера Nginx, который будет настраивать также и firewall-правила, открыв 22, 80, 443 порты.</i></li></ul><p>Комментарий к задаче: вполне заурядный кейс, где используется Ansible, предполагается что конфигурация Nginx уже есть, и дело только за Ansible. Официальная документация Ansible — <a href="https://docs.ansible.com/ansible/latest/user_guide/playbooks_intro.html">Клик</a>. Почитать об Nginx — <a href="https://nginx.org/ru/">Клик</a>.</p><h3>Задача 1:</h3><ul><li><i>Описать конфигурацию Nginx, где он будет выполнять роль балансировщика c использованием upstream. </i></li></ul><p>Комментарий к задаче: если вы не имели дела с Nginx, реализация решения может занять какое-то время, но впоследствии станет полезным скиллом. Про upstream’ы — <a href="http://nginx.org/ru/docs/http/ngx_http_upstream_module.html">Клик</a>.</p><h3>Задача 2:</h3><ul><li><i>Собрать docker image, который включает в себя приложение и веб-сервер Nginx, при запуске открыть порт 80 и добавить контейнер в автостарт системы. </i></li></ul><p>Комментарий к задаче: в данной задаче можно использовать статическую веб-страницу вместо приложения, например, что-то можно найти на <a href="https://github.com/search?q=static+webpage">Github</a>.</p><h3>Задача 3:</h3><ul><li><i>Написать CloudFormation-скрипт, для создания EC2-инстанса и внутренней сети для этого инстанса.</i></li></ul><p>Комментарий к задаче: CloudFormation так же часто используется в проектах завязанных на AWS. Важно уметь пользоваться документацией в целом, потому что многие сервисы, которые предоставляет AWS, можно сконфигурировать с помощью CF-шаблонов. Примечание: можно использовать для тестов тип инстанса ЕС2 t2.micro, чтобы не тратить лишние кровные.</p><h3>Задача 4:</h3><ul><li><i>Написать bash скрипт, который будет создавать PostgreSQL бэкап. Для автоматического запуска скрипта создаём запись в Cron.</i></li></ul><p>Комментарий к задаче: bash является частью автоматизации и может применяться как в задачах вроде этой, так и в конфигурации CI/CD.</p><h3>Задача 5:</h3><ul><li><i>Сделать так, чтоб весь вывод скрипта из предыдущей задачи записывался в лог-</i><i>файл /var/log/backup/backup.log. Формат лога: [Название скрипта][Время выполнения] — полный вывод.</i></li></ul><p>Комментарий к задаче: продолжаем работать с bash’ем. Хорошая практика логировать всю автоматизацию для последущего траблшутинга.</p><h3>Задача 6:</h3><ul><li><i>Написать скрипт, который будет выполнять проверку состояния диска и, если места меньше чем 85%, то высылать алерт на почту. Для отправки писем прямиком из консоли можно использовать ssmtp клиент. </i></li></ul><p>Комментарий к задаче: абсолютно не важно какой диск. Неплохая тренировка перевязки инструментов друг с другом. Да-да, здесь можно спорить с реализацией, но не всегда клиенты хотят использовать что-то сторонее, плюс конфигурация и освоение стороннего инструмента занимает такое же время, как аккуратное описание всё bash’ем.</p><p>Всё же приходится много иметь дела с Linux.</p><h3>Задача 7:</h3><ul><li><i>Написать шаблон Cloudformation для создания ECS и ECR, в котором мы будем разворачивать контейнер.</i></li></ul><p>Комментарий к задаче: здесь нужно посидеть с документацией AWS.</p><h3>Задача 8:</h3><ul><li><i>Описать Dockerfile, который содержит Python приложение (или, например, можно использовать контейнер со статической веб-страницей из задачи 2), запушить его в ECR, откуда его возьмёт CodePipeline и развернёт в ECS.</i></li></ul><p>Комментарий к задаче: здесь может понадобиться знание IAM, для генерации токенов для CodePipeline и понимание, как работает ECS и ECR. Чем дальше тем ECS и ECR чаще встречаются в проектах.</p><h3>Задача 9:</h3><ul><li><i>Настройка мониторинга в связке c Prometheus+Grafana+Node exporter+Alertmanager. </i></li></ul><p>Комментарий к задаче: если инфраструктура не хостится где-то в облаке или нужны более гибкие метрики, то может использоваться что-то стороннее. Часто это что-то из опенсорс. Для практики можно взять один-два инстанса в том же AWS t2.micro чтоб «распробовать» эту связку и как можно тоньше настроить мониторинг основных показателей серверов и систем. Вот пример метрик из Node exporter для Grafana — <a href="https://grafana.com/grafana/dashboards/1860">Клик</a>.</p><h3>Задача 10:</h3><ul><li><i>Описать конфигурацию мониторинг сервера в Ansible. Конфигурация должна включать настройку Prometheus+Grafana+Alertmanager на сервере мониторинга и конфигурацию с открытием портов в firewall правилах на серверах, которые мы хотим мониторить. Для мониторинга инстансов, ставим Node exporter, который выводит метрики на порт 9100 (его мы и открываем на отслеживаемых серверах). В целях безопасности порт 9100 открываем только для мониторинг инстанса. </i></li></ul><p>Комментарий к задаче: чтобы не вести отдельно документацию, часто можно просто прочитать IaC-скрипты, которые конфигурируют то или иное окружение. Полезно и для соблюдения идентичности окружений.</p><h3>Задача 11:</h3><ul><li><i>Настроить Gitlab Ci пайплайн для сборки и деплоя контейнера в окружение. В качестве окружения — для упрощения — это может быть инстанс где-либо, в качестве контейнера может быть что угодно (даже ранее собранный контейнер со статической веб страницей). То есть при коммите, мы запускаем наш пайплайн, собираем docker image, и деплоим его на наш тестовый инстанс, где потенциально его могут опробовать — например, тестировщики.</i></li></ul><p>Комментарий к задаче: CI/CD-инструменты, такие как Gitlab CI, <a href="https://www.jenkins.io/doc/">Jenkins</a>, <a href="https://circleci.com/docs/">Circle CI</a>, <a href="https://www.jetbrains.com/help/teamcity/teamcity-documentation.html">TeamCity</a>, и облачные, такие как <a href="https://docs.microsoft.com/en-us/azure/devops/?view=azure-devops">Azure DevOps</a>, <a href="https://cloud.google.com/build/docs">Google Cloud Build</a>, AWS CodePipeline и подобные, очень часто используются на различных проектах. В целом, у всех подход очень похож: собрать, протестировать, доставить, но, как всегда, дьявол в мелочах.</p><h3>Задача 12:</h3><ul><li><i>Поднять Kubernetes cluster из трёх нод. Сделать первичную конфигурацию и задеплоить в него контейнер. </i></li></ul><p>Комментарий к задаче: не самый часто встречающийся кейс, но подняв несколько раз кластер и настроив в CI/CD, можно освоить очень полезный навык, а уж если хочется больше задач по K8s, то их можно найти здесь — <a href="https://kubernetes.io/docs/tasks/">Клик</a>. Также есть отличный курс — Kubernetes the hard way, которй немного через боль может поставить правильное понимание организации и работы кластера.</p><h3>Задача 13:</h3><ul><li><i>Распарсить JSON данные и сохранить их в CSV. Сгенерировать JSON можно здесь — Клик. </i></li></ul><p>Комментарий к задаче: куда же без скриптовых задач. Для решения можно использовать Bash, Python или что-то другое. Пока важен именно результат, а уж пути, какими мы к нему придём, можно в последствии оптимизировать.</p><h3>Задача 14:</h3><ul><li><i>Описать в Terraform создание в AWS-инстанса EC2 с EBS-томом .</i></li></ul><p>Комментарий к задаче: в продолжение IaC, Terraform часто встречается на различных проектах, но не всегда им можно достичь желаемого состояния инфраструктуры. Например, в том же Azure приходилось столкнуться с тем, что Terraform мог далеко не всё, и приходилось делать связку PowerShell и Terraform.</p><h3>Задача 15:</h3><ul><li><i>Есть инфраструктура в AWS, и окружения периодически «разъезжаются» — имеется в виду, что в процессе эксплуатации инфраструктуры, имеющей несколько окружений, например production, staging, dev, qa, могут со временем начинать отличаться друг от друга. Нужно описать все элементы инфраструктуры с помощью CloudFormation. Инфраструктура включает в себя, шесть EC2-инстансов: два бэкэнда, два фронтэнда, балансировщик и сервер для сбора аналитики с бэкэнда. У каждого сервера должен быть открыт 22-й порт, только для перечня адресов VPN. У балансировщика и фронтэнда должны быть открыты 80-й и 443-й порты, у бэкэнда — 5000-й, 80-й, 443-й, у сервера сбора аналитики — 6000-й, 80-й и 443-й. При этом, все сервера не должны быть видны снаружи, кроме балансировщика. Скрипт должен быть универсален для всех окружений. </i></li></ul><p>Комментарий к задаче: подобные задачи часто встречаются, в данном случае описание инфраструктуры с помощью IaC экономически целесообразно, потому что есть несколько окружений, которые впоследствии легче приводить в порядок и содержать в чистоте. Хорошо написанный скрипт — хорошая альтернатива документации.</p><h3>Более абстрактные задачи:</h3><ul><li>Есть сервис, где периодически что-то происходит, из-за чего он медленнее обрабатывает запросы пользователей. Нужно посмотреть логи. Важно уметь искать в логах нужное событие. Быстро ориентироваться в бесконечно больших лог -файлах, при этом не нагружая диск при открытии(да здравствует less).</li><li>Нужно написать Ansible -скрипт, который можно будет применить на нескольких окружениях с разными внутренними IP-адресами, DNS-именами и секретами. Важно уметь правильно разделять и описывать конфигурации разных окружений. То есть использовать одни и те же роли для всех окружений, но разделять их с помощью inventory файлов и файлов с переменными и секретами.</li><li>Необходимо нарисовать график существующей инфраструктуры. Периодически клиент такое тоже может попросить сделать, например, когда проходит аудит ,и регуляторы в сфере деятельности компании/проекта требуют определённой отчётности об организации инфраструктуры, данных, и прочего. Популярный инструмент для рисования графиков и блок-схем — <a href="https://app.diagrams.net/">Клик</a>.</li><li>Сделать анализ облачных провайдеров и выбрать подходящий под определённые требования. Например: клиент расположен в Канаде, гос регулятор выдвигает требования, что данные пользователей должны хранится только в Канаде, соответственно, сразу отпадает перечень провайдеров, которые расположены вне требуемой зоны. Важно провести глубокую аналитику всех канадских провайдеров, их перечня услуг, готовых решений, цен и так далее. Также важно смотреть на количество локаций дата центров, реальных отзывов и множество других переменных.</li><li>Провести оптимизацию существующей инфраструктуры или её части. Под оптимизацией в основном имеется в виду снижение ценника за единицу времени работы инфраструктуры. Здесь может быть целый список нюансов, и конкретизировать что-либо крайне трудно. Но такие кейсы могут быть в практике, потому что под быстро меняющиеся требования растущего бизнеса нужно успевать подстраиваться.</li></ul><h2>Резюме</h2><p>Если вы только в начале пути, решение этих и подобных задач может стать хорошим толчком в прокачке автоматизации, что является неотъемлемой частью DevOps и прочих *Ops практик. Если у вас что-то не выходит, это абсолютно нормально. Не бойтесь пробовать, экспериментировать и у вас всё получится.</p>]]></content:encoded>
    </item>
    <item>
      <title>Тест: 9 математических задач — от простого к сложному</title>
      <link>https://tproger.ru/quiz/test-9-matematicheskih-zadach-ot-prostogo-k-slozhnomu</link>
      <comments>https://tproger.ru/quiz/test-9-matematicheskih-zadach-ot-prostogo-k-slozhnomu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/quiz/test-9-matematicheskih-zadach-ot-prostogo-k-slozhnomu</guid>
      <description><![CDATA[<p>Подготовили для вас математический тест из девяти интересных задач. Сможете решить их все? Обязательно поделитесь результатом.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/quiz/test-9-matematicheskih-zadach-ot-prostogo-k-slozhnomu">Тест: 9 математических задач — от простого к сложному</a>»</p>]]></description>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Викторины]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 03 Sep 2021 11:44:59 GMT</pubDate>
      <content:encoded><![CDATA[<p>Предлагаем отдохнуть с пользой: решите девять математических задачек и поделитесь своим результатом в комментариях.</p>]]></content:encoded>
    </item>
    <item>
      <title>Технические задачи для интервью на должность веб-разработчика</title>
      <link>https://tproger.ru/articles/tehnicheskie-zadachi-dlja-intervju-na-dolzhnost-veb-razrabotchika</link>
      <comments>https://tproger.ru/articles/tehnicheskie-zadachi-dlja-intervju-na-dolzhnost-veb-razrabotchika?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Бунтов]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/tehnicheskie-zadachi-dlja-intervju-na-dolzhnost-veb-razrabotchika</guid>
      <description><![CDATA[<p>Примеры задач для веб-разработчиков. Варианты для стартапов и крупных компаний, проверяющие различные компетенции специалистов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/tehnicheskie-zadachi-dlja-intervju-na-dolzhnost-veb-razrabotchika">Технические задачи для интервью на должность веб-разработчика</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Карьера]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 15 Jul 2021 09:55:41 GMT</pubDate>
      <content:encoded><![CDATA[<p>Отведите для технического интервью не более 50 минут.</p><h2>Задачи на создание или отладку кода</h2><p>Для кандидата в стартап подойдут задачи на создание или отладку кода. Это поможет выявить, обладает ли соискатель хорошими базовыми знаниями в технологиях, и то, как он может строить удачные технические решения. Как правило, это основной массив работы программиста в молодых компаниях. Рассмотрим следующие задачи, которые отлично подойдут для этого кейса собеседования.</p><h3>1. Найдите ошибку в коде</h3><h4>Решение задачи</h4><p>Здесь приведены методы ActiveRecord. Метод .find_by! вернёт первый объект из базы без ключа. Так как бесключевой метод не экранирует SQL-запрос, появляется возможность сделать sql инъекцию. Это делает код небезопасным и уязвимым. Подробнее можно узнать про SQL Injection в Ruby on Rails <a href="https://rails-sqli.org/">на этой странице</a>.</p><p>Вторая ошибка в применении метода .delete, он удаляет запись без вызова коллбеков. Здесь необходимо заменить его на метод .destroy, чтобы вновь включить работу коллбеков.</p><h3>2. Опишите, как работает этот код</h3><h4>Решение задачи</h4><p>Cоздается Lambda, которая принимает единственный параметр a. Этот параметр выводится с помощью команды p, которая вызывает и передает атрибут строку "Lambda worked" с помощью [], где [] — это сокращённый вариант метода call.</p><h3>3. В чём разница между двумя нижеприведёнными методами?</h3><h4>Решение задачи</h4><p>Оператор += повторно инициализирует переменную новым значением, поэтому a += b эквивалентно a = a + b. Может показаться, что += изменяет значение, на самом деле, он создает новый объект и указывает старую переменную на вновь созданный объект. Разница имеет значение для производительности.</p><h2>Задачи по структурам данных и алгоритмам</h2><p>Для потенциального сотрудника в компании крупного бизнеса подойдут задачи по структурам данных и алгоритмам. Если кандидат умеет преобразовать алгоритм в чистый и структурированный код в хорошем стиле программирования, то, скорее всего, он будет успешно решать несколько задач одновременно. Проще говоря, он умён. А умные люди создают качественные и сложные продукты.</p><h3>1. Реализуйте алгоритм игры «Тайный Санта (Secret Santa)»</h3><p>Основная идея игры — анонимный обмен подарками. В шляпу кладутся небольшие записки с именами участников. Затем каждый играющий по очереди вытягивает бумажку с именем того, кому предстоит вручить презент. Реализуйте алгоритм жеребьёвки игры.</p><h4>Решение</h4><p>Стоит отметить, что у этой задачи есть несколько решений. Рассмотрим один из вариантов.</p><p>Для начала представим, что жеребьёвка — это рандомный список дарителей и получателей. Отобразим его в виде Hash, где ключи — это дарители, а значения — это получатели.</p><p>Возникает вопрос: как распределить участников игры, чтобы они не смогли выбрать самих себя? Для этого нужно взять список дарителей и сместить на один шаг, то есть тот, кто в списке был первым дарителем, станет последним получателем.</p><p>Так выглядит готовый список. Мы также решили проблему с нечётным и четным количеством участников, чтобы все смогли получить свой подарок.</p><p>Дальше реализовываем логику распределения. В алгоритме задачи есть участники и распределитель подарков, поэтому создадим сущности. На самом деле, можно обойтись и без них, но так кандидат покажет, что он способен думать абстракциями ООП.</p><p>После этого напишем простой тест, который будет проверять корректность функционирования вашего кода.</p><p>Теперь мы можем реализовать логику методом assign_recipients :</p><p>Теперь следует подумать, как реализовать рандомайзер, то есть как «встряхнуть шляпу» и применить логику привязки даритель-получатель. Для этого возьмём массив участников и применим к нему метод .shuffle!, после чего назначим получателей.</p><p>Теперь запущенный тест упадёт с ошибкой. Чтобы это исправить, применим mock для метода .shuffle! и озеленим тест.</p><p>В итоге мы получим такой код:</p><h4>Анализ сложности алгоритма</h4><p>Метод shuffle! реализует генерацию случайной перестановки, применяя алгоритм Фишера-Йетса. Он имеет временную сложность равную O(n) и константную пространственную сложность.</p><p>Также в решении задачи использовался один цикл, который проходит по всему списку участников. В этом же цикле мы заполняли Hash дарителей и получателей. Отсюда следует, что временная сложность и пространственная сложность равно O(n) ,где n — это количество участников игры.</p><h3>2. Проверьте сортировку слов по заданному алфавиту</h3><p>Предположим, что в других языках также используются строчные английские буквы, но, возможно, в другом порядке. Порядок алфавита — это некая система расположения строчных букв. Учитывая последовательность слов, написанных на чужом языке, и порядок в алфавите, нужно вернуть true, когда данные слова лексикографически отсортированы на этом языке.</p><p>Примеры:</p><p>Поскольку в этом языке перед буквой d стоит буква h, последовательность букв в заданном алфавите уже отсортирована.</p><p>Поскольку в этом языке d стоит после l , то words[0]&gt; words[1], следовательно последовательность не отсортирована.</p><p>Первые три символа «app» совпадают, а второе слово короче по количеству символов. Согласно лексикографическим правилам, «apple» больше «app», потому что l больше ∅, где ∅ определяется как пробел, который меньше любого другого символа.</p><h4>Решение</h4><p>Хорошим тоном считается, если кандидат напишет тесты в первую очередь:</p><p>Далее необходимо создать словарь с помощью ассоциативного массива Hash или просто массива:</p><p>Теперь повторим логику из того, что было написано в примерах:</p><p>После этого кандидат должен ответить с какой сложностью выполняется алгоритм.</p><h4>Анализ сложности выполнения алгоритма</h4><p>Временная сложность<b>:</b></p><ol><li>Создание словаря для сохранения порядка каждой буквы занимает O(n) времени.</li><li>В первом цикле мы сначала перебираем слова, а во вложенном — проверяем буквы этого слова. Временная сложность займет O(m), где m — это количество всех букв в словах. Таким образом, временная сложность составляет O (m+n). Но в словаре всегда 26 букв, в примерах меняется лишь порядок. Следовательно, временная сложность O(m), где m — это количество всех букв в словах.</li></ol><p>Пространственная сложность:</p><p>Мы используем только одну дополнительную структуру данных — это Hash или массив, где хранится порядок букв. Поскольку в словаре только 26 букв и их длина неизменна, мы имеем константную пространственную сложность.</p><p><b>Итоговый вид решения задачи:</b></p><p>На заключительном этапе технического интервью сообщите кандидату о временных рамках вашего решения. Обязательно сообщите о любых результатах собеседования в электронном письме. Поблагодарите за уделенное время, похвалите его за старания и, в случае отказа, предложите попробовать снова, но не менее чем через 6 месяцев. Это позволит остаться лояльной компанией в глазах соискателя, дать ему возможность подтянуть свои навыки и не упустить в будущем хорошего сотрудника.</p>]]></content:encoded>
    </item>
    <item>
      <title>5 древних шифров, которые непросто разгадать без подсказок</title>
      <link>https://tproger.ru/articles/5-drevnih-shifrov-kotorye-neprosto-razgadat-bez-podskazok</link>
      <comments>https://tproger.ru/articles/5-drevnih-shifrov-kotorye-neprosto-razgadat-bez-podskazok?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Клименков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/5-drevnih-shifrov-kotorye-neprosto-razgadat-bez-podskazok</guid>
      <description><![CDATA[<p>Пять фраз зашифрованы старинными способами, и для разгадки хватит логики и здравого смысла — к каждому шифру приложены три подсказки по очереди.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/5-drevnih-shifrov-kotorye-neprosto-razgadat-bez-podskazok">5 древних шифров, которые непросто разгадать без подсказок</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Криптография]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 19 Apr 2021 09:57:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>В современной криптографии используются шифры, которые не получится легко и быстро взломать даже с помощью мощных компьютеров. В древние времена наука шифрования начиналась с нескольких весьма несложных шифров.</p><p>Хотите попробовать свои силы и попрактиковаться в искусстве дешифрации — разгадайте эти пять фраз, зашифрованных разными старинными способами. Для их успешной разгадки достаточно использовать логику и здравый смысл.</p><p>К каждому шифру дано три подсказки. Если вы зашли в тупик — открывайте подсказки по очереди. Каждая из из них предоставит вам новую информацию об использованном шифре. Иногда даже название шифра помогает в его разгадке.</p><p>Разгадки — исходные текстовые сообщения — приведены в виде QR-кодов. Чтобы их посмотреть, можно использовать любую программу для получения текста из QR-кода.</p><p>При расшифровке учитывайте следующее:</p><ul><li>Для упрощения используем русский алфавит, состоящий из 32 букв — без буквы Ё.</li><li>Во всех зашифрованных фразах отсутствуют знаки препинания.</li></ul><h2>Шифр 1</h2><p><b>ПЛМДО ОИИАМ ЛПСМП ЕРТЕИ ТОАШЛ УГИАЯ МРНЕТ ЫАОТО СМГКР</b></p><p>Ответ:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/QR1.png" alt="" /></figure><h2>Шифр 2</h2><p><b>ЭРБВЮПЙШЩ ЯАЮУАРЬЬШБВ ТБХУФР ЯАХТАРВШВ СРУГ Т ДШЗГ</b></p><p>Ответ:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/QR2.png" alt="" /></figure><h2>Шифр 3</h2><p><b>КЭ ОЛЯВЦЭКЕЕ ДЭЗЭДФЕЗ АНЛЙЗЛ АЛЯЛНЕИ ЯЭГКШВ РЙКШВ ЯВЦЕ МНЛ МЛОИВБКЕЖ НВИЕД</b></p><p>Ответ:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/QR3.png" alt="" /></figure><h2>Шифр 4</h2><p><b>ВБ ЖБ ДА ЕВ ЖБ АВ ЖБ АГ АБ ББ ЖА АА ГБ ДГ ЗВ ВВ ЖБ ЕБ ЕА АВ АА БА ЖБ ВВ АА ЕА ВВ</b></p><p>Ответ:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/QR4.png" alt="" /></figure><h2>Шифр 5</h2><p><b>ТЯЗЧ РСОНЯТСЭЖЧХЧ ШЯЫЯИ ТЯОНСФГХС ОМПСЭД ИНС ЛСПУМФЧПМБН НЪКТЧИЪОХЧЪ ШЯЫЯТЧА РПЧ РСУСЖЧ ЩЪОНСЭ Ч УДИЯТЧА</b></p><p>Ответ:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/QR5.png" alt="" /></figure><p>Если хотите больше узнать о разных способах защиты информации, посмотрите нашу статью про <a href="https://tproger.ru/translations/10-codes-and-ciphers/">10 популярных кодов и шифров</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Собеседование в Apple: топ-30 вопросов и ответов</title>
      <link>https://tproger.ru/translations/sobesedovanie-v-apple-top-30-voprosov-i-otvetov</link>
      <comments>https://tproger.ru/translations/sobesedovanie-v-apple-top-30-voprosov-i-otvetov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Олег Борисенков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/translations/sobesedovanie-v-apple-top-30-voprosov-i-otvetov</guid>
      <description><![CDATA[<p>Технические и поведенческие вопросы соискателям, список нужных структур данных и алгоритмов, а также советы по прохождению этапов найма в компании.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/translations/sobesedovanie-v-apple-top-30-voprosov-i-otvetov">Собеседование в Apple: топ-30 вопросов и ответов</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Apple]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Переводы]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 16 Apr 2021 12:19:37 GMT</pubDate>
      <content:encoded><![CDATA[<p>Собеседование в Apple — непростая задача. В этой статье вы найдёте вопросы, которые чаще всего задают соискателям, и советы по прохождению собеседования.</p><p>Содержание:</p><ol><li>Как проходит собеседование в AppleМассивы и графыСвязные спискиДеревьяСтрокиДинамическое программированиеМатематика, статистика и поиск с возвратомПоиск и проектированиеПоведенческие вопросыСоветы по прохождению собеседования</li></ol><h2>Как проходит собеседование в Apple</h2><p>Взаимодействие с компанией обычно состоит из следующих шагов:</p><ol><li>Предварительный разговор с рекрутером: в среднем ответ на резюме занимает около недели. Обычно с вами связываются по email или LinkedIn, чтобы договориться о телефонном звонке. Звонок длится от 15 минут до получаса. На этом этапе не будет серьёзных технических вопросов. Вас могут спросить о том, почему вы хотите работать в этой компании или какой ваш любимый продукт Apple.</li><li>Техническое собеседование по телефону: обычно назначается через неделю. Таких собеседований может быть одно или два. В течение часа вам будут задавать вопросы о вашем резюме, алгоритмах и структурах данных. Из них полчаса будет отведено на выполнение заданий.</li><li>Собеседование в офисе: такое собеседование длится примерно шесть часов. С вами пообщаются около десяти сотрудников компании. В процессе собеседования с вами обсудят ваши знания, зададут поведенческие вопросы и дадут задания с кодом. Каждое интервью длится около часа. Поведенческие вопросы особенно важны если вы собеседуетесь на роль менеджера.</li></ol><p>Структуры данных, которые нужно знать: массивы, связные списки, стеки, очереди, деревья, графы, кучи, hash set и hash map.</p><p>Алгоритмы, которые нужно знать: поиск в глубину, поиск в ширину, бинарный поиск, быстрая сортировка, сортировка слиянием, динамическое программирование, парадигма «<a href="https://ru.wikipedia.org/wiki/Разделяй_и_властвуй_(информатика)">Разделяй и властвуй</a>».</p><h2>Массивы и графы</h2><h3>Поиск трёх чисел в массиве</h3><p>Формулировка: Дан массив целых чисел и значение, определите, есть ли в этом массиве три числа, сумма которых равна этому значению.</p><p>В этом коде мы сортируем массив. Затем фиксируем один элемент e и находим пару — (a, b), среди оставшихся элементов массива, такую что required_sum - e = a + b.</p><p>Мы начинаем с первого элемента массива — e, и пытаемся найти такую пару значений (a, b) в оставшемся массиве (например от A[i + 1] до A[n – 1]), которая удовлетворяет условию a+b = required_sum – e. Если мы её нашли, то выходим из цикла.</p><p>В противном случае мы повторяем описанные шаги для всех элементов с индексами от 1 до n – 3 до тех пор, пока не найдём соответствующую пару.</p><p>Вычислительная сложность: квадратичная, O(n²).</p><p>Эффективность алгоритма: константная, O(1).</p><h3>Объединение пересекающихся интервалов</h3><p>Цель этого задания – объединить все пересекающиеся интервалы в списке, чтобы получить список, в котором останутся только непересекающиеся интервалы.</p><p>Формулировка: Дан массив (список) пар интервалов, где каждый интервал это timestamp, отсортированный по первому значению. Объедините пересекающиеся интервалы и верните полученный массив.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/1_KrMSs5uggLB_XhXaptBBnA.png" alt="" /></figure><p>В данном примере интервалы: (1, 5), (3, 7), (4, 6),( 6, 8) пересекаются и должны быть объединены в интервал (1, 8). Интервалы (10, 12) и (12, 15) должны быть объединены в (10, 15).</p><p>Эту задачу можно решить с помощью алгоритма linear scan.</p><p>Для каждого интервала из списка:</p><ol><li>Если интервал из входного списка пересекается с последним интервалом из результирующего списка, то они объединяются, и результат заменяет последний интервал в результирующем списке.</li><li>В противном случае, интервал из входного списка добавляется в итоговый список.</li></ol><p>Сложность: линейная, O(n).</p><p>Эффективность: линейная, O(n).</p><h3>Клонировать ориентированный граф</h3><p>Формулировка: Есть корневой узел ориентированного графа, нужно клонировать граф с помощью глубокого копирования. Клонированный граф должен иметь такие же ребра и узлы.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/node-autoconverted.jpeg" alt="" /></figure><p>Мы используем обход в глубину и создаем копию каждого узла в процессе обхода графа. В хэш-таблице сохраняем каждый скопированный узел, чтобы не скопировать его дважды. Ключ в хэш-таблице – это узел в оригинальном графе и его значение, соответствующее значению в скопированном графе.</p><p>Сложность: линейная, O(n).</p><p>Эффективность: логарифмическая, O(n), где n — это количество вершин графа.</p><h2>Связные списки</h2><h3>Сложение двух чисел</h3><p>Формулировка: Даны указатели на головы двух связных списков, где каждый список это целое число (каждый узел это цифра). Сложите их и верните результат.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/add.png" alt="" /></figure><p>Допустим, что мы хотим сложить 9901 и 237. В результате должно получиться 10138.</p><p>Для облегчения задачи числа хранятся в инвертированных связных списках. Самая значимая цифра числа это последний элемент списка. Мы начинаем сложение с голов списков.</p><p>На каждой итерации мы складываем текущие числа и добавляем результат в хвост итогового списка. Для каждого шага нужно учитывать переполнение.</p><p>Нам нужно сделать это для каждого узла обоих списков. Если один из них кончится раньше, мы продолжаем действия для оставшегося. Когда списки закончатся, и не будет чисел, которые переносятся, алгоритм заканчивается.</p><p>Сложность: линейная, O(n).</p><p>Эффективность: линейная, O(n).</p><h3>Слияние двух отсортированных связных списков</h3><p>Формулировка: Даны два отсортированных связных списка, объедините их так, чтобы итоговый список остался отсортированным.</p><p>Указатели на голову и хвост итогового списка сохраняются. Его голова будет результатом сравнения первых узлов объединяемых списков.</p><p>Для всех последующих узлов, выбираем наименьший текущий и добавляем его в хвост итогового списка. Затем сдвигаем текущий указатель этого списка на шаг в перед.</p><p>Если один из списков кончился, то оставшиеся элементы другого добавляются в хвост итогового списка. Изначально итоговый список — Null.</p><p>Сравниваем значения первых двух узлов и создаём узел с меньшим значением в голове итогового списка. В примере это 4 в head1. Пока в списке только один узел, то он будет также и хвостом. Затем сдвигаем голову head1 на один шаг вперёд.</p><p>Сложность: линейная, O(m+n), где m и n — это длины первоначальных списков.</p><p>Эффективность: константная, O(1).</p><h2>Деревья</h2><h3>Проверить два бинарных дерева на идентичность</h3><p>Формулировка: Даны два бинарных дерева. Нужно проверить их на идентичность, то есть у них должны быть одинаковые структуры и данные в каждом узле.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/trees.png" alt="" /></figure><p>Эта задача решается с помощью рекурсии. Рекурсия останавливается, если хотя бы один из сравниваемых узлов равен null.</p><p>Деревья A и B идентичны если:</p><ul><li>Данные в корневых узлах этих деревьев идентичны или равны null.</li><li>Левое поддерево A идентично левому поддереву B.</li><li>Правое поддерево A идентично правому поддереву B.</li></ul><p>Это проблема решается с помощью одновременного глубокого обхода и сравнения данных на каждом уровне.</p><p>Сложность: линейная, O(n).</p><p>Эффективность: O(h) для лучшего случая, или O(logn) для сбалансированного дерева, или O(n) для худшего случая.</p><h3>Отзеркаливание узлов бинарного дерева</h3><p>Формулировка: Дано бинарное дерево. Нужно поменять местами левых и правых потомков каждого узла.</p><p>Мы используем обратный обход бинарного дерева. Меняем местами левого и правого потомка каждого узла. Используем обход в глубину — перед возвращением из узла все его потомки пройдены и отзеркалены.</p><p>Сложность: линейная, O(n).</p><p>Эффективность: линейная, в худшем случае O(n).</p><h2>Строки</h2><h3>Найти все палиндромы в строке</h3><p>Формулировка: Дана строка, найдите все возможные подстроки палиндромы длиной больше одного символа. Строка — «aabbbaa».</p><p>От каждой буквы из входной строки начинаем расширятся влево и вправо, проверяя на палиндромы подстроки чётной и нечетной длины. Затем, если палиндрома нет, переходим на следующую букву.</p><p>Сложность: квадратичная, O(n²).</p><p>Эффективность: константная, O(1).</p><h3>Смена порядка слов в предложении</h3><p>Формулировка: Обратите порядок слов в предложении (хранящемся в массиве символов). Строка — «Hello world!».</p><p>Решение состоит из двух этапов: переворот строки и обход строки и переворот каждого слова.</p><p>Сложность: линейная, O(n).</p><p>Эффективность: константная, O(1).</p><h2>Динамическое программирование</h2><h3>Поиск подотрезка массива с максимальной суммой элементов</h3><p>Формулировка: Найдите подотрезок в массиве, используя динамическое программирование и алгоритм Кадане. В приведённом ниже массиве такой отрезок имеет индексы (3, 6).</p><figure><img src="https://media.tproger.ru/uploads/2021/04/kadane.png" alt="" /></figure><p>Мы используем для решения алгоритм Кадане. Идея алгоритма в том, чтобы просканировать весь массив и для каждой позиции найти наибольшую сумму для отрезка массива, который кончается в этой позиции. Это достигается сохранением текущей максимальной суммы (current_max) для текущего индекса и global_max (максимальной для всего массива).</p><p>Код алгоритма:</p><p>Сложность: линейная, O(n).</p><p>Эффективность: константная, O(1).</p><h2>Математика и статистика</h2><h3>Возведение числа в степень</h3><p>Формулировка: Даны два числа, x (double) и y (integer), напишите функцию, которая возводит x в степень y.</p><p>Для наиболее эффективного решения этой задачи мы используем алгоритм «Разделяй и властвуй». На стадии разделения мы рекурсивно делим n на 2 пока не достигнем условия выхода.</p><p>На стадии объединения мы получаем результат подпроблемы r и вычисляем результат текущей проблемы, используя следующие правила:</p><ul><li>Если n — чётное, результат — r * r (где r — это результат подпроблемы)</li><li>Если n — нечётное, результат — x * r * r (где r — это результат подпроблемы)</li></ul><p>Сложность: логарифмическая, O(logn).</p><p>Эффективность: логарифмическая, O(logn).</p><h3>Найти комбинации чисел дающие указанную сумму</h3><p>Формулировка: Дано положительное целое число target, выведите все возможные комбинации положительных целых чисел, сумма которых равна target.</p><p>Вывод должен быть либо в форме массива массивов, либо списка списков, где каждый элемент это одна комбинация. Вот пример для числа 5:</p><p>Мы рекурсивно перебираем все возможные комбинации сумм и печатаем подходящую комбинацию.</p><p>Каждый вызов рекурсии содержит цикл, который работает от start до target (start изначально равен 1). current_sum это переменная, которая увеличивается с каждым вызовом рекурсии.</p><p>Каждый раз, когда значение добавляется в current_sum, оно также добавляется в список result. Когда current_m = target мы знаем, что список result содержит комбинацию, которая добавляется в финальный список output. Вот пример:</p><p>Перед каждым рекурсивным вызовом в result добавляется элемент. После вызова этот элемент удаляется, для очистки списка.<br />Сложность: экспоненциальная, O².<br />Эффективность: линейная, O(n).</p><h2>Поиск и проектирование</h2><h3>Поиск в циклически сдвинутом массиве</h3><p>Формулировка: Нужно найти конкретное число в отсортированном массиве (с уникальными элементами), который был циклически сдвинут на некоторое число, учитывая, что массив не содержит дубликатов. Верните -1 если такого числа не найдено.</p><p>Вот массив до сдвига:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/arr1.png" alt="" /></figure><p>Вот массив поле сдвига на 6 позиций:</p><figure><img src="https://media.tproger.ru/uploads/2021/04/arr2.png" alt="" /></figure><p>Для решения мы использовали немного модифицированный бинарный поиск. Отметим, что как минимум одна половина массива всегда отсортирована. Если число n находится в этой половине, тогда проблема решается бинарным поиском.</p><p>Сложность: логарифмическая, O(logn).</p><p>Эффективность: логарифмическая, O(logn).</p><h3>Реализовать LRU-кэш</h3><p>Формулировка: Алгоритм LRU заключается в том, что для добавления новых элементов из кэша удаляются элементы, которые дольше всего не использовались.</p><p>Для примера возьмём кэш, в который помещаются 4 элемента. В нем находятся 4 элемента.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/cach1.png" alt="" /></figure><p>Теперь мы добавим туда элемент — 5.</p><figure><img src="https://media.tproger.ru/uploads/2021/04/cash2.png" alt="" /></figure><p>Кэширование — это техника хранения данных в более быстром хранилище (обычно в оперативной памяти), для того чтобы иметь к ним быстрый доступ. Обычно кэш ограничен в объёме. Поэтому при заполнении кэша нужно удалять из него данные.</p><p>LRU — очень простой и популярный алгоритм для этого. Мы удаляем самые старые данные, чтобы освободить место для новых.</p><p>Чтобы реализовать LRU кэш, нам понадобятся две структуры данных: хэш-таблица и двусвязный список. Двусвязный список помогает поддерживать порядок удаления из кеша, а хэш-таблица используется для поиска кэшированных элементов.</p><p>Вот описание алгоритма:</p><p>Замечание: Элемент, находящийся в конце списка — последний использовавшийся. Новые элементы также добавляются в конец списка.</p><p>Сложность:</p><ul><li>get (hashset): константная,O(1).</li><li>set (hashset): константная,O(1).</li><li>Удаление головы при добавлении нового элемента: константная,O(1).</li><li>Поиск для удаления и добавления в хвост: линейная,O(n).</li></ul><p>Эффективность: линейная, O(n), где n — размер кэша.</p><h2>Поведенческие вопросы на собеседовании в Apple</h2><ol><li>Расскажите про ваш самый лучший и самый худший день, за последние 4 года.</li><li>Расскажите про ваш любимый продукт или сервис Apple. Объясните почему.</li><li>Опишите достижение, которым вы особенно гордитесь.</li><li>Были ли у вас разногласия с менеджерами по рабочим вопросами. Опишите ситуацию и то, как вы разрешили конфликт.</li><li>Как вы преодолевали неудачу? Что вы из этого вынесли?</li><li>Почему вы хотите работать в Apple?</li><li>Что первое вы замечаете, когда заходите в Apple Store?</li><li>Опишите самую сложную проблему в разработке, с которой вы сталкивались. Как вы её решили?</li><li>Если вас примут в Apple, то будете ли вы скучать по чёму-то с прошлой работы? По чёму вы будете скучать больше\меньше всего?</li><li>Занимаетесь ли вы улучшением своих навыков вне работы?</li><li>Опишите случай, когда вы сделали для клиента всё возможное.</li><li>Объясните 8-ми летнему ребёнку, что такое модем\роутер и его функции.</li><li>Как должность, на которую вы претендуете, сочетается с вашим 5-ти летним карьерным или жизненным планами?</li><li>Над чем вы хотели бы работать, если мы вас наймём?</li><li>Как бы вы тестировали ваше любимое приложение?</li><li>Как бы вы повели себя, если бы в поддержку обратился клиент с устаревшим продуктом?</li></ol><p>На собеседовании в Apple советуем вам использовать метод STAR для ответа на поведенческие вопросы:</p><ul><li>Опишите ситуацию.</li><li>Опишите задачу.</li><li>Опишите шаги которые нужно предпринять для её решения.</li><li>Опишите достигнутый результат.</li></ul><h2>Советы для подготовки к собеседованию в Apple</h2><ul><li>Работайте с разными инструментами. Хорошая идея сочетать использование маркерной доски, онлайн курсов, и имитации собеседования. Очень важно тренироваться говорить вслух о том, как вы решаете задачу.</li><li>Напишите план обучения. Рекомендуется написать детальный план на 3-6 месяцев, чтобы ничего не упустить.</li><li>Избегайте заучивания. Также не заучивайте вопросы. Вместо этого практикуйтесь в создании реальных продуктов, которые могла бы использовать Apple. Это идеальный способ подготовиться к собеседованию: вы изучаете концепции, практикуетесь в решении проблем и обретаете уверенность, проектируя для Apple.</li></ul><p>Удачи на собеседовании!</p>]]></content:encoded>
    </item>
    <item>
      <title>7 логико-математических задач про бегемотов, которые заставят поломать голову</title>
      <link>https://tproger.ru/articles/7-logiko-matematicheskih-zadach-pro-begemotov-kotorye-zastavjat-polomat-golovu</link>
      <comments>https://tproger.ru/articles/7-logiko-matematicheskih-zadach-pro-begemotov-kotorye-zastavjat-polomat-golovu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Клименков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/articles/7-logiko-matematicheskih-zadach-pro-begemotov-kotorye-zastavjat-polomat-golovu</guid>
      <description><![CDATA[<p>Семь несложных логических и математических задач про разумных цивилизованных бегемотов, которые живут на острове, с объяснениями решений.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/articles/7-logiko-matematicheskih-zadach-pro-begemotov-kotorye-zastavjat-polomat-golovu">7 логико-математических задач про бегемотов, которые заставят поломать голову</a>»</p>]]></description>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Пост пользователя]]></category>
      <category><![CDATA[Статьи]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 09 Apr 2021 09:19:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Предлагаю вам для развлечения решить семь несложных логических и математических задач про разумных цивилизованных бегемотов, живущих на острове.</p><h2>1. Интегральное исчисление и мороженое</h2><p>Бегемоты знают интегральное исчисление. Все бегемоты любят мороженое. Какое из следующих утверждений является истинным?</p><ol><li>Бегемоты, которые знают интегральное исчисление, не любят мороженое.</li><li>Все, кто знает интегральное исчисление, любят мороженое.</li><li>Бегемоты, которые любят мороженое, не знают интегральное исчисление.</li><li>Некоторые знатоки интегрального исчисления любят мороженое.</li><li>Интегральное исчисление знают только бегемоты.</li><li>Все знатоки интегрального исчисления не любят мороженое.</li></ol><h2>2. Задача про апельсины</h2><p>Два бегемота съели 100 апельсинов. Первый бегемот потратил на это на 5 часов больше, чем второй, и съел за эти 5 часов 10 апельсинов. Но второй бегемот пожирал апельсины на 50 % быстрее. Сколько времени затратил каждый бегемот на поглощение апельсинов?</p><h2>3. Законы физики в бассейне</h2><p>После плотного перекуса бегемоты отдыхали у бассейна. Они решили устроить конкурс — кто из них самый толстый. Бассейн полон воды и достаточно большой, чтобы в нём поместились все бегемоты разом. Поблизости нет никаких измерительных инструментов. Что вы посоветуете бегемотам?</p><h2>4. Считаем кокосы</h2><p>После купания один из бегемотов задумчиво разглядывал пальмы и считал кокосы. На первой пальме было 11 кокосов, на второй — 16, на третьей — 7, на четвёртой — 21, на пятой вообще не было кокосов, а на шестой выросло целых 34 кокоса. «Какие-то неправильные пальмы», — подумал бегемот. Чем бегемоту не понравились пальмы?</p><h2>5. Задача про апельсиновый сок</h2><p>Устав от созерцания кокосов, бегемот захотел пить и заказал в интернет-магазине 230 литров апельсинового сока. Его доставили вертолётом в одной огромной бочке. Этот сок надо поделить между пятью бегемотами. Как за минимальное количество шагов поделить апельсиновый сок поровну между бегемотами, если у них есть только две ёмкости — 21 и 17 литров?</p><h2>6. Бегемоты программируют на Python</h2><p>Иногда полезно и поработать! Некоторые бегемоты программируют на Python. Все программисты на Python носят шляпы. Какие из следующих утверждений являются истинными:</p><ol><li>Все бегемоты носят шляпы.</li><li>Некоторые из тех, кто носят шляпы, — бегемоты.</li><li>Все те, кто носят шляпы, программируют на Python.</li><li>Все программисты на Python — бегемоты.</li><li>Некоторые бегемоты, которые не программируют на Python, могут носить шляпы.</li><li>Некоторые программисты на Python могут не носить шляпы.</li></ol><h2>7. Лотерея</h2><p>Заработав немного денег, наши бегемоты решили сыграть в лотерею. Лотерейные билеты имеют семизначные номера. Бегемоты решили купить такие билеты, у которых сумма цифр в номере будет равняться их любимому числу — 62. Сколько всего билетов смогут купить бегемоты, если все билеты пока есть в наличии?</p><p>Если хотите ещё немного размять мозги, посмотрите подборку <a href="https://tproger.ru/articles/10-logicheskih-zadach-s-sobesedovanij-kotorye-zastavjat-zastrelitsja/">10 логических задач с собеседований, которые заставят застрелиться</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>7 логико-математических задач: от простого к сложному</title>
      <link>https://tproger.ru/quiz/7-logiko-matematicheskih-zadach</link>
      <comments>https://tproger.ru/quiz/7-logiko-matematicheskih-zadach?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/quiz/7-logiko-matematicheskih-zadach</guid>
      <description><![CDATA[<p>Устали программировать? Отвлекитесь и попробуйте решить 7 коротеньких задачек на логическое мышление и знание математики.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/quiz/7-logiko-matematicheskih-zadach">7 логико-математических задач: от простого к сложному</a>»</p>]]></description>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Викторины]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 19 Feb 2021 12:22:21 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы подготовили для вас небольшой тест, который позволит скоротать время и заодно прокачать математические навыки на интересных задачках. А если этого окажется недостаточно, попытайте удачу в решении ещё ряда <a href="https://tproger.ru/articles/7-zakovyristyh-logiko-matematicheskih-zadach/">заковыристых логико-математических задач</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Отмеряем минуты фитилями и доказываем прямоугольность треугольника — две логические задачи</title>
      <link>https://tproger.ru/problems/otmerjaem-minuty-fitiljami-i-dokazyvaem-prjamougolnost-treugolnika-dve-logicheskie-zadachi</link>
      <comments>https://tproger.ru/problems/otmerjaem-minuty-fitiljami-i-dokazyvaem-prjamougolnost-treugolnika-dve-logicheskie-zadachi?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/otmerjaem-minuty-fitiljami-i-dokazyvaem-prjamougolnost-treugolnika-dve-logicheskie-zadachi</guid>
      <description><![CDATA[<p>Как отмерить 7 минут 30 секунд четырьмя фитилями, каждый из которых горит 60 минут неравномерно, и доказать прямоугольность треугольника.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/otmerjaem-minuty-fitiljami-i-dokazyvaem-prjamougolnost-treugolnika-dve-logicheskie-zadachi">Отмеряем минуты фитилями и доказываем прямоугольность треугольника — две логические задачи</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 30 Dec 2020 14:53:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>У меня есть две любимые логические задачи.</p><h2>Задача 1</h2><p>Вы специалист-подрывник. Вам нужно уничтожить объект с помощью заряда, который должен сдетонировать ровно через 7 минут 30 секунд. Но вот беда, саму взрывчатку вы взяли, а детонатор забыли. Но в вашем распоряжении есть 4 фитиля одинаковой длины. Каждый из них горит ровно 60 минут, но неравномерно (т.е. если поделить фитиль пополам, то время горения не будет равным 30 минутам). Как отмерить 7,5 минут с помощью этих фитилей? Скручивать, складывать, резать и рвать можно, но это бесполезно.</p><h2>Задача 2</h2><p>Доказать, что вписанный в полуокружность треугольник с диаметром в основании всегда будет прямоугольным треугольником. <a href="https://media.tproger.ru/uploads/2020/12/123464_423d109b_CtngjCYF_1607251041.png"></a></p>]]></content:encoded>
    </item>
    <item>
      <title>Задачи с собеседований: ищем самый тяжёлый шар за два измерения</title>
      <link>https://tproger.ru/problems/zadachi-s-sobesedovanij-ishhem-samyj-tjazhjolyj-shar-za-dva-izmerenija</link>
      <comments>https://tproger.ru/problems/zadachi-s-sobesedovanij-ishhem-samyj-tjazhjolyj-shar-za-dva-izmerenija?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/zadachi-s-sobesedovanij-ishhem-samyj-tjazhjolyj-shar-za-dva-izmerenija</guid>
      <description><![CDATA[<p>Как найти более тяжёлый из восьми одинаковых шариков, если весы выдержат лишь два взвешивания — задача на алгоритмы и системный поиск решения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/zadachi-s-sobesedovanij-ishhem-samyj-tjazhjolyj-shar-za-dva-izmerenija">Задачи с собеседований: ищем самый тяжёлый шар за два измерения</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 29 Dec 2020 15:45:02 GMT</pubDate>
      <content:encoded><![CDATA[<p>Предлагаемая задача позволяет определить, насколько соискатель умеет строить алгоритмы и системно искать решения.</p><h2>Условие задачи</h2><p>Представьте, что у Вас есть 8 металлических шариков, которые выглядят одинаково. Один из них — более тяжелый. И представьте, что у Вас есть весы с двумя чашами.</p><p>Эти весы настолько старые, что выдержат только два измерения, после которых сломаются. Как с помощью весов за два измерения найти один тяжелый шарик?</p><h2>Разбор задачи</h2><p>Делаем первое измерение: на обе чаши весов кладем по 3 шарика. 2 оставшихся шарика откладываем в сторону и не взвешиваем на данном измерении.</p><p>Возможны два варианта результата первого измерения:</p><p>Вариант 1. Ни одна из чаш весов не перевесила другую. Значит искомый шарик находится среди двух отложенных. В этом случае второе измерение делаем положив по 1 шарику на каждую чашу весов. Тот, который оказался в перевесившей чаше и есть наш искомый шарик.</p><p>Вариант 2. Одна из чаш весов перевесила другую (значит искомый шарик находится среди трех шариков этой чаши), в следующее измерение включаем только три шарика из этой чаши. Делаем второе измерение: на каждую чашу весов кладем по 1 шарику, а третий откладываем в сторону. Если одна из чаш весов перевесила, значит искомый шарик находится в ней. Если ни одна из чаш весов не перевесила другую, значит искомый шарик – тот, что мы отложили перед вторым измерением.</p><h2>Оценка решения задачи</h2><p>В идеальном случае соискателю следует уточнить, являются ли 7 из 8 шариков одинаковыми по весу. Наличие этого и других вопросов с уточнениями требований дают понимание об уровне соответствующей компетенции.</p><p>Доступность объяснения решения задачи (визуализация, или связный логический рассказ) — демонстрация навыков коммуникации.</p><p>Если соискатель затрудняется в решении задачи, то можно дать ему подсказку — «в измерении могут участвовать не все шарики».</p><p>Дополнительно задача позволяет оценить и спроектировать на рабочие ситуации следующие аспекты:</p><ul><li>как соискатель подходит к уточнению условий/требований;</li><li>проявляет ли критическое мышление в адрес условий/требований;</li><li>как выполняет поиск решения;</li><li>что соискатель предпринимает, когда заходит в тупик при решении;</li><li>к какой категории восприятия можно отнести соискателя (визуал, аудиал, кинестетик, дискрет).</li></ul>]]></content:encoded>
    </item>
    <item>
      <title>Как Гомер Симпсон почти решил уравнение Великой теоремы Ферма</title>
      <link>https://tproger.ru/problems/kak-gomer-simpson-pochti-reshil-uravnenie-velikoj-teoremy-ferma</link>
      <comments>https://tproger.ru/problems/kak-gomer-simpson-pochti-reshil-uravnenie-velikoj-teoremy-ferma?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Клименков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/kak-gomer-simpson-pochti-reshil-uravnenie-velikoj-teoremy-ferma</guid>
      <description><![CDATA[<p>Великая теорема Ферма, Гомер Симпсон и Дональд Кнут в одной задаче: она посильна начинающему программисту и позволяет проверить героя.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/kak-gomer-simpson-pochti-reshil-uravnenie-velikoj-teoremy-ferma">Как Гомер Симпсон почти решил уравнение Великой теоремы Ферма</a>»</p>]]></description>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 17 Dec 2020 10:14:25 GMT</pubDate>
      <content:encoded><![CDATA[<p>Казалось бы, что может быть общего между одной из самых популярных математических теорем, Гомером Симпсоном и Дональдом Кнутом? Как и многие другие интересные идеи и задачи, их объединяет математика. Иногда даже кажется, что почти всё в этом мире сводится к математике и программированию.</p><p>Задача, о которой я хочу рассказать, совсем не сложная. Думаю, её без труда сможет решить даже начинающий программист. Но эта задача интересна и весьма необычна. Согласитесь, ведь не каждый день предоставляется возможность проверить вычисления героя культового мультсериала Гомера Симпсона?</p><h2>Что это за теорема?</h2><p>Большинство читателей Tproger, конечно же, неоднократно слышали о Великой теореме Ферма. О ней написано множество научных статей, она упоминается в книгах, рассказах, фильмах и мультсериалах. Не удивлюсь, если ей даже посвящена какая-нибудь басня.</p><p>Для тех, кто подзабыл, что это за теорема, приведу краткий экскурс в историю:</p><ol><li>В третьем веке до нашей эры Диофант Александрийский пишет труд по арифметике, в котором предлагает читателям найти решение уравнения x2 +y2 = z2 в целых числах.</li><li>В 1637 году Пьер Ферма изучает книгу Диофанта Александрийского. Ферма без труда понимает, что у предложенного уравнения бесконечное количество решений и предлагает гораздо более интересную задачу: найти целочисленные решения для уравнения x3+ y3 = z3. Эта задача оказалась уже не такой простой, как предыдущая. Ферма смог найти только тривиальные решения, вроде 03 + 73 = 73. Это, конечно, математически верно, но совершенно неинтересно. В итоге Ферма решает, что для целых степеней p &gt; 2 уравнение xp + yp = zp не имеет целочисленных решений. Это и есть та самая Великая теорема Ферма. Причём это была не просто гипотеза: Ферма удалось строго математически доказать это утверждение (не будем тут останавливаться на версии, что Ферма просто пошутил). Однако он не стал записывать доказательство, вместо этого он написал на полях книги Диофанта такую фразу: «Я нашёл этому поистине чудесное доказательство, но поля книги слишком узки для него». Кстати, вам это не напоминает некоторые технические задания: «Тут и так всё ясно — нечего и записывать»?</li><li>С 1637 года до нашего времени математики пытались доказать Великую теорему Ферма. Некоторым удалось найти доказательство для отдельных малых степеней (3, 5, 7 и некоторых других). Но доказать теорему полностью не удавалось никому.</li><li>В 1995 году математик Эндрю Уайлс из Принстонского университета наконец опубликовал полное доказательство теоремы. Текст доказательства занимает 130 страниц математических формул. Хотя теорема и доказана, многие математики сомневаются, что сам Ферма имел в виду именно такое громоздкое доказательство. Кроме того, Уайлс использовал множество современных математических методов, которые ещё не существовали во времена Ферма.</li></ol><p>При чём здесь Гомер Симпсон?</p><p>В 1998 году на экраны вышла очередная серия десятого сезона «Симпсонов» — «Волшебник вечнозелёной аллеи». В ней Гомер Симпсон соревнуется в изобретательском таланте с самим Томасом Эдисоном. Как и у каждого заправского изобретателя у Гомера есть грифельная доска, на которой он пишет разные формулы и рисует чертежи будущих изобретений. В течение нескольких секунд мы видим в кадре эту доску, на которой написано равенство: 378712 + 436512 = 447212. Там есть другие надписи и рисунки, но нас сейчас интересует именно эта запись. Выглядит так, будто Гомер написал решение уравнения Великой теоремы Ферма. Но к этому мы ещё вернёмся.</p><p>Доска изобретателя Гомера — это одна из многочисленных математических шуток в «Симпсонах». В сериале они появляются постоянно: в виде особенных чисел, формул, чертежей, фраз героев, кодов и шифров. Некоторые из них видны в кадре всего на мгновение, но внимательные зрители их находят и стараются разгадать.</p><p>В таком обилии математических отсылок и аллюзий в сериале нет ничего удивительного: многие сценаристы «Симпсонов» имеют математическое образование. Например, один из сценаристов серии «Волшебник вечнозелёной аллеи» Дэвид Коэн — это математик и программист, который в какой-то момент увлёкся написанием весёлых историй для популярного сериала. Интересно, что в школе Дэвид был типичным «гиком», организатором группы программистов Glitchmaster («Мастера глюков»), которая занималась программированием. Например, они разработали собственный язык программирования FLEET для разработки ускоренной графики на компьютере Apple II Plus. Затем он одновременно закончил Гарвард (получив степень бакалавра по физике) и Беркли (получив степень магистра по компьютерным наукам).</p><p>Нет ничего удивительного, что в сериале, написанном программистами, физиками и математиками, периодически появляются математические шутки и загадки. Этой теме посвящена очень интересная книга «Симпсоны и их математические секреты», написанная Саймоном Сингхом в 2016 году. Там среди прочего описана и шутка про Великую теорему Ферма.</p><p>Кстати, похожее равенство появлялось в сериале и раньше — в серии, посвящённой Хэллоуину в 1995 году. Там есть эпизод, в котором Гомер из своего привычного плоского мира попадает в трёхмерное пространство. В странном мире трёхмерных моделей вокруг Гомера летает множество неких загадочных научных объектов и формул. Одна из них выглядит так: 178212 + 184112 = 192212. Кстати, автор этого эпизода — уже знакомый нам Дэвид Коэн.</p><h2>Чем особенны именно эти цифры?</h2><p>Давайте разберёмся, чем же так примечательны эти равенства. Напомню, что интересующие нас серии «Симпсонов» вышли в 1995 и 1998 годах — время начала расцвета «Симпсонов». В эти же годы появились одноимённые Windows 95 и 98, но до появления первой версии Android оставалось ещё 10 лет. Да и сама компания Google была основана только осенью 1998 года. В то время у инженеров, учёных и математиков ещё были в ходу инженерные (или научные) калькуляторы, на которых можно было делать довольно сложные вычисления. Поэтому зрители проверяли равенство, написанное Гомером, скорее всего, с помощью такого калькулятора.</p><p>Я решил повторить этот эксперимент и отыскал свой старый добрый CASIO FX-911W, который верой и правдой служил мне на бесконечных лабораторных работах по физике и электротехнике, а потом и в аспирантуре. Как ни удивительно, спустя 20 лет калькулятор всё ещё прекрасно функционирует. Проверить уравнение несложно. Набираем:</p><p>(3987 [xy] 12 + 4365 [xy] 12) [xy] (1÷12) =</p><p>Получаем ответ: 4472.</p><p>Что примечательно, ответ целый, дробная часть полностью отсутствует. Всё выглядит так, как будто Гомер Симпсон успешно нашёл решение уравнения Великой теоремы Ферма в целых числах.</p><p>Аналогично можно проверить и второе равенство:</p><p>(1782 [xy] 12 + 1841 [xy] 12) [xy] (1÷12) =</p><p>Ответ: 1922.</p><p>Если у вас тоже есть инженерный калькулятор, вы можете разыграть своих друзей, интересующихся математикой. Секрет заключается в том, что числа 4472 и 1922 настолько близки к решению, что десяти разрядов калькулятора уже недостаточно, чтобы показать первый отличный от нуля разряд дробной части.</p><p>Современные компьютерные программы-калькуляторы уже считают гораздо точнее, с ними такой фокус не пройдёт. Например, калькулятор Google для первого выражения выдаст ответ 4472,00000001. Так что чуда не произошло — в математике «почти» не считается. Но на инженерном калькуляторе действительно выглядит эффектно.</p><h2>Постановка задачи</h2><p>В книге Саймона Сингха не только рассказывается вся эта история, но и упоминается, что Дэвид Коэн написал программу для нахождения решения уравнения, наиболее близкого к целому числу. Прочитав это, я захотел сам написать аналогичную программу, чтобы не только воспроизвести равенства Гомера Симпсона, но и найти другие варианты решения. Понятно, что никакой реальной пользы от такой программы не будет, но задач с практическим смыслом нам всем и так хватает в повседневной жизни. Иногда хочется написать что-то страшно непрактичное.</p><p>Написать такую программу — задача совсем не сложная. Её решение доступно любому начинающему программисту. Нам потребуется просто перебрать значения из определённого диапазона и найти наилучшее решение.</p><p>Сформулирую задачу. Нужно найти решение Великой теоремы Ферма в целых числах (шутка!). На самом деле нужно найти целые числа a и b и целую степень p, которые дают наиболее близкое к целому число c в выражении: ap + bp = cp.</p><p>У задачи есть важное ограничение, о котором нужно не забыть. Программа не должна выдавать тривиальные решения. Например, решение 100050 + 50050 = 100050 не подходит. Понятно, что второе слагаемое настолько меньше первого, что им вообще можно пренебречь.</p><p>Кстати, в сети пишут, что Дональд Кнут в первом издании своего «Искусства программирования» (1968 год) предложил читателям написать программу, которая доказывала бы Великую теорему Ферма. Он оценил решение этой задачи по максимуму: в 50 баллов. Также пишут, что в разделе ответов он указал, что один из читателей «нашёл потрясающее доказательство, но места для него недостаточно». Дональд Кнут тоже не прочь был пошутить.</p><h2>Самый простой вариант решения</h2><p>Приведу здесь самый простой вариант решения. Поскольку в «Симпсонах» в обоих равенствах используются четырёхзначные числа, попробуем решить задачу именно для них. При этом будем проверять степени от 3 до 20. Чтобы избежать тривиальных решений, ограничим значение b. Пусть оно будет отличаться от a не больше, чем на 500. Отдельно найдём решение для чисел, которые чуть больше и чуть меньше требуемого целого. Выведем на экран не только варианты решения с минимальной и максимальной дробной частью, но и те, у которых дробная часть меньше 0,0000001 или больше 0,9999999.</p><p>Вот как выглядит мой вариант программы на Delphi:</p><p>Даже такой простейший вариант программы выдаст нам много чего интересного. Итак, для начала посмотрим на варианты решения с минимальной дробной частью. Решения расположены в порядке уменьшения дробной части. В таблице выделена строка с решением Гомера Симпсона.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/table1.png" alt="" /></figure><p>Похоже, в этом случае Гомер Симпсон нашёл самый подходящий ответ для четырёхзначных чисел.</p><p>Теперь посмотрим на аналогичную таблицу, содержащую варианты решения с максимальной дробной частью. Решения расположены в порядке возрастания дробной части.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/table2.png" alt="" /></figure><p>Здесь решение Гомера Симпсона только на втором месте. Похоже, Дэвид Коэн в своей программе не дошёл до степени 20. Это уже интересный результат.</p><p>Если в нашей программе увеличить максимальную степень до 30, то лучший результат в первой таблице останется неизменным, а во второй таблице появится новый максимум: 672724 + 698424 = 708424. Остаток — 0,999999982255980857. А вот увеличение максимальной степени до 50 этот результат уже не поменяет.</p><p>Для трёхзначных чисел и степеней от 3 до 20 лучшие решения будут такими:</p><figure><img src="https://media.tproger.ru/uploads/2020/12/table3.png" alt="" /></figure><p>Только вот на калькуляторе они уже выглядят не так феерично: отображается дробная часть. Так что выбор четырёхзначных чисел был вполне оправдан.</p><p>В итоге нам удалось не только повторить решение Гомера Симпсона, но и найти несколько других подходящих вариантов. И один вариант оказался даже лучше, чем у Гомера!</p><p>Предлагаю вам попробовать написать более универсальную программу, которая бы выполняла поиск оптимального решения в произвольном диапазоне чисел и степеней. При этом она должна уметь самостоятельно отсеивать тривиальные решения. И, конечно, нужно не забыть про оптимизацию — не следует дважды вычислять решение для каждой пары чисел. Наверняка, у вас получится значительно лучше, чем у меня.</p>]]></content:encoded>
    </item>
    <item>
      <title>Время размять мозги: задачка о том, как разъехаться на перекрестке</title>
      <link>https://tproger.ru/problems/crossroads-puzzle</link>
      <comments>https://tproger.ru/problems/crossroads-puzzle?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/crossroads-puzzle</guid>
      <description><![CDATA[<p>Автомобили с автоматическим управлением стали основой головоломки, похожей на задания чемпионата Yandex Cup. Разбор с упором на применение алгоритмов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/crossroads-puzzle">Время размять мозги: задачка о том, как разъехаться на перекрестке</a>»</p>]]></description>
      <category><![CDATA[Олимпиадное программирование]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 05 Oct 2020 08:32:11 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если осенняя хандра застала вас еще в начале осени, то пришла пора немного взбодриться. Яндекс поделился любопытной задачей, которая не только поможет отвлечься от непогоды, но еще и проверит, насколько вы разбираетесь в мобильной разработке. Кстати, подобные задачи будут на чемпионате по программированию Yandex Cup в этом году.</p><h2>Задача</h2><p>Машины с автоматическим управлением — это круто. Так думаете не только вы, но и все сотрудники компании, в которую вам повезло устроиться. В этой компании как раз пишут софт для управления такими машинами. Для проверки и демонстрации последних достижений в офисе компании есть отдельная комната, моделирующая перекресток дорог шириной W метров и длиной H метров.</p><p>Каждая машина имеет ширину 1 и длину, не превышающую размеры перекрестка.</p><p>Одна из ситуаций, в которую частенько попадают как обычные водители, так и ИИ, банальна, но оттого не менее неприятна — пробка. Каждый водитель пытается выбраться из нее как можно быстрее, порой совершая маневры, ухудшающие ситуацию для всех окружающих. Но если бы все машины управлялись автоматикой, насколько быстрее разрешалась бы проблема? Именно на этот вопрос и должна ответить демонстрация, для которой вы должны написать код.</p><p>В начале демонстрации на перекрёсток будет помещено N машин. Для упрощения расчетов каждая машина ориентирована либо горизонтально, либо вертикально. Каждую секунду каждая из машин может переместиться на 1, если ей ничего не мешает. Пробка считается разрешенной, если на перекрестке не осталось ни одной машины. Реализуйте алгоритм, позволяющий сделать это за наименьшее количество времени.</p><ul><li>Ограничение по времени: 10 секунд.</li><li>Ограничение по памяти: 512Mb.</li><li>Ввод: стандартный ввод или input.txt.</li><li>Вывод: стандартный вывод или output.txt.</li></ul><h2>Формат ввода</h2><p>Первая строка содержит 2 числа — 0 &lt; W &lt; 13, 0 &lt; H &lt; 13. Гарантируется, что W * H ≤ 25. Вторая строка содержит число 0 ≤ N&lt; 13.<br />Следующие N строк содержат по 4 числа каждая — x1i, y1i, x2i, y2i, 0 &lt; x1, x2 ≤ W, 0 &lt; y1, y2 ≤ H — координаты левого верхнего и нижнего правого углов машины i. Гарантируется, что либо x1i = x2i, либо y1i = y2i.</p><h2>Формат вывода</h2><p>На первой строке выведите количество секунд, необходимых для очищения перекрёстка. В последующих строках выведите информацию о перемещениях машин посекундно. Каждая секунда описывается так:</p><ul><li>Количество машин, переместившихся в эту секунду.</li><li>Для каждой из двигавшихся машин — номер машины(нумерация с 1) и направление, в котором она перемещалась, ‘L’ влево, ‘R’ вправо, ‘U’ вверх и ‘D’ вниз.</li></ul><p>Обратите внимание — все движения в течение одной секунды происходят одновременно.</p><p>Задача соревновательная, и вам необязательно написать «правильное» решение, всегда находящее идеальную стратегию. Чем ближе ваш ответ к оптимальному, тем больше баллов вы получите.</p><p>Каждый тест оценивается в зависимости от размера входных данных.</p><p>За совершение невозможных движений (таких, в результате которых машины будут «наезжать» друг на друга) вы будете получать 0 баллов. Так же оценивается превышение лимита по памяти или времени исполнения и «падения» программы.</p><p>Любое корректное решение получает половину или более баллов теста. Чем ближе решение к оптимальному, тем больше будет начислено баллов.</p><p>Итоговой оценкой станет сумма баллов, полученных во всех тестах.</p>]]></content:encoded>
    </item>
    <item>
      <title>7 вопросов из ЕГЭ по информатике: сможете справиться с задачами для 11 класса?</title>
      <link>https://tproger.ru/quiz/computer-science-exam-test</link>
      <comments>https://tproger.ru/quiz/computer-science-exam-test?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/quiz/computer-science-exam-test</guid>
      <description><![CDATA[<p>Тест с интересными задачами из ЕГЭ по информатике предлагает опытным айтишникам проверить, насколько хорошо они помнят школьную программу.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/quiz/computer-science-exam-test">7 вопросов из ЕГЭ по информатике: сможете справиться с задачами для 11 класса?</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Викторины]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 26 Aug 2020 10:23:49 GMT</pubDate>
      <content:encoded><![CDATA[<p>Автор Павел Федоренко</p><p>Казалось бы, любой более-менее опытный айтишник с лёгкостью справится с задачами из школьной программы по информатике. Так ли это? Узнайте в тесте, в котором мы собрали пусть не самые сложные, но вполне интересные задачки из ЕГЭ.</p>]]></content:encoded>
    </item>
    <item>
      <title>13 математических задач: попробуйте решить их все</title>
      <link>https://tproger.ru/quiz/math-test</link>
      <comments>https://tproger.ru/quiz/math-test?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/quiz/math-test</guid>
      <description><![CDATA[<p>Математические задачи, с помощью которых можно проверить свои знания: проходного балла нет, потому что это не экзамен, а добровольная проверка.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/quiz/math-test">13 математических задач: попробуйте решить их все</a>»</p>]]></description>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Викторины]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 11 Jun 2020 13:39:52 GMT</pubDate>
      <content:encoded><![CDATA[<p>Здесь лежат математические задачи, которые вам по плечу. Ну наверное. Лучше проверить, чтоб наверняка. Проходной балл — нисколько: это ж не экзамен, да и мы не Марь Ванна.</p>]]></content:encoded>
    </item>
    <item>
      <title>Как убедиться, что вентилятор выключен, если в доме отключили электричество? Задачка на логику</title>
      <link>https://tproger.ru/problems/turning-off-ceiling-fan</link>
      <comments>https://tproger.ru/problems/turning-off-ceiling-fan?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Чуватова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/turning-off-ceiling-fan</guid>
      <description><![CDATA[<p>Свет в доме отключён, число режимов вентилятора неизвестно, но их не больше четырёх. Задача — гарантированно оставить его выключенным.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/turning-off-ceiling-fan">Как убедиться, что вентилятор выключен, если в доме отключили электричество? Задачка на логику</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 04 Feb 2020 15:45:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вы согласились проследить за квартирой друга пока он в отпуске. В одной из комнат вы нажали на выключатель потолочного вентилятора, но когда ничего не произошло, поняли, что в доме отключили электричество. К сожалению, вам уже нужно бежать и вы не сможете приехать сюда снова несколько дней.</p><p>Вы помните, что вентилятор был выключен до того, как вы нажали на кнопку, а также что каждое нажатие будет переключать режимы вентилятора: «выключен», «средний», «сильный» и т. д. Вы не знаете точное количество режимов, но уверены, что их не больше 4.</p><p>Что нужно сделать, чтобы наверняка выключить вентилятор, при том, что вы не можете его обесточить?</p>]]></content:encoded>
    </item>
    <item>
      <title>Сможете ли вы получить наследство, решив головоломку со шкафчиками?</title>
      <link>https://tproger.ru/problems/lockers-and-inheritance-riddle</link>
      <comments>https://tproger.ru/problems/lockers-and-inheritance-riddle?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Чуватова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/lockers-and-inheritance-riddle</guid>
      <description><![CDATA[<p>Чудаковатый дядюшка оставил загадку: 100 родственников решают её одновременно и делят деньги, а тот, кто справится раньше, забирает всё.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/lockers-and-inheritance-riddle">Сможете ли вы получить наследство, решив головоломку со шкафчиками?</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 03 Feb 2020 12:32:18 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ваш богатый чудаковатый дядюшка только что скончался. Вы и ещё 99 родственников были приглашены на чтение завещания. Дядюшка хотел оставить все деньги вам, но знал, что тогда ваши родственники будут докучать вам всю жизнь. Поэтому он решил поставить всё на то, что он обучил вас всему, что сам знал о головоломках.</p><p>Ваш дядюшка оставил в завещании записку:</p><p>«Я придумал головоломку. Если вы все ответите на неё одновременно, вы разделите деньги поровну. Но если кто-то решит задачу раньше и даст ответ без лишней беготни, он получит всё наследство целиком. Успехов.»</p><p>Юрист привёл вас и 99 ваших родственников в секретную комнату в поместье. Там стояли 100 шкафчиков, в каждом из которых была записка с одним-единственным словом. Юрист объяснил: каждому родственнику присвоен номер от 1 до 100. Первый откроет все дверцы шкафчиков. Второй закроет каждый второй шкафчик. Третий изменит состояние каждого третьего шкафчика — откроет дверцу, если она закрыта, и закроет, если открыта. Так будет продолжаться до тех пор, пока все 100 родственников не выполнят действие. Слова в шкафчиках, которые в итоге останутся открытыми, подскажут вам код от сейфа. Ещё до того, как первый родственник начал открывать шкафчики, вы вышли вперёд и сказали юристу, что знаете, какие шкафчики останутся открытыми. Как вы это поняли?</p>]]></content:encoded>
    </item>
    <item>
      <title>Помогите сплетникам как можно эффективнее распространить слухи</title>
      <link>https://tproger.ru/problems/rumors-spreading</link>
      <comments>https://tproger.ru/problems/rumors-spreading?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Чуватова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/rumors-spreading</guid>
      <description><![CDATA[<p>n сплетников обмениваются сообщениями, каждое уходит одному адресату. Минимум сообщений, чтобы все узнали все слухи, — 2n – 2, и вот почему.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/rumors-spreading">Помогите сплетникам как можно эффективнее распространить слухи</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 01 Feb 2020 07:09:38 GMT</pubDate>
      <content:encoded><![CDATA[<p>n сплетников знают слухи, каждый знает о чём-то своём. Они хотят поделиться друг с другом слухами через сообщения. Тот, кто отправляет сообщение, включает в него все слухи, которые слышал, но сообщение может иметь только одного адресата.</p><p>Какое минимальное количество сообщений им понадобится, чтобы каждый узнал все слухи?</p>]]></content:encoded>
    </item>
    <item>
      <title>Сможете получить MU из MI, используя 4 правила?</title>
      <link>https://tproger.ru/problems/converting-mi-to-mu</link>
      <comments>https://tproger.ru/problems/converting-mi-to-mu?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Чуватова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/converting-mi-to-mu</guid>
      <description><![CDATA[<p>Нужно получить строку MU из начальной строки MI по заданным правилам. Это невозможно, что объясняется количеством повторений буквы I.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/converting-mi-to-mu">Сможете получить MU из MI, используя 4 правила?</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 25 Jan 2020 09:56:40 GMT</pubDate>
      <content:encoded><![CDATA[<p>У вас есть строка MI. Выясните, можно ли получить из неё строку MU, используя только следующие правила:</p><ol><li>Если строка заканчивается на I, можно добавить в конец U. Пример: MI -&gt; MIU.</li><li>Можно удвоить часть строки после M, то есть изменить Mx на Mxx. Пример: MIU -&gt; MIUIU.</li><li>Можно заменить III на U. Пример: MUIIIU -&gt; MUUU.</li><li>Можно удалить UU. Пример: MUUU -&gt; MU.</li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Маленькая девочка считает до 1000 — на каком пальце она закончит?</title>
      <link>https://tproger.ru/problems/girl-counts-on-fingers</link>
      <comments>https://tproger.ru/problems/girl-counts-on-fingers?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Чуватова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/girl-counts-on-fingers</guid>
      <description><![CDATA[<p>Девочка считает от 1 до 1000 на пальцах левой руки туда и обратно. Полный цикл занимает восемь счётов, а ответ находится через остаток.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/girl-counts-on-fingers">Маленькая девочка считает до 1000 — на каком пальце она закончит?</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 10 Jan 2020 15:48:14 GMT</pubDate>
      <content:encoded><![CDATA[<p>Маленькая девочка считает от 1 до 1000 на пальцах левой руки следующим образом.</p><p>Она начинает с большого пальца — это 1. Указательный — 2. Средний — 3. Безымянный — 4. Мизинец — 5.</p><p>И продолжает в обратную сторону: безымянный — 6, средний — 7, указательный — 8, большой — 9. Потом указательный — 10 и так далее.</p><p>Если она продолжит считать таким образом, на каком пальце она закончит?</p>]]></content:encoded>
    </item>
    <item>
      <title>3 чемодана, 3 ключа, 3 попытки — сможете решить эту задачку?</title>
      <link>https://tproger.ru/problems/finding-the-right-key-in-3-attempts</link>
      <comments>https://tproger.ru/problems/finding-the-right-key-in-3-attempts?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Чуватова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/finding-the-right-key-in-3-attempts</guid>
      <description><![CDATA[<p>Логическая задачка на соответствия: у каждого из трёх чемоданов свой ключ. Хватит ли трёх попыток, чтобы подобрать ключ к каждому замку?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/finding-the-right-key-in-3-attempts">3 чемодана, 3 ключа, 3 попытки — сможете решить эту задачку?</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 07 Jan 2020 14:41:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>У вас есть три ключа от трёх чемоданов с разными замками. Каждый ключ подходит только к одному чемодану. Достаточно ли трёх попыток, чтобы подобрать ключи к каждому из них?</p>]]></content:encoded>
    </item>
    <item>
      <title>Разливаем ром в порту: логическая задачка на переливания</title>
      <link>https://tproger.ru/problems/rum-in-a-port</link>
      <comments>https://tproger.ru/problems/rum-in-a-port?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Чуватова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/rum-in-a-port</guid>
      <description><![CDATA[<p>Моряк просит налить четыре галлона рома в бочонок на пять галлонов, а мерить нечем, кроме кувшина на три галлона. Как это сделать точно?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/rum-in-a-port">Разливаем ром в порту: логическая задачка на переливания</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 01 Jan 2020 12:07:05 GMT</pubDate>
      <content:encoded><![CDATA[<p>В одном порту моряк пришёл в лавку с пустым бочонком на пять галлонов и попросил лавочника налить туда четыре галлона отборного ямайского рома. К несчастью, единственным сосудом для измерения был старый оловянный кувшин на три галлона. Как лавочник сумел точно отмерить четыре галлона с помощью этих двух ёмкостей?</p>]]></content:encoded>
    </item>
    <item>
      <title>Три хирурга, больной и две пары перчаток — сможете помочь никому не заразиться?</title>
      <link>https://tproger.ru/problems/three-surgeons-and-two-pairs-of-gloves</link>
      <comments>https://tproger.ru/problems/three-surgeons-and-two-pairs-of-gloves?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/three-surgeons-and-two-pairs-of-gloves</guid>
      <description><![CDATA[<p>Три больных разными болезнями хирурга должны по очереди оперировать заразного пациента. Как провести операции, чтобы никто не заразился?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/three-surgeons-and-two-pairs-of-gloves">Три хирурга, больной и две пары перчаток — сможете помочь никому не заразиться?</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 14 Dec 2019 09:55:49 GMT</pubDate>
      <content:encoded><![CDATA[<p>Трём хирургам необходимо друг за другом прооперировать в полевых условиях больного, страдающего заразным заболеванием. Сами хирурги тоже больны, причём разными болезнями. В распоряжении хирургов есть только две пары стерильных перчаток. Подскажите план операции, после которой ни хирурги, ни больной не заразятся друг от друга.</p><p>Помогать друг другу во время операций хирурги не должны. Оперировать одной рукой нельзя.</p>]]></content:encoded>
    </item>
    <item>
      <title>Семья на мосту — логическая задача про переправу</title>
      <link>https://tproger.ru/problems/family-on-a-bridge</link>
      <comments>https://tproger.ru/problems/family-on-a-bridge?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/family-on-a-bridge</guid>
      <description><![CDATA[<p>Папа, мама, сын и бабушка ночью должны перейти мост с одним фонариком, а мост выдерживает лишь двоих. Как им уложиться в 17 минут?</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/family-on-a-bridge">Семья на мосту — логическая задача про переправу</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 11 Dec 2019 15:16:05 GMT</pubDate>
      <content:encoded><![CDATA[<p>Папа, мама, сын и бабушка ночью подошли к мосту, способному выдержать только двух человек одновременно. По мосту можно двигаться только с фонариком. Известно, что на переправу тратят:</p><ul><li>папа — 1 минуту,</li><li>мама — 2 минуты,</li><li>сын — 5 минут,</li><li>бабушка — 10 минут.</li></ul><p>Фонарик у них один. Светить издали нельзя. Носить друг друга на руках тоже. Если по мосту идут двое, время перехода определяется более медлительным членом семьи.</p><p>Как семье переправиться за 17 минут?</p>]]></content:encoded>
    </item>
  </channel>
</rss>