<?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/problems</link>
    <atom:link href="https://tproger.ru/problems/feed" rel="self" type="application/rss+xml"/>
    <lastBuildDate>Sun, 27 Sep 2026 11:53:30 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>Задача от Tproger: на вероятность</title>
      <link>https://tproger.ru/problems/zadachka-ot-tproger--na-veroyatnost--iteraciya-2-</link>
      <comments>https://tproger.ru/problems/zadachka-ot-tproger--na-veroyatnost--iteraciya-2-?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Анна Ельцова]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/zadachka-ot-tproger--na-veroyatnost--iteraciya-2-</guid>
      <description><![CDATA[<p>Небольшое развлечение на вечер: вспомните школу и решите простенькую задачку на вероятность</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/zadachka-ot-tproger--na-veroyatnost--iteraciya-2-">Задача от Tproger: на вероятность</a>»</p>]]></description>
      <category><![CDATA[faq]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 20 Aug 2024 14:30:03 GMT</pubDate>
      <content:encoded><![CDATA[<p>Если вы думали, что математика, а уж тем более знание теории вероятности, вам больше никогда не пригодятся (дата сайентисты и другие причастные, про вас знаем), не тут-то было. Но мы уверены, что вы справитесь — задачка совсем не сложная.</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>Алгоритмическая задача про острова</title>
      <link>https://tproger.ru/problems/algoritmicheskaja-zadacha-pro-ostrova</link>
      <comments>https://tproger.ru/problems/algoritmicheskaja-zadacha-pro-ostrova?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марина Александровна]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/algoritmicheskaja-zadacha-pro-ostrova</guid>
      <description><![CDATA[<p>Решаем алгоритмическую задачу с собеседований про острова несколькими способами: реализация на языках Java и C#.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/algoritmicheskaja-zadacha-pro-ostrova">Алгоритмическая задача про острова</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Jul 2022 12:22:37 GMT</pubDate>
      <content:encoded><![CDATA[<p>Ранее мы разбирали алгоритмическую задачу про острова в <a href="https://tproger.ru/articles/zadachi-s-sobesedovanij-dlja-programmistov/">заданиях с собеседований для программистов</a>. К существующему решению мы получили замечание от нашего пользователя и решили разобраться в сложности алгоритма подробнее.</p><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><li><a href="https://tproger.ru/#part6">Решение от пользователя</a></li></ol><h2>Условие</h2><p>Для двумерного массива M x N, состоящего из единиц, которые обозначают сушу, и нулей, обозначающих воду, верните количество островов.</p><p>Остров окружён водой и образован соединением соседних земель по горизонтали и вертикали. Вы можете предположить, что все четыре края матрицы окружены водой.</p><p>Примечание Если островов нет, возвращаем 0. Помечаем острова через 1, а воду обозначаем как 0.</p><h2>Решение алгоритмической задачи про острова</h2><p>Поиск в глубину — классический подход в решении подобных задач. Его суть заключается в том, что мы проходим по карте и для каждой 1 запускаем поиск в глубину, чтобы осмотреться вправо, влево, вверх и вниз. При каждом запуске поиска в глубину для корневого узла будем увеличивать счётчик с количеством островов.</p><h3>Другими словами</h3><p>Для начала нам нужно найти в матрице хотя бы одну единицу: начинаем построчный обход с нулевого индекса [0,0]. Когда мы находим единицу, помечаем её, как просмотренную, и также просматриваем соседние клетки по направлениям вправо, вниз, влево, вверх.</p><p>Если предыдущая ячейка была сушей, а следующая оказалась водой, мы возвращаемся к суше и просматриваем ячейки по перечисленным направлением в том же порядке.</p><h2>Программный код</h2><p>Напишем код на Java, используя три метода. Включая main, у нас также будет метод обхода острова, чтобы понять, что находится вокруг (есть ли там ещё земля или только вода), а также метод подсчёта островов, в котором и будет запускаться метод обхода.</p><p>Никаких дополнительных инструментов для реализации не нужно. В main пишем статичное расположение островов, но при желании можно поиграться с рандомной подстановкой 0 и 1.</p><h2>Проверяем решение</h2><p>В случае с нашей картой и с учётом того, что по диагонали острова не соединяются, мы должны получить в результате три острова, что и видим на выходе программы:</p><figure><img src="https://media.tproger.ru/uploads/2022/07/Islands-task-Java.jpg" alt="" /></figure><p><a href="https://dotnetfiddle.net/RF0fZY">Здесь</a> вы можете запустить аналгичную программу на C#, а также изменить шаблон карты по своему усмотрению.</p><h2>Сложность алгоритма</h2><p>Сложность решения алгоритмической задачи про острова — O(m*n), где m — количество строк, а n — количество столбцов нашей матрицы.</p><h2>Решение от пользователя</h2><p>Есть вариант более быстрого решения, при котором программа не затормозит в случае большого массива данных:</p><figure><img src="https://media.tproger.ru/uploads/2022/07/Reshenie-algoritmicheskoj-zadachi-pro-ostrova-2.jpg" alt="" /></figure><p>А с каким решением согласны вы? Может, у вас есть своё? Предложите альтернативную реализацию в комментариях.</p>]]></content:encoded>
    </item>
    <item>
      <title>Придумываем дюжину новейших задач для собеседований в IT-компаниях</title>
      <link>https://tproger.ru/problems/pridumyvaem-djuzhinu-novejshih-zadach-dlja-sobesedovanij-v-it-kompanijah</link>
      <comments>https://tproger.ru/problems/pridumyvaem-djuzhinu-novejshih-zadach-dlja-sobesedovanij-v-it-kompanijah?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Александр Клименков]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/pridumyvaem-djuzhinu-novejshih-zadach-dlja-sobesedovanij-v-it-kompanijah</guid>
      <description><![CDATA[<p>Незнакомые логические и математические задачи помогают оценить сообразительность кандидата, знание логики и умение рассуждать.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/pridumyvaem-djuzhinu-novejshih-zadach-dlja-sobesedovanij-v-it-kompanijah">Придумываем дюжину новейших задач для собеседований в IT-компаниях</a>»</p>]]></description>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 01 Mar 2021 13:50:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Знаете, какой самый эффективный способ на время остановить работу целого отдела в IT-компании или научном коллективе? Подкинуть сотрудникам интересную, незнакомую математическую или логическую задачку. А какой самый простой и распространённый способ оценить кандидата на должность программиста или аналитика в ходе короткого собеседования? Предложить ему интересную, незнакомую математическую или логическую задачку. Самая популярная статья на сайте Tproger за всё время его существования — материал под названием «<a href="https://tproger.ru/articles/problems/">123 задачи с IT-собеседований с разбором решений</a>».</p><p>В сети, в книгах, в журналах мы все периодически встречаем задачи различного типа сложности. Задачи попроще — немного размять мозговые извилины или же посложнее — на многочасовое или даже многодневное обдумывание. Удовольствие от успешного решения какой-нибудь особенно непростой задачи, пожалуй, сравнимо с чувством, когда твоя сложная программа наконец заработала без ошибок и стала выдавать правильный результат. Подобные задачи — это своего рода тренажёр для мозга. Они позволяют отвлечься от трудовой рутины и поразмышлять над какой-нибудь нестандартной проблемой.</p><p>Работодатели давно взяли на заметку, что несложные логические или математические задачи — это хороший способ проверить сообразительность, знание законов логики и умение рассуждать. Именно поэтому такие задачи называют «типовыми» для собеседований.</p><p>В статье «<a href="https://tproger.ru/articles/16-tricky-interview-questions/">16 вопросов с собеседований, которые означают не то, что вы думаете</a>» Елена Лыбина, руководитель отдела найма и адаптации <a href="https://bercut.com/">Bercut</a>, рассказывает:</p><p>Прежде всего скажу, что мы ведём открытую коммуникацию с кандидатами. У нас нет цели создать стрессовую ситуацию, кого-то на чём-то «поймать» или что-то выведать. Мы изучаем опыт и мотивацию кандидата в процессе свободной доброжелательной беседы и ловушек никому не устраиваем. Но для некоторых позиций, особенно Junior, в Bercut важна способность мыслить нестандартно. Это сложно определить в ходе стандартного интервью. Поэтому мы используем логические задачки. Нам интересен ход размышлений кандидата, и мы просим озвучивать его процесс решения. Иногда ход решения важнее правильного результата. А иногда способность решить простую логическую задачу является для нас показателем того, что кандидат может собраться и в стрессовой ситуации выдать быстрый результат. Если такие качества обязательны для позиции, на которую мы ищем кандидата, то задачка становится вопросом с подвохом.</p><p>В ноябре 2019 года Bercut выступил партнером конференции SECR (Software Engineering Conference Russia), где специалисты Bercut <a href="https://www.facebook.com/CEE.SECR/posts/2561917010523450">предложили</a> посетителям выставки поучаствовать в квестах по решению задач. Хотя, с решением полного набора задач справилось всего несколько человек, сама викторина <a href="https://vk.com/bercut_team?w=wall-186803833_16">вызвала</a> большой интерес .</p><p>Также часто работодатели предлагают задачи на составление программ по заранее заданным условиям, но в этой статье мы их рассматривать не будем — здесь интересны лишь те, которые можно решить за непродолжительное время, не прибегая к программированию. Именно такие задачи лучше всего подходят для получасового собеседования, а задачи на составление программ идеальны для тестовых заданий.</p><p>В сети есть много сборников математических и логических задач. Проблема в том, что эти сборники читают не только работодатели, но и их потенциальные работники. Зачастую бывает так, что решение какой-нибудь интересной задачи уже известно многим. Так не годится, ведь нужно проверять не только способность хорошо запоминать прочитанное, но и умение решать новые, неизвестные кейсы. Да и вы, наверное, не захотите, чтобы вас снова спросили, как взвесить Боинг-747 или сколько будет 2 в степени 64. Правильные ответы на подобные популярные вопросы выучили наизусть даже офисные пальмы и фикусы в «переговорках», где проводятся собеседования. Нужно больше новых интересных задач.</p><p>О том, как составлять новые задачи, и написана эта статья. Давайте подойдём к этому вопросу творчески, но системно: попробуем придумать алгоритмы для создания новой задачи того или иного типа, а потом, воспользовавшись этими алгоритмами, составим абсолютно новые, ещё никому не известные задачи. Для каждого типа задач я буду приводить примеры уже известных — из журнала «Наука в фокусе», из книги Якова Перельмана «Занимательные задачи и опыты» и из других источников. Вообще, книги по математике и научно-популярные журналы (например, многие могут вспомнить журнал «Квант» для школьников, интересующихся математикой) — это неиссякаемые источники интересных задач.</p><p>Я опишу алгоритм сочинения новых задач для каждого типа и приведу примеры тех, которые составил, пользуясь этим алгоритмом. Думаю, задачи, приведённые в этой статье, покажутся вам не сложными. Главное — это понять принцип и разложить процесс на составляющие. А дальше — уже дело техники.</p><h2>1. Задачи с конечным множеством чисел</h2><p>Первый тип задач, о котором я хочу рассказать, про числа в реальном мире. Нас окружает множество устройств, предметов и объектов, на которых нарисованы или отображаются цифры. Это и часы, и календари, и номера машин. Обычно значение чисел или количество цифр в таких объектах конечно. Почему бы не сделать это предметом размышлений? Вот пример двух таких задач.</p><h3>Задача о неточных часах</h3><p>В доме трое часов. 1 января все они показывали верное время. Но верно идут только первые часы. Вторые отстают на 1 минуту в сутки. Третьи спешат на 1 минуту в сутки. Если часы будут продолжать так идти, через какое время все вместе будут снова показывать верное время?</p><h3>Задача о годе рождения профессора</h3><p>Профессор Кумле в 1971 году сообщил своим студентам: «Мне было n лет в n² году». В каком году родился профессор?</p><p>Алгоритм составления задач с конечным множеством чисел:</p><ol><li>Берём любое распространённое устройство или объект, на котором отображаются или написаны цифры.</li><li>Выбираем характерное, однозначно определяемое число из множества допустимых чисел, отображаемых на этом устройстве или объекте. Например, максимальное или минимальное возможное число. Также можно описать какую-то характерную комбинацию цифр.</li><li>Просим назвать устройство, рассчитать количество комбинаций или определить какой-то вариант числа, обладающих характерными особенностями.</li></ol><p>Давайте попробуем придумать такие задачи. Для начала возьмём какой-нибудь объект, опишем характерную особенность его чисел и попросим угадать, что это за объект.</p><h3>Новая задача 1</h3><p>В нём бывает разное количество чисел. Разница между минимальной и максимальной суммой чисел в нём равна 90. Его традиционно делят на части, в первой из которых бывает до четырёх простых чисел. Что это такое?</p><p>Теперь давайте попробуем придумать новую задачу про цифровые часы.</p><h3>Новая задача 2</h3><p>Винни-Пух посмотрел на свои цифровые часы: было 12:45. «Все цифры разные, самое время перекусить», — подумал он. Сколько раз за сутки Винни-Пуху можно перекусить? На цифровых часах Винни-Пуха отображаются четыре цифры — только часы и минуты.</p><p>Ещё один неиссякаемый источник задач — это телефонные номера. Для нас в Bercut это вообще «родная» тема, ведь большинство продуктов Bercut предназначены для автоматизации и решения различных бизнес-задач операторов мобильной связи.</p><h3>Новая задача 3</h3><p>У оператора сотовой связи есть новый пул семизначных телефонных номеров. Пока ещё все номера этого пула доступны. В офис оператора пришёл клиент с необычной просьбой: подобрать ему телефонный номер, в котором сумма всех семи цифр равна его счастливому числу 62. Сотрудник оператора предложил клиенту распечатать все такие номера на выбор. Сколько номеров будет в распечатке?</p><h2>2. Задачи с поиском закономерностей в последовательностях</h2><p>Следующий тип задач — на поиск закономерностей. Их великое множество и сочинить новый вариант совсем не сложно. Последовательность можно придумать самостоятельно или взять из реального мира. Приведу пару примеров ранее опубликованных задач этого типа.</p><h3>Задача о первой загадочной последовательности</h3><p>Каким будет сотый член в последовательности, которая начинается числами: 81, 73, 52, 42, 34, 22, 18, …?</p><h3>Задача о второй загадочной последовательности</h3><p>Дана последовательность чисел: 11, 7, 5, 7, 7, 7. Продолжите последовательность ещё одним числом.</p><p>Алгоритм составления задач с поиском закономерностей в последовательностях:</p><ol><li>Берём любую последовательность с чётко заданными правилами изменения элементов. Правила не обязательно должны быть связаны с математикой.</li><li>Вносим в эту последовательность одно, и только одно, изменение. Этот шаг можно пропустить.</li><li>Просим восстановить или продолжить последовательность.</li></ol><p>Попробуем воспользоваться этим алгоритмом и сочинить новые задачи.</p><h3>Новая задача 4</h3><p>Математик Матвей, работая над диссертацией, задумчиво глядел в окно и считал ворон на крышах соседних домов. На первой крыше сидело 11 ворон, на второй — 16, на третьей — 7, на четвёртой — 21, на пятой вообще не было ворон, а на шестой сидело 34 вороны. «Глупые птицы», — подумал Матвей. За что Матвей критиковал ворон?</p><p>В следующей задаче придумаем более сложную последовательность. Пусть это будут связанные пары чисел. На этот раз сама последовательность достаточно сложна, чтобы ещё и угадывать место, в которое нужно вставить недостающий член. Поэтому попросим просто её продолжить.</p><h3>Новая задача 5</h3><p>Финский программист Юкка, стоя в пробке, от нечего делать разглядывал номера встречных машин. Сначала проехала машина с номером 22-34, потом с номером 42-28, дальше были машины с номерами 34-50, 58-40 и 46-66. «Однако, тенденция», — подумал Юкка. Какой номер будет у следующей машины?</p><h2>3. Задачи на элементарную логику</h2><p>Логика — это важнейший инструмент любого человека интеллектуальной профессии. Самый простой способ проверить знание логики — это задачи с оценкой истинности утверждений. Вот пример одной такой задачи из теста на логическое мышление. Я немного перефразировал её условие.</p><h3>Задача про пингвинов</h3><p>Некоторые пингвины — птицы. Каждая птица имеет три крыла. Какое из следующих утверждений является истинным:</p><ol><li>Пингвины с двумя крыльями не являются птицами.</li><li>Птицы, которые являются пингвинами, иногда имеют три крыла.</li><li>Птицы с двумя крыльями иногда являются пингвинами.</li><li>Пингвинов не птиц, с тремя крыльями не бывает.</li><li>Пингвины имеют три крыла, потому что они птицы.</li><li>Ни одно из вышеперечисленного.</li></ol><p>Алгоритм составления задач на элементарную логику</p><ol><li>Придумываем набор любых не очень сложных логических утверждений, задающих условия пересечения нескольких множеств.</li><li>Заменяем объекты множеств другими объектами, делающими заданные утверждение абсурдным на уровне житейской логики.</li><li>Придумываем ряд утверждений, которые с учётом заданных условий являются ложными. И одно или несколько утверждений, которые являются истинными.</li><li>Просим указать истинные утверждения.</li></ol><p>По такому алгоритму можно придумать огромное количество весёлых оригинальных задачек.</p><h3>Новая задача 6</h3><p>Коты знают информатику. Все коты любят музыку. Какое из следующих утверждений является истинным:</p><ol><li>Все, кто знают информатику, любят музыку.</li><li>Информатику знают только коты.</li><li>Коты, которые знают информатику, не любят музыку.</li><li>Некоторые знатоки информатики любят музыку.</li><li>Все знатоки информатики не любят музыку.</li><li>Коты, которые любят музыку, не знают информатику.</li></ol><h2>Новая задача 7</h2><p>Некоторые астрофизики любят апельсины. Все любители апельсинов живут на Кипре. Какие из следующих утверждений являются истинными:</p><ol><li>Все астрофизики живут на Кипре.</li><li>Некоторые жители Кипра — астрофизики.</li><li>Все жители Кипра любят апельсины.</li><li>Все любители апельсинов — астрофизики.</li><li>Некоторые астрофизики, которые не любят апельсины, могут жить на Кипре.</li><li>Некоторые любители апельсинов могут жить не на Кипре.</li></ol><h2>4. Задачи на выполнение расчётов и решение уравнений</h2><p>Этот тип задач, пожалуй, самый распространённый. Ещё с глубокой древности подобные задачи были включены в книги и учебники по арифметике. Многим они покажутся довольно простыми, на уровне школьной программы. Но не забывайте, что наша цель — проверить умение рассуждать и оперировать некоторым количеством цифр, а не открыть в соискателе гениального математика.</p><p>Вот пример такой задачи.</p><h3>Задача про кенгуру</h3><p>В австралийском зоопарке 35% всех кенгуру серые. 13% всех животных зоопарка — кенгуру, но не серые. Сколько процентов от всех животных в зоопарке составляют кенгуру?</p><p>Вот ещё одна весьма любопытная задача.</p><h3>Задача об основном вопросе Вселенной</h3><p>Из книги «Автостопом по Галактике» мы знаем формулировку основного вопроса жизни, Вселенной и всего остального: «Что получится, если умножить шесть на девять?» Известен также и знаменитый ответ на этот вопрос — 42. В какой системе счисления этот ответ будет верным?</p><p>Алгоритм составления задач на выполнение расчётов и решение уравнений</p><ol><li>Придумываем один или несколько ответов — целые числа.</li><li>Составляем систему из одного или нескольких уравнений, решением которых будут числа, полученные на шаге 1, или выполняем ряд несложных математических или иных преобразований с этими числами. В итоге получаем коэффициенты уравнений или результаты математических преобразований.</li><li>Придумываем историю, описывающую коэффициенты или результаты преобразований.</li><li>Просим решить задачу, не упоминая при этом, что она связана с уравнением или преобразованиями.</li></ol><h3>Новая задача 8</h3><p>Перед выпуском нового релиза системы два тестировщика — Фаддей и Фиона — проверили 100 тестов. Тестировщик Фаддей работал на 5 часов дольше Фионы и проверил на 10 тестов больше. Но Фиона работает быстрее Фаддея на 50%. Сколько времени работал каждый тестировщик?</p><h3>Новая задача 9</h3><p>В магазине электроники новая модель телефона сначала подорожала на 10%, а потом подешевела на 10%. После этого телефон стал стоить 93555 рублей. Сколько телефон стоил до подорожания?</p><h2>5. Задачи на поиск оптимального алгоритма действий</h2><p>Этот тип, пожалуй, наиболее интересный. Это именно те задачи, которые гуляют по сети и знакомы почти всем: задача про три лампочки и три выключателя, задача про маляров и перчатки, задача про мост и фонарик. Приведу два давно известных примера.</p><h3>Задача о варке яиц</h3><p>Как проще всего отмерить 15 минут, необходимые для варки яиц, имея под рукой семи- и одиннадцатиминутные песочные часы?</p><h3>Задача об автоматах с мороженым</h3><p>Перед вами три автомата с мороженым. Первый выдаёт ванильное мороженое, второй — шоколадное. Третий автомат действует случайно — выдаёт ванильное или шоколадное мороженое. Мороженое стоит одну монету. На всех трёх автоматах есть надписи: «Ванильное», «Шоколадное», «Случайное». Но надписи перепутаны — все три надписи неправильные. Сколько нужно потратить монет, чтобы выяснить, где какой автомат?</p><p>Алгоритм составления задач на поиск оптимального алгоритма действий:</p><ol><li>Придумываем систему, в которой есть несколько элементов с разными значениями одного и того же параметра. Например, время, вес или объём.</li><li>Придумываем искусственные ограничения, накладываемые на систему.</li><li>Придумываем показатель, который нужно минимизировать.</li><li>Просим найти оптимальный алгоритм решения задачи.</li></ol><p>Кстати, когда вы сочините задачу на поиск оптимального алгоритма действий, может так случиться, что вы и сами не будете знать лучший ответ на свою же задачу. Сами сочиняете, сами решаете — замечательное развлечение для субботнего вечера! При этом нет никакой гарантии, что вы найдёте самое оптимальное решение. Бывают такие задачи, над которыми можно размышлять неделями.</p><p>Следующие две задачи могут показаться вам достаточно простыми. Однако я столкнулся с некоторыми трудностями в процессе придумывания этих «творческих» задачек. С уточнением условий новой задачи под номером 10 мне помог один мой коллега — мудрый и рассудительный человек, тоже любящий разные логические задачи.</p><h3>Новая задача 10</h3><p>У бассейна в зоопарке отдыхают пять бегемотов. Бассейн полон воды и достаточно большой, чтобы в нём поместились все бегемоты разом. У вас нет никаких измерительных инструментов. Вы — главный начальник бегемотов и можете решать, кому из них что нужно сделать. Как найти самого толстого бегемота?</p><h3>Новая задача 11</h3><p>Жители одного тропического острова в Тихом океане приплыли к жителям другого острова на лодках. Гости привезли груз манго и хотят обменять его на такой же по объёму груз авокадо. Как им это сделать, если у островитян под рукой нет ни весов, ни линеек, ни других средств точного измерения? И ещё одно важное условие: верования туземцев не позволяют им рыть ямы.</p><p>Следующая задача уже посложнее.</p><h3>Новая задача 12</h3><p>На далёкую планету роботов «Железяка» прилетел грузовой транспорт с 230 литрами машинного масла на борту. На данный момент на планете проживает 5 роботов. Как за минимальное количество шагов поделить машинное масло поровну между роботами, если у них на планете остались только две канистры ёмкостью 17 и 21 литр?</p><p>В этой статье описаны только пять типов задач. Безусловно, их гораздо больше. Да и алгоритмы составления можно придумать гораздо более сложные и разветвлённые. Важен сам принцип сочинения: в обратном направлении — от готового решения к интересному и загадочному условию. Кстати, должен вам признаться, что автор этой статьи непосредственно в режиме собеседования может и не решил бы некоторые из приведённых здесь задач — как известных, так и новых. Но я уверен, что читатели умеют легко решать подобные задачки, как на собеседованиях, так и для развлечения!</p><p>Составление новых задач лично для меня оказалось даже интереснее их решения. Для новой задачи нужно не только придумать её математическую или логическую основу, но и изобрести вокруг неё свою историю и персонажей, чтобы её захотелось тут же решить. Вполне возможно, что при составлении новых задач вы почувствуете себя автором детективного жанра, который заранее знает ответ на загадку, но должен искусно скрыть этот ответ от читателя, выстраивая ловушки и ложные тупиковые линии. Если всё это сделать как следует, то получится по-настоящему интересная задача. Предлагаю вам заняться составлением и публикацией собственных задач — это не только полезное, но и очень захватывающее занятие. Пусть у нас будет больше новых интересных задач!</p><p>Тем, кто дочитал статью до конца — небольшой бонус: три задачки с реальных собеседований в Bercut.</p><h3>Бонусная задача 1</h3><p>Рядом с офисом Bercut стоят два дома. Высота каждого — 10 метров. Между ними с крыши на крышу перекинут телекоммуникационный кабель длиной 12 метров. Кабель прогибается под своей тяжестью и в месте максимального прогиба расстояние от кабеля до земли составляет 4 метра. Найдите расстояние между домами.</p><h3>Бонусная задача 2</h3><p>На одном этаже офиса Bercut есть сотрудники без мониторов, с одним монитором и с двумя мониторами. У всех вместе 100 мониторов. Сотрудников без монитора столько же, сколько сотрудников с двумя мониторами. Сколько всего сотрудников работает на этом этаже?</p><h3>Бонусная задача 3</h3><p>1,5 разработчика за 1,5 минуты пишут 1,5 строки кода. Сколько строк напишут 2 разработчика за 2 минуты?</p>]]></content:encoded>
    </item>
    <item>
      <title>Одна задача и 10 минут, чтобы нанять iOS-разработчика</title>
      <link>https://tproger.ru/problems/odna-zadacha-i-10-minut-chtoby-nanjat-ios-razrabotchika</link>
      <comments>https://tproger.ru/problems/odna-zadacha-i-10-minut-chtoby-nanjat-ios-razrabotchika?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/odna-zadacha-i-10-minut-chtoby-nanjat-ios-razrabotchika</guid>
      <description><![CDATA[<p>Разбор задачи про тормозящую ленту в приложении соцсети на UITableView, которая помогает проверить кандидата в iOS-разработчики.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/odna-zadacha-i-10-minut-chtoby-nanjat-ios-razrabotchika">Одна задача и 10 минут, чтобы нанять iOS-разработчика</a>»</p>]]></description>
      <category><![CDATA[Мобильная разработка]]></category>
      <category><![CDATA[iOS]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Гостевая публикация]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 05 Feb 2021 15:39:06 GMT</pubDate>
      <content:encoded><![CDATA[<p>Рассказывает руководитель iOS-разработки RentaTeam Андрей Урядов</p><p>Представьте, что вы приходите в компанию на работу и попадаете в команду разработки приложения Facebook. Первая ваша задача касается ленты. Лента — это бесконечный список материалов: пользователь листает ее, доходит до конца, здесь подгружаются новые материалы — и так до бесконечности. Технически лента представляет собой UITableView. И задача в том, что лента тормозит. Нужно ускорить ее.</p><p>Что вы будете делать как разработчик: в первую очередь, во вторую, в третью, чтобы эту задачу решить?</p><h2>Решение</h2><p>Для начала проверяем, понял ли разработчик саму задачу. Слово «тормозит» может значить очень многое. Для пользователя и разработчика оно может иметь разный смысл. Если разработчик не проверит правильное понимание, он может решать совсем другую задачу. Итак, первый вопрос, который я ожидаю от разработчика: «А что значит тормозит?». «Тормозит» может обозначать как то, что пользователь ожидает от приложения, что оно будет какую-то операцию делать быстрее, так и то, что интерфейс «лагает», то есть реагирует на пользовательские действия через раз. Технически это совершенно разные вещи, и решать их надо по-разному.</p><p>Далее. Рассмотрим торможение.</p><p>Торможение может происходить, если:</p><ul><li>что-то медленно работает в приложении;</li><li>что-то медленно работает вне приложения, но приложение ждет результата;</li><li>есть блокировки в процессе;</li><li>все вышеперечисленное.</li></ul><p>Если тормозит что-то в приложении, то как понять, что именно? Самое верное решение — использовать профайлер. И далее обсуждаем с кандидатом самые частые причины этого:</p><ul><li>неверный UITableViewCell reuse;</li><li>тяжелый конструктор или конфигуратор ячеек;</li><li>тяжелые вычисления логики в главном потоке;</li><li>конвертация картинок, парсинг JSON и прочие премудрости.</li></ul><p>Нередко кандидаты просто гадают и предлагают наобум дорогие решения с точки зрения реализации и поддержки. Например, большинство хочет выкинуть Autolayout и переписать самим на frame. А виной тому доклад от ВКонтакте, где они пиарили такое свое решение. И теперь многие считают его серебряной пулей, хотя есть очень много случаев, где оно не подойдет или не поможет.</p><p>Если тормозит вне приложения, то это может быть сеть. Тут уже надо смотреть запросы: количество, частота, размер ответа сервера, время отклика, наличие и размер кеша. Можно поиграться с шириной канала, версией HTTP и поисследовать в этом направлении.</p><p>Если рассмотреть блокировки, то, например, приложение может не кешировать данные, а каждый раз при заходе на начало ленты делать блокирующий запрос на сервер. Пользователь зашел на страницу и всегда видит, как крутится индикатор загрузки. Создается впечатление, что приложение тормозное, потому что всегда приходится ждать. Также тут может быть интересный вопрос, если приложение делает большую операцию, состоящую из множества асинхронных операций. И пользователь после каждого нажатия на любую кнопку получает ожидание с индикатором. Каждое из них может длиться секунду, но если после каждого чиха приложение на секунду зависает, через 6–7 таких операций создается плотное ощущение тормозов.</p><p>Рассмотрим лаги. Это более узкий случай, который лечится разгрузкой главного потока и выносом тяжелых вещей во второстепенные. Тут самое место обсудить средства синхронизации потоков, какой код куда выносить, а какой не надо и почему.</p><p>Ну и неплохо на каждом шаге работает обоснование способа и его стоимости. Кандидат должен «продать» его мне. Потому что я, как бережливый заказчик, не хочу делать дорогие вещи, которые, возможно, мне ничего не дадут. Поэтому часто задаю кандидатам вопрос: «А почему вы уверены, что это поможет? А сколько это стоит? А какой эффект это даст и достаточен ли этот эффект, чтобы оправдать стоимость?» Такие вопросы помогают оптимальнее подходить к затратам.</p>]]></content:encoded>
    </item>
    <item>
      <title>Примеры задач с собеседования на позицию Middle Ruby разработчика</title>
      <link>https://tproger.ru/problems/primery-zadach-s-sobesedovanija-na-poziciju-middle-ruby-razrabotchika</link>
      <comments>https://tproger.ru/problems/primery-zadach-s-sobesedovanija-na-poziciju-middle-ruby-razrabotchika?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/primery-zadach-s-sobesedovanija-na-poziciju-middle-ruby-razrabotchika</guid>
      <description><![CDATA[<p>Подборка задач по основам Ruby и часто используемым функциям языка, которые встречаются на интервью для позиции middle-разработчика.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/primery-zadach-s-sobesedovanija-na-poziciju-middle-ruby-razrabotchika">Примеры задач с собеседования на позицию Middle Ruby разработчика</a>»</p>]]></description>
      <category><![CDATA[Ruby]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 04 Feb 2021 10:19:42 GMT</pubDate>
      <content:encoded><![CDATA[<p>Позиции Junior, Middle и Senior в СНГ различаются не только от компаний к компаниям, но и в принципе отсутствуют в некоторых странах. Для проведения интервью у кого-то есть заранее подготовленный набор тестовых заданий, кто-то предпочитает беседу за жизнь вперемешку с конкретными техническими вопросами. Есть компании, которым важны преимущественно soft skills. И все-таки выявить подходящего кандидата — дорогостоящий процесс.</p><p>После прохождения интервью во множество компаний есть понимание, что кандидат должен знать и уметь применять основные принципы, на которых строятся современные приложения. И хотя в моей практике не было такого, чтобы интервью закончилось после первого неправильного ответа или вопроса, — есть основы, в которых надо разобраться заранее.</p><p>В этом материале создана подборка по основам Ruby, часто используемым функциям языка. И если Junior разработчик никак не привязан к языку программирования, а Senior может писать более сложный код, то если вы сможете решить эти задачи без подсказок — бо́льшая часть практической подготовки на позицию Middle пройдена и можно сфокусироваться на других темах при подготовке к собеседованию.</p><p>Реализуйте метод Array#map</p><p>Реализуйте метод attr_accessor</p><p>Перепишите код без использования if</p><p>Проверка использования:</p><p>Напишите код, чтобы строка (1..10).select(&amp;3) возвращала результат [3, 6, 9]</p><p>Добавьте функциональность объекта post, изменяющую значение любого параметра объекта на требуемое и логирующую это изменение</p><p>Класс Post:</p>]]></content:encoded>
    </item>
    <item>
      <title>Задача на собеседовании: провести прямую через набор точек</title>
      <link>https://tproger.ru/problems/zadacha-na-sobesedovanii-provesti-prjamuju-cherez-nabor-tochek</link>
      <comments>https://tproger.ru/problems/zadacha-na-sobesedovanii-provesti-prjamuju-cherez-nabor-tochek?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/zadacha-na-sobesedovanii-provesti-prjamuju-cherez-nabor-tochek</guid>
      <description><![CDATA[<p>Условие про автономный автомобиль, который едет прямо по дороге и отслеживается по GPS: нужно найти наиболее вероятные положения машины.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/zadacha-na-sobesedovanii-provesti-prjamuju-cherez-nabor-tochek">Задача на собеседовании: провести прямую через набор точек</a>»</p>]]></description>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Jan 2021 15:38:26 GMT</pubDate>
      <content:encoded><![CDATA[<p>Будучи энтузиастом в области беспилотных автомобилей, я проходил собеседования в ряд компаний на позицию разработчика программного обеспечения. Чаще всего компании, занимающиеся беспилотными автомобилями, разрабатывают машину, которая может проехать по местности и хорошо ориентируется в 3D окружении. Следовательно, фирмы беспокоятся о том, насколько хорош кандидат в вычислительной геометрии, и в частности, как легко и быстро он/она может закодить решение. Один из вопросов на собеседовании меня особенно заинтересовал. Задача формулируется следующим образом:</p><p>Представьте, что ваш автономный автомобиль едет по дороге прямо, и его 2D позиции определяются при помощи ГНСС (Глобальной Навигационной Спутниковой Системы, например GPS) не очень точно, а с определенной погрешностью. Требуется найти наиболее вероятные положения автомобиля такие, что они лежат на одной прямой.</p><figure><img src="https://media.tproger.ru/uploads/2021/01/image5-1.png" alt="" /></figure><p>Эту задачу, как и практически любую другую, можно решать несколькими способами. В этой статье мы рассмотрим 3 решения на языке Python и сравним их: посмотрим на достоинства и недостатки. С математической точки зрения задание формулируется как задача линейной регрессии: найти аппроксимацию набора точек при помощи прямой. С программисткой стороны нам понадобится подходящая библиотека по манипулированию векторами и матрицами. Мы будем использовать NumPy для этой цели.</p><h2>Подход 1: Метод наименьших квадратов</h2><p>На первый взгляд, нам подойдет стандартное решение линейной регрессии: <a href="https://ru.wikipedia.org/wiki/Метод_наименьших_квадратов">метод наименьших квадратов</a>.</p><p>Нам дан массив 2D координат, представляющих собой пары точек (x, y). Мы можем считать x за аргумент, а y — за значение функции. Тогда, проконсультировавшись с Википедией, мы можем рассчитать коэффициенты прямой при помощи следующей формулы.</p><figure><img src="https://media.tproger.ru/uploads/2021/01/image6-1.png" alt="" /></figure><p>Это хорошее решение в том плане, что оно прямолинейное (непреднамеренный каламбур), то есть нам нужно взять и рассчитать все по формуле и получить ответ. Недолго думая, закодим решение. Далее я предлагаю читателю следовать за комментариями в коде.</p><p>Посмотрим, что мы получили на выходе.</p><figure><img src="https://media.tproger.ru/uploads/2021/01/image2-2.png" alt="" /></figure><p>Выглядит в точности так, как мы и хотели, — линия прямая и максимально подогнана под набор точек. Однако у метода наименьших квадратов есть один существенный недостаток — он не работает в случае, если траектория вертикальная. В таком случае наклон прямой обращается в бесконечность, и программа или упадет, или выдаст NaN — «не число». Таким образом, данный подход не может претендовать на продуктовый уровень.</p><h2>Подход 2: RANSAC</h2><p><a href="https://ru.wikipedia.org/wiki/RANSAC">RANSAC</a> — метод достижения консенсуса на основе случайных выборок, предложенный в 1981 году.</p><p>В нашем двумерном случае мы будем случайно выбирать две точки (суппорт) из входного массива и проверять, насколько хорошо все входные точки вписывается в полосу ближайшей окрестности прямой, задаваемой суппортом. Конечно же не каждая попытка даст удачно угаданную прямую, поэтому алгоритм RANSAC — итерационный. Для RANSAC есть формула, позволяющая по ожидаемому проценту выбросов и желаемой вероятности успешного решения вычислить необходимое количество итераций алгоритма.</p><figure><img src="https://media.tproger.ru/uploads/2021/01/image3-1.png" alt="" /></figure><p>где p — вероятность успеха, ω — доля выбросов, n — размер суппорта. В нашем случае размер суппорта равен двум точкам для прямой в двумерном пространстве. Для прямой в трехмерном пространстве n было бы тоже равно двум, а для трехмерной плоскости в 3D — уже трем точкам. В примере кода количество итераций получилось 16, что является вполне небольшим значением. Я предлагаю читателю далее следовать за комментариями в коде.</p><p>Что мы получим, запустив код?</p><figure><img src="https://media.tproger.ru/uploads/2021/01/image7.png" alt="" /></figure><p>Полученная прямая хорошо аппроксимирует набор точек. Черными квадратами отмечены точки, которые были выбраны в качестве суппорта.</p><p>В чем недостатки метода RANSAC? В том, что он не гарантирует успешного результата. Вероятность того, что генератор случайных чисел будет выбирать исключительно выбросы или просто неудачные точки, например очень близкие друг к другу, достаточно мала. Тем не менее, в применениях, требующий высокой надежности, например, в беспилотных автомобилях, RANSAC может не подойти. Также RANSAC не подойдет там, где доступ к генератору случайных или псевдослучайных чисел затруднен. Помимо того у RANSAC есть много параметров, которые надо подбирать под задачу. В частности, max_distance довольно сложно оценить, не потратив длительное время на изучение интенсивности шума.</p><h2>Подход 3: PCA</h2><p><a href="https://ru.wikipedia.org/wiki/Метод_главных_компонент">Метод главных компонент</a> (Principal Component Analysis, PCA) часто используется для уменьшения размерности данных, когда нужно аффинно преобразовать облако точек таким образом, чтобы по большинству размерностей дисперсия была малой (или хотя бы меньшей, чем по важным размерностям). В таком случае можно отбросить эти размерности, как не несущие информации. Очень похоже на нашу ситуацию, когда нам нужно отбросить шум в направлении, перпендикулярном общему направлению разброса точек, и таким образом спроецировать точки на соответствующую прямую.</p><p>В результате вычисления собственных чисел и собственных векторов мы получим пары (собственное число, собственный вектор). Чем больше собственное число, тем выше разброс точек в направлении соответствующего собственного вектора. Применительно к нашему случаю нам как раз нужно найти собственный вектор с наибольшим собственным значением. Он и задаст прямую, на которую мы будем проецировать точки. Код с комментариями:</p><p>Запустив код, получаем следующий график.</p><figure><img src="https://media.tproger.ru/uploads/2021/01/image1.png" alt="" /></figure><p>PCA также справился с задачей! При этом этот метод лишен недостатка метода наименьших квадратов: PCA отлично аппроксимирует вертикальные линии. Также PCA всегда даст результат в отличие от вероятностного RANSAC. Однако, в отличие от RANSAC метод PCA чувствителен к сильным выбросам в локациях точек.</p><h2>Заключение</h2><p>Данная задача понравилась мне тем, что у нее есть несколько существенно разных решений со своими присущими достоинствами и недостатками. Также задача позволяет разобраться с матричными операциями в NumPy на простом примере. Посмотрим на все три решения на одном изображении.</p><figure><img src="https://media.tproger.ru/uploads/2021/01/image4-1.png" alt="" /></figure><p>Из трех решений мой личный фаворит — метод главных компонент PCA.</p><p>Дорогой читатель, надеюсь статья тебе понравилась и ты приобрел навыки превращения задач аналитической геометрии в код. Полный код доступен на <a href="https://github.com/Obs01ete/bestfit/tree/master/ru">GitHub</a>.</p><p>Спасибо за внимание и удачи на собеседованиях!</p>]]></content:encoded>
    </item>
    <item>
      <title>Собеседование на позицию Middle JavaScript разработчика: примеры задач и необходимые знания</title>
      <link>https://tproger.ru/problems/sobesedovanie-na-poziciju-middle-javascript-razrabotchika-primery-zadach-i-neobhodimye-znanija</link>
      <comments>https://tproger.ru/problems/sobesedovanie-na-poziciju-middle-javascript-razrabotchika-primery-zadach-i-neobhodimye-znanija?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/sobesedovanie-na-poziciju-middle-javascript-razrabotchika-primery-zadach-i-neobhodimye-znanija</guid>
      <description><![CDATA[<p>Разбор задач с интервью на позицию Middle JavaScript-разработчика и советы по подготовке: сам язык, структуры данных и подход к решению на собеседовании.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/sobesedovanie-na-poziciju-middle-javascript-razrabotchika-primery-zadach-i-neobhodimye-znanija">Собеседование на позицию Middle JavaScript разработчика: примеры задач и необходимые знания</a>»</p>]]></description>
      <category><![CDATA[JavaScript]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Для продолжающих]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 27 Jan 2021 13:06:13 GMT</pubDate>
      <content:encoded><![CDATA[<p>Многие разработчики не любят, когда на собеседовании их просят писать код, но иногда это неизбежно. В этом материале я разберу несколько задач, с которыми вы можете столкнуться при прохождении интервью на позицию Middle JavaScript разработчика.</p><p>Какие знания понадобятся:</p><ul><li>JavaScript;</li><li>базовые структуры данных;</li><li>большое O.</li></ul><p>Как подойти к решению задач:</p><ul><li>размышляйте вслух;</li><li>не торопитесь и не сдавайтесь;</li><li>работайте с энтузиазмом.</li></ul><h2>JavaScript</h2><p>Не могу не подчеркнуть, насколько важно в первую очередь хорошо изучить сам язык. Это поможет написать элегантное решение, не запутавшись в его тонкостях. Для этого вы должны не только знать все элементы и правила языка, но и иметь глубокое понимание их работы.</p><p>Ресурсы для изучения:</p><ul><li>«Современный учебник JavaScript» (перевод Ильи Кантора);</li><li>Eloquent JavaScript («Красноречивый JavaScript») (автор Marijn Haverbeke);</li><li>JavaScript Ninja (автор John Resig).</li></ul><h2>Структуры данных</h2><p>Если вы не знаете структуры данных, шансов прийти к оптимальному решению (и решению вообще) намного меньше. Поэтому нужно обязательно научиться работать со следующими вещами:</p><ul><li>массивами;</li><li>объектами/Хэш-мапами;</li><li>связанными списками;</li><li>стеками;</li><li>очередями;</li><li>деревьями;</li><li>графами.</li></ul><h2>Большое О</h2><p>О большое описывает эффективность выполнения кода — то есть то, насколько быстро выполняется алгоритм с учётом входных данных (time complexity).</p><p>После того, как вы напишете свое решение, важно назвать его сложность и время выполнения.</p><p>Большое О к задаче пишется комментарием над решением.</p><p>Пример:</p><p>// O(n) time | O(1) space</p><p>Определив эффективность своего кода, обсудите с собеседующим, что еще можно улучшить. По возможности предложите альтернативные способы решения задачи. Это покажет, что вы не просто выдаете заученные варианты, а действительно понимаете, как работает код.</p><h2>Размышляйте вслух</h2><p>Перед тем, как начать писать код, задачу нужно решить в уме, проговаривая весь мыслительный процесс. Так вы не запутаетесь, а собеседующий сможет оценить ваш ход мыслей.</p><h2>Не торопитесь и не сдавайтесь</h2><p>Одна из частых ошибок – отдавать готовое решение без перепроверки. Перед сдачей работы обязательно пройдитесь по своему коду ещё раз, анализируя его вслух.</p><p>Не поддавайтесь панике и не опускайте руки, если подойти к решению никак не получается. Это ещё не конец, и вы всё ещё можете успешно пройти интервью. Обдумайте проблему и попросите у собеседующего небольшую подсказку – это лучше, чем молча сидеть и надеяться, что вам помогут.</p><h2>Работайте с энтузиазмом</h2><p>Покажите неподдельную заинтересованность в решении задачи – это разрядит обстановку и облегчит процесс и для вас, и для собеседующего. Почувствуйте азарт, действуйте с пламенем в глазах и пылом в сердце – тогда и сконцентрироваться на задаче будет намного проще.</p><h2>Задачи уровня Middle</h2><h3>Сумма двух чисел</h3><p>Напишите функцию, которая принимает два аргумента: массив из уникальных целых чисел и сумму в виде целого числа. Если сумма двух любых чисел массива из аргумента равна числу, которое приходит вторым аргументом, функция должна вернуть новый массив из этих двух чисел в любом порядке. Если решения нет, вернуть пустой массив. Текущее число само с собой складывать нельзя.</p><p>Пример входных данных:</p><p>На выходе:</p><p>[-1, 11] или [11, -1], так как -1 + 11 = 10 = targetSum</p><h3>Преобразование массива в объект с группировкой и фильтрацией элементов</h3><p>Напишите функцию, которая на вход принимает массив из студентов, где студент — это объект с полями «имя», «возраст» и «номер группы» {name: string, age: number, groupId: number}, а на выходе возвращает объект, где ключ — это номер группы, а значение — массив из студентов старше 17 лет.</p><h3>Проверка строки на палиндром</h3><p>Напишите функцию, которая на вход принимает строку, состоящую из букв нижнего регистра, а на выход возвращает boolean, который отвечает, является ли данная строка палиндромом или нет.</p><p>Палиндром — слово или текст, одинаково читающееся в обоих направлениях.</p><h3>Найти ближайшее значение в бинарном дереве</h3><p>Напишите функцию, которая принимает два аргумента — бинарное дерево и значение в виде числа, а возвращает ближайшее значение, найденное в бинарном дереве.</p><p>Node = { value: number | null, left: Node | null, right: Node | null }</p><h2>Итог</h2><p>На собеседовании вы можете столкнуться с совершенно другими задачами. Пугаться их не стоит. Основная цель этих заданий в том, чтобы разработчик озвучил свой способ мышления. На ошибки и не до конца реализованную в коде задачу скорее всего закроют глаза. Интервьюеру важно увидеть, как вы рассуждаете, какие подходы используете в зависимости от ситуации, как быстро можете читать и понимать чужой код. Именно на основе этой информации он будет строить с вами дальнейший разговор и принимать решение о найме.</p><p>Поэтому дерзайте и удачи на собеседовании 🙂</p>]]></content:encoded>
    </item>
    <item>
      <title>Задачи с собеседований: обработка параллельного редактирования данных</title>
      <link>https://tproger.ru/problems/zadachi-s-sobesedovanij-obrabotka-parallelnogo-redaktirovanija-dannyh</link>
      <comments>https://tproger.ru/problems/zadachi-s-sobesedovanij-obrabotka-parallelnogo-redaktirovanija-dannyh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/zadachi-s-sobesedovanij-obrabotka-parallelnogo-redaktirovanija-dannyh</guid>
      <description><![CDATA[<p>Разбор практической задачи для джавистов: как обеспечить непротиворечивость данных, когда их одновременно правят несколько пользователей.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/zadachi-s-sobesedovanij-obrabotka-parallelnogo-redaktirovanija-dannyh">Задачи с собеседований: обработка параллельного редактирования данных</a>»</p>]]></description>
      <category><![CDATA[Базы данных]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 31 Dec 2020 12:39:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>К собеседованию мы подходим максимально прагматично, чтобы за час-полтора, которые отводятся на знакомство с кандидатом, успеть понять его уровень и оценить, подходит ли такой человек команде. Сам провожу c джавистами 3-5 технических интервью в неделю и не вижу большого смысла задавать стандартные вопросы и задачи из сборника. На многие из них кандидат уже натренировался отвечать за ту неделю, что ходит по собеседованиям и, как правило, сильно от подобных однотипных вопросов устал. Предпочитаю опираться на опыт и навыки, которые человек сможет применить в работе. Примером практической задачи может быть вопрос из реального кейса.</p><p>Например, в разрабатываемом приложении надо решить задачу обеспечения непротиворечивости данных при параллельном редактировании несколькими пользователями. Допустим, в системе с веб-интерфейсом ведутся данные сотрудников. Карточку сотрудника могут редактировать несколько пользователей с соответствующими полномочиями, а данные в виде JSON отправляются в бекэнд и сохраняются в базу данных. Большинство из нас подобный код реализовывали и не раз. Задача — сделать так, чтобы тот пользователь, который первым отправил изменение, в результате увидел измененные им данные. При этом тот, кто был вторым — получил возможность внести свои изменения с учётом изменений, внесённых первым пользователем. Задачу можно решать по-разному, и она хорошо работает — показывает уровень владения заявленными технологиями в зависимости от уровня кандидата.</p><p>Итак, решение. На самом высоком уровне мы понимаем, что надо использовать оптимистическую или пессимистическую блокировку. Какой вариант является подходящим, определяется условиями задачи, их стоит конечно уточнить. На таком уровне можно поговорить о том, как это будет работать на каждом слое приложения, как распределится ответственность между фронтом, беком и хранилищем, как будет обеспечиваться масштабируемость.</p><p>Если кандидат не готов проектировать подобное решение на собеседовании, то проверяю уровень другим способом. Почти наверняка он видел пример реализации подобного решения в одном из своих предыдущих проектов. И тут мы можем рассмотреть с ним механизмы, которые предоставляют используемые фреймворки и какова особенность реализации. Например, в ORM такие механизмы есть из коробки, и в Hibernate достаточно пометить одно поле класса сущности аннотацией @Version, чтобы реализовать механизм оптимистической блокировки. Каждый раз, когда запись будет сохранена, значение такого поля обновится, и если будет попытка сохранения записи, у которой значение этого поля не соответствует таковому в базе данных, возникнет исключение. Такое решение опишет разработчик достаточно опытный, чтобы разобраться, какой именно код был в проекте и почему, даже если он сам не писал этот код.</p><p>Для начинающего кандидата задача полезна тем, что он, скорее всего, вообще о подобном еще не задумывался.</p><p>Для него это вызов, который можно попробовать решить на уровне базовых знаний, если просто описать структуру данных в БД (их мы формулируем вместе) и в каком-то виде получить их с клиента. Здесь можно предложить вариант реализации на самом низком уровне. Это может быть SQL-запрос вида: update ... where id = &lt;Id&gt; and version = &lt;version&gt;, результатом которого будет количество измененных строк 0 или 1. И таким образом можно будет понять, принято изменение или значение version разошлось с тем, которое на текущий момент в БД.</p><p>Это лишь один из примеров наших задач. Он одинаково понятен всем кандидатам и при этом мало где в сборниках задач на собеседования разбирается таким образом, чтобы получить осознанный ответ и удовольствие для обеих сторон. Хороших вам технических интервью!</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>SQL задачка: напишите запрос для обработки больших данных</title>
      <link>https://tproger.ru/problems/sql-zadachka-napishite-zapros-dlja-obrabotki-bolshih-dannyh</link>
      <comments>https://tproger.ru/problems/sql-zadachka-napishite-zapros-dlja-obrabotki-bolshih-dannyh?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/sql-zadachka-napishite-zapros-dlja-obrabotki-bolshih-dannyh</guid>
      <description><![CDATA[<p>Простой расчёт средней зарплаты из таблицы persons работает на малых объёмах, но в распределённой системе с петабайтами данных начинает подводить.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/sql-zadachka-napishite-zapros-dlja-obrabotki-bolshih-dannyh">SQL задачка: напишите запрос для обработки больших данных</a>»</p>]]></description>
      <category><![CDATA[Big Data]]></category>
      <category><![CDATA[SQL]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 28 Dec 2020 14:53:16 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мы занимаемся обработкой больших данных — петабайтов информации, поэтому моя задачка тоже будет касаться больших данных.</p><p>Необходимо написать запрос, который считает среднюю зарплату по городам из таблицы persons (city string, salary int, person_id int).</p><p>В начале почти каждый напишет простой запрос:</p><figure><img src="https://media.tproger.ru/uploads/2020/12/122252_586f17a4_O722Ea3s_1608325064.png" alt="" /></figure><p>Такой запрос будет прекрасно работать при малых и средних объемах данных.</p><p>Если мы работаем с большими данными, следующим следует вопрос: что может пойти не так с этим запросом если мы обрабатываем терабайты информации в распределенной системе?</p><p>Хитрость здесь кроется в том, что при работе с big data применяются распределенные вычисления — для выполнения запроса используется одновременно много серверов. Каждый сервер обрабатывает только свою часть входных данных. Для решения задачи требуется знать, как входные данные распределяются по множеству серверов для параллельной обработки. Ответ следующий: каждый сервер содержит всю информацию по одному или более ключей. Это значит, что все записи с одним и тем же ключом должны попасть на один сервер во время вычисления.</p><p>В нашем запросе ключом является поле city. Это может натолкнуть нас на мысль, что все входные данные для вычислений распределятся в зависимости от городов. Здесь нужно вспомнить, что одни города намного больше других. В этом запросе все записи по городу Москва, например, будут обрабатываться только на одном сервере и никогда не распараллелятся.</p><p>Чтобы это исправить нужно добавить синтетический ключ в группировку:</p><figure><img src="https://media.tproger.ru/uploads/2020/12/122252_ac456167_paBbEg19_1608325064.png" alt="" /></figure><p>Теперь запрос распределится по серверам не только по ключу city, но и по значению mod(person_id, 10). Получается, что каждый город теперь распределится на 10 серверов в зависимости от person_id.</p><p>В результате этого запроса мы увидим не одну среднюю зарплату на каждый город, а 10 бессмысленных строчек. Чтобы снова вернуться к средней зарплате, нужно соединить все строчки вместе еще раз:</p><p>Однако средняя от средних не даст нам настоящую среднюю. Нужно изменить формулу:</p><figure><img src="https://media.tproger.ru/uploads/2020/12/122252_b8e050d4_xbdQXlGD_1608325064.png" alt="" /></figure><p>Теперь мы получили более сложный запрос, который высчитывает среднюю, но сделали это так, что наш запрос отлично параллелится в распределенных вычислениях.</p>]]></content:encoded>
    </item>
    <item>
      <title>Японская головоломка KenKen: разбор задачи и алгоритм автоматической генерации таблиц</title>
      <link>https://tproger.ru/problems/japonskaja-golovolomka-kenken-razbor-zadachi-i-algoritm-avtomaticheskoj-generacii-tablic</link>
      <comments>https://tproger.ru/problems/japonskaja-golovolomka-kenken-razbor-zadachi-i-algoritm-avtomaticheskoj-generacii-tablic?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/japonskaja-golovolomka-kenken-razbor-zadachi-i-algoritm-avtomaticheskoj-generacii-tablic</guid>
      <description><![CDATA[<p>Правила японской головоломки KenKen, подход к её решению и программная реализация автоматической генерации игровых таблиц без подглядывания в готовое.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/japonskaja-golovolomka-kenken-razbor-zadachi-i-algoritm-avtomaticheskoj-generacii-tablic">Японская головоломка KenKen: разбор задачи и алгоритм автоматической генерации таблиц</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Python]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 28 Dec 2020 06:39:12 GMT</pubDate>
      <content:encoded><![CDATA[<p>Мои критерии интересной задачи:</p><ul><li>Она, попав в голову, осталась там надолго, даже получив своё решение.</li><li>К ней интересно мысленно возвращаться в минуты скуки или творческого настроения.</li><li>Целью задачи не должен быть лишь правильный ответ (поэтому школьные, олимпиадные или задачки с собеседований лично для меня редко становятся любимыми). Мне нравится когда задача — некий процесс творения.</li><li>Задача должна быть как-то связана с реальностью. Или с тем, чем я мог бы заниматься в реальности, пусть даже играя. Я бы вряд ли крутил в голове задачу из разряда «У Пети есть неубывающий массив натуральных чисел, а вы ему завидуете и с помощью XOR-пушки хотите его разрушить…».</li><li>У неё не должен быть слишком высокий порог входа, чтобы она помещалась в оперативку в голове и не переполняла стек.</li></ul><p>При этом очень важно не гуглить решение, чтобы не спугнуть интерес. Именно в придумывании разнообразных вариантов решения и состоит всё удовольствие, пусть даже я изобретаю велосипед.</p><p>Такие задачи часто нас окружают, важно их заметить, что можно сравнить с тем, как идеи должны находить изобретателя. Очередной случай произошёл спонтанно, когда я объяснял одному моему товарищу правила решения головоломки KenKen. Разобраться в них довольно непросто, сам я сделал это только с третьего раза, когда мне объясняли правила мои дети.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/Ris.-1.png" alt="" /><figcaption>Пример японской головоломки KenKen. Источник: Wikipedia.</figcaption></figure><p>KenKen — это  таблица с одинаковым числом клеток в рядах и колонках, которую нужно заполнить цифрами, используя только цифры от единицы до N, где N — количество ячеек в одном из рядов таблицы. При этом нужно, чтобы, во-первых, ни в одной отдельно взятой строке и ни в одном отдельно взятом столбце числа не повторялись. Во-вторых, в обведённых жирными линиями группах ячеек результат математической операции, произведённой над всеми ячейками группы, должен совпадать с требуемым результатом.</p><p>Требуемый результат записывается как условие в левом верхнем углу одной из ячеек мелким шрифтом в виде числа, а операция — в виде знака математической операции.</p><p>Так, если, например, жирным обведены две ячейки вместе, а в уголке написано «‎6x»‎, это значит, что мы должны получить результат равный шести путем умножения ячеек друг на друга. Варианты заполнения ячеек будут такие: 3 и 2 или 6 и 1. Но если мы еще раньше пришли к выводу, что в одной ячейке должно стоять 6, то во второй ячейке остаётся поставить только 1.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/Ris.-2.png" alt="" /></figure><p>Поначалу товарищ никак не мог ухватить суть правил, тогда я сказал: «Чтобы понять, как они устроены, давай составим собственный KenKen, как если бы его решать потом не нам, а кому-то другому. Следи за руками».</p><p>Дальше расчертил квадрат на клетки, расставил числа так, чтобы сохранялась уникальность в рядах и колонках.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/Ris.-3-autoconverted.jpeg" alt="" /></figure><p>Потом случайным образом обвёл некоторые ячейки, группируя их по две-три, обвёл жирной линией. Получился квадрат, сложенный из эдаких кривых доминошек.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/Ris.-4-autoconverted.jpeg" alt="" /></figure><p>Потом в углу каждого такого домино поставил цифру, равную сумме цифр в ячейках в обведённой области. Для простоты объяснения я использовал только операцию сложения. Мы оба убедились, что полученный таким образом KenKen выполняет все правила решённого. Потом я стёр цифры в ячейках, чтобы тот кому достанется решать, не знал ответа заранее.</p><p>Как только я это объяснил другу, тут же и сам всё понял: это же алгоритм автоматической генерации KenKen! Я мог бы создать сайт, на котором любой желающий может решать бессчётное количество автоматически созданных KenKen. Вот она задачка!</p><p>Первое, что интересно в ней — сам алгоритм формирования головоломки, а не веб-программирование, как таковое. Второе — как программа в процессе заполнения ее пользователем будет определять, решён KenKen или нет? Третье — уже совершенно новая задача: может ли другая программа решить такой KenKen, сгенерированный другой программой?</p><p>Я знаю, что задача уже решена до меня, стоит только погуглить,  но я этого не делаю. В ней нет единственного правильного ответа: все варианты хороши, если они работают, и это мне нравится. Но если какой-то алгоритм будет генерировать более интересные головоломки KenKen, чем другой, то я выберу лучший.</p><p>Поэтому, решив её однажды, не спешу выбрасывать задачку из головы. Более того, я её запрограммировал, не смог удержаться. Это были две недели удовольствия по вечерам. У этой задачки нет заумных формул и она меня не подвешивает в «‎параличе разработчика»‎. Я знаю как использовать такой алгоритм на практике. И наконец, я знаю, кто и зачем может воспользоваться этим алгоритмом. Важно, что занимаясь этим, можно одновременно и отдыхать, и развлекаться, и развиваться</p><h2>Программирование</h2><p>Важно отметить — задача запрограммирована не на языке Perl. Это связано с тем, что, с точки зрения автора, подобный код удобнее писать на статически-типизированном языке, так что ни Perl, ни Python, ни другой динамический язык не будут удобными для этой задачи.</p><p>Также хотелось написать универсальную библиотеку, которую потом можно использовать и в консольных, и в десктопе, и в одностраничных веб-приложениях (даже для мобильных). В Dart это всё возможно, поэтому выбор был очевиден.</p><p>Программирование задачи можно найти <a href="https://bitbucket.org/closescreen/kenken/src/master/lib/src/kenken_base.dart">здесь</a>, а пример использования — в <a href="https://bitbucket.org/closescreen/kenken/src/master/example/kenken_example.dart">этом файле</a>.</p>]]></content:encoded>
    </item>
    <item>
      <title>Задачи с IT-собеседований: модуль для платформы интернет-магазинов</title>
      <link>https://tproger.ru/problems/zadachi-s-it-sobesedovanij-modul-dlja-platformy-internet-magazinov</link>
      <comments>https://tproger.ru/problems/zadachi-s-it-sobesedovanij-modul-dlja-platformy-internet-magazinov?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/zadachi-s-it-sobesedovanij-modul-dlja-platformy-internet-magazinov</guid>
      <description><![CDATA[<p>Компания Simtech Development проверяет, как быстро кандидат осваивает незнакомый фреймворк CS-Cart, и предлагает написать для платформы отдельный модуль.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/zadachi-s-it-sobesedovanij-modul-dlja-platformy-internet-magazinov">Задачи с IT-собеседований: модуль для платформы интернет-магазинов</a>»</p>]]></description>
      <category><![CDATA[Веб-разработка]]></category>
      <category><![CDATA[Собеседование]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 25 Dec 2020 16:10:40 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Небольшая предыстория</h2><p>Большая часть задач компании Simtech Development связаны с платформой для интернет-магазинов и маркетплейсов CS-Cart. Платформа известна в среде разработчиков, но количество соискателей, которые уже пробовали работать с платформой, не такое большое. Поэтому на собеседованиях, помимо всего прочего, мы проверяем кандидатов на то, как быстро они смогут погрузиться в незнакомый им фреймворк и решить задачу. Для этого мы используем два подхода:</p><ul><li>стандартный — выдаём тестовое задание для самостоятельного решения;</li><li>парное программирование — решение задачи во время собеседования.</li></ul><h3>Стандартный</h3><p>Этот подход используется не только как инструмент оценки знаний кандидата, а и как инструмент знакомства разработчика с платформой CS-Cart; чтобы дать кандидату понимание с чем нужно будет работать, возможность оценить свои силы и опыт перед принятием решения о трудоустройстве. Есть несколько вариантов, которые, прежде всего, делятся по направлениям (frontend/backend), а затем по предполагаемому уровню кандидата (junior/middle/senior). В каждом задании содержится несколько секций:</p><ul><li>описание;</li><li>подготовка;</li><li>непосредственно задача;</li><li>требования;</li><li>техническое задание;</li><li>усложнения.</li></ul><h3>Описание</h3><p>Рассказываем вводную информацию: для кого предназначается тестовое задание, сколько дней даётся на реализацию, куда присылать результат и прочие общие моменты.</p><h3>Подготовка</h3><p>Так как платформа CS-Cart довольно сложная, особенно в плане бизнес-функциональности, мы обязательно предоставляем кандидатам всю необходимую документацию. В некоторых случаях даём несколько дней на ознакомление и только потом высылаем само задание (это позволяет более точно замерить время, которое кандидат потратил непосредственно на выполнение задания). Секция включает ссылки: на документацию по API, на описание функциональности, на инструкции по установке и видеоуроки.</p><h3>Задача</h3><p>Краткая формулировка задания. Например: разработать модуль Staff для CS-Cart в течение 5 дней.</p><h3>Требования</h3><p>В этом разделе перечисляем требования к реализации. Например: в каких редакциях платформы должна работать модификация, в каких браузерах, требования к оформлению результата и так далее.</p><h3>Техническое задание</h3><p>Максимально приближенное к боевому техническое задание (спецификация). В этой секции всё очень подробно расписано: какие кнопки и где должны располагаться, какие требования к типам данным предъявляются, ну и само собой, бизнес логика. При этом есть одно НО: почти всегда мы вырезаем часть описания из ТЗ, чтобы посмотреть насколько кандидат может принимать решения самостоятельно и как он поведет себя в ситуации неопределенности (какое примет решение, сможет ли его обосновать, обратит ли наше внимание на проблему и так далее).</p><h3>Усложнения</h3><p>В заключительной части прописываем дополнительную функциональность, который сделает модификацию лучше. Это даёт нам возможность понять, правильно ли мы угадали уровень кандидата. Возможно, на собеседовании он показался джуном, а на самом деле — мидл.</p><h3>Пример задания — Модуль STAFF</h3><p>Модуль подразумевает создание интерфейса в CS-Cart для управления персоналом через панель администратора, а также вывод страницы со списком персонала в витрине магазина. Пошагово:</p><ol><li>В панели администратора добавить ссылку Staff в секции Website верхнего меню.</li><li>Кликнув по этой ссылке, должна открыться новая страница Staff в админ части.</li><li>На этой странице админ сможет добавлять, редактировать Staff members.</li><li>Записи должны показываться в виде таблицы со следующими столбцами (по аналогии с меню Website -&gt; Pages):POS;Name (имя будет сформировано из значений First name и Last name);Status.</li><li>Оформление всех новых страниц должно быть выполнено в едином стиле со всеми остальными страницами админ части.</li><li>Кликнув по ссылке edit, расположенной для определенной записи Staff member, должна открыться детальная страница с описанием свойств записи Staff member.</li><li>На этой станице админ сможет редактировать следующие поля:«First name» текстовое поле ввода;«Last name» текстовое поле ввода;«Function/title» (например: директор, главный бухгалтер и так далее) текстовое поле ввода;«Email» текстовое поле ввода;«Description»  text area, редактируемая через стандартный визуальный HTML-редактор;«POS» текстовое поле ввода.</li><li>На витрине магазина необходимо добавить страницу со списком персонала в табличном формате с выводом имени/фамилии, должности. При клике на имя/фамилию должна открываться детальная страница сотрудника со списком всех полей.</li><li>Оформление этой страницы должно быть выполнено в стандартном стиле всех остальных страниц клиентской части.</li></ol><h3>Усложнение</h3><ol><li>Реализовать дополнительное поле «Photo» для загрузки фотографии сотрудника, вывести это фото на списке персонала в витрине магазина и детальной странице сотрудника.</li></ol><h3>Разбор задания</h3><p>Задание несложное, рассчитано на кандидатов уровня junior. Оно охватывает практически всё, что может потребоваться среднестатистическому сотруднику в компании Simtech Development: работу с базой данных, работу с бекендом и фронтендом, проверку на самостоятельность и ответственность.</p><p>В самом начале мы задаем общий «тон» задания. Ссылка в меню — это несложная модификация, однако, показывает, что мы ожидаем не просто работающее приложение по прямой ссылке с выводом результирующего массива, а оформленное задание. В платформе пункт меню можно добавить несколькими способами. Кандидат может пойти по правильному пути или свернуть не туда.</p><p>Далее мы просим реализовать обычный CRUD (Create, Read, Update, Delete). Обратите внимание, в задании нет прямой необходимости сделать массовое редактирование или удаление объектов. Однако, внимательный кандидат увидит, что в любом другом месте такая функциональность есть, и либо сделает его, либо уточнит необходимость создания (те самые вырезанные части ТЗ, о которых я писал выше).</p><p>Далее идёт указание на необходимость использовать единую стилистику (гайдлайн) оформления страниц. Тут мы не ожидаем от кандидата геройства (хотя некоторые пытаются его демонстрировать), нужно лишь разобраться, что уже есть в системе и скопировать необходимые поля, немного адаптировав. Возвращаясь к вырезанным пунктам ТЗ, в задании нет указания добавить сортировку по полям на списке сущностей. Кандидат должен сам принять решение или задать вопрос.</p><p>Такая вольность в постановке задач позволяет открыть большой фронт для обсуждения при разборе задания с кандидатом. Используя такой подход, мы можем определить: насколько комфортно будет работать с кандидатом, к какому тимлиду и на какие проекты его лучше прикрепить. Например: кандидат, который по аналогии сам доделает массовое удаление, сортировку и прочие очевидные штуки, попадёт в команду к не самому строгому тимлиду и, в какой-то мере, сможет прикрывать его.</p><p>Детальная страница сущности. На этом этапе ничего сложного нет, кандидат прорабатывает детали, возможно, корректирует структуру базы данных.</p><p>Как вы могли заметить, требования к базе данных не прописаны. Мы редко прописываем их и в боевых ТЗ, так как работа с БД хорошо стандартизирована. Такие вещи, как  проставленные ключи и индексы, размеры и типы полей, прописаны в стандартах. В рамках задания мы смотрим насколько кандидат разобрался в подходах, которые мы применяем, или решил изобрести свой «велосипед». Это не является минусом при анализе результата, если кандидат сможет пояснить почему он принял то или иное решение.</p><p>В завершение стандартный вывод сущности в клиентской части платформы по аналогии с зоной администратора. Тут проверять особо нечего, эта часть больше для объема самого задания и проблем с этим не возникает.</p><p>В качестве усложнения предлагается добавить возможность загрузить фотографию. Этим мы:</p><ul><li>проверим как кандидат умеет работать с файлами: будет использовать дефолтные функции PHP или разберётся как устроено хранение файлов в платформе; задумается ли он о том, что текущая модификация будет работать на проекте с распределенной файловой системой или CDN;</li><li>проверим на чем сконцентрируется кандидат: на качестве основного задания с проработкой деталей в виде сортировки и массового редактирования или погонится за выполнением большего количества пунктов ТЗ.</li></ul><h2>Парное программирование</h2><p>Наверное, каждая компания сталкивалась с отказами разработчиков от выполнения тестового задания. Кто-то считает себя слишком крутым, у кого-то нет времени, а кто-то устал в поисках работы тратить по несколько дней на выполнение заданий. В таких случаях мы предлагаем вариант «парного программирования». Наш сотрудник вместе с кандидатом решают задачу; в ходе реализации задачи можно задавать любые вопросы. Для  соискателя — это возможность познакомиться с будущим руководителем и с платформой CS-Cart. Для компании — оценить уровень задаваемых вопросов и принять решение готов ли тимлид работать с этим человеком. Занимает этот процесс от одного до двух часов, что на наш взгляд, приемлемо для обеих сторон.</p><h3>Пример задания, которое мы даём на парном программировании (взято из реальной практики)</h3><p>Экспорт цены со скидкой</p><p>Крупные агрегаторы товаров (например, yandex market) защищают свою репутацию и своих посетителей от недобросовестных продавцов. Один из инструментов такой защиты — мониторинг цен. Если обнаружится, что магазин дал скидку на товар, но не отразил это в агрегаторе, то его могут отключить на продолжительное время или даже забанить.</p><p>Для выгрузки информации по товарам на платформе CS-Cart есть функциональность Экспорта в csv-файл (который можно загрузить в стороннюю систему). Выгружаемые поля настраиваются, но к сожалению, в списке выбора по умолчанию доступна лишь базовая цена без скидки.</p><p>Задача: добавить возможность выгрузить в csv-файл цену со скидкой, если она проставлена у товара.</p><h3>Разбор задания</h3><p>Для разработчика, знакомого с системой, задание совсем простое и решается буквально за 20 минут. Однако, есть нюансы, которые помогут понять очень многое о кандидате, впервые работающим с системой.</p><p>Начинаем с блиц погружения в систему. Человек, знакомый с фреймворками и CMS-системами, сразу спросит где настраиваются скидки, а тот, кто не знаком с подобными системами, попытается предложить решение с сохранением скидки в базе данных для каждого товара. Скидка настроена, мы убедились, что она отображается на витрине; теперь кандидат должен разобраться как скидка считается. И тут начинается первая из трёх интересных частей.</p><p>Путь, которым пойдет кандидат в поиске системы калькуляции скидки, и рассуждения кандидата на 80% определят успешность прохождения собеседования. Некоторые соискатели начинают издалека: ищут сначала темплейт, где выводится информация, дальше по цепочке ищут откуда получается нужная переменная; другие рассуждают логически и сразу пытаются найти нужную функцию и внутри неё разобраться, где применяется скидка. Важно как быстро потенциальный сотрудник начнёт «трогать» код, в какой момент он вставит первый дебаг, чтобы посмотреть результат. В CS-Cart можно получить информацию о товаре вместе со скидочной ценой, вызвав функцию верхнего уровня, а можно проваливаться почти до бесконечности, пытаясь найти функцию, которая непосредственно применяет скидку. Очевидно, что путь, по которому пойдет кандидат, даст нам понимание, как он будет программировать в будущем.</p><p>Следующий интересный момент, с которым сталкивается кандидат: добавление нового поля в список доступных к экспорту полей. В платформе CS-Cart используется паттерн «схемы», в которых описывается вся логика. Мы обратим внимание на то, разберётся ли кандидат сам и насколько уместные вопросы он будет при этом задавать. Если тимлид видит, что человек закапывается, он остановит его и задаст наводящие вопросы или направит в нужное русло, так как время на выполнение задания ограничено.</p><p>Третий, усложняющий момент, оформление задания в виде модуля. В ходе выполнения мы этого не требуем, достаточно достигнуть цели и получить работающее приложение. Однако, если остаётся свободное время, мы предлагаем кандидату оформить задание в виде модуля. За короткое время потенциальный сотрудник должен посмотреть как работает модульность в платформе, как расширяются схемы и подключаются функции.</p><p>В 90% случаев кандидаты доходят до конца, поэтому основная ценность задания в общении и совместной работе.</p>]]></content:encoded>
    </item>
    <item>
      <title>Выживут ли мудрецы: задача по теории вероятностей, у которой нет единственного правильного решения</title>
      <link>https://tproger.ru/problems/zadacha-po-teorii-verojatnostej</link>
      <comments>https://tproger.ru/problems/zadacha-po-teorii-verojatnostej?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/zadacha-po-teorii-verojatnostej</guid>
      <description><![CDATA[<p>Злой дух бесконечно бросает монету и раздаёт двум пленникам результаты чётных и нечётных бросков. Головоломка допускает несколько верных решений.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/zadacha-po-teorii-verojatnostej">Выживут ли мудрецы: задача по теории вероятностей, у которой нет единственного правильного решения</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 23 Dec 2020 06:27:32 GMT</pubDate>
      <content:encoded><![CDATA[<p>Злой Дух поймал двух мудрецов и посадил их в разные комнаты своего страшного дома. Затем злой дух подбросил симметричную монету бесконечное количество раз. Все результаты чётных бросков он сообщил одному мудрецу, а все результаты нечётных — второму мудрецу.</p><p>После этого Дух предложил каждому мудрецу назвать номер броска из серии другого мудреца. Мудрецу, которому известны результаты чётных бросков, нужно назвать номер любого нечётного броска. Мудрецу, которому известны результаты нечётных бросков, нужно назвать номер любого чётного броска.</p><p>Если результаты бросков, названные мудрецами, одинаковые, то Злой Дух подарит мудрецам свободу. Если же результаты отличаются, то казнит их.</p><p>Оба мудреца знают о повадках Злого Духа и могли заранее договориться о стратегии.</p><p>Какую стратегию им выбрать, чтобы вероятность спасения была больше 50%?</p><p>У этой задачи есть много интерпретаций в интернете: мудрецы, принцессы, путешественники, но не в этом суть. Первое, что вызывает интерес, это отсутствие единственного правильного решения. А второе — то, что многие (включая меня), когда первый раз видят эту задачу, неверно понимают условия. Эта задача по теории вероятности, но часто воспринимается как обычная задача на логику. Многие думают, что при озвучивании ответов мудрецы слышат друг друга. Если вы из условий это поняли, вы — молодец! Но я всё равно рассмотрю оба варианта. ?</p><h2>Вариант 1. Мудрецы слышат друг друга</h2><p>Да, условия задачи этого не предусматривают, но явным образом также не говорится об обратном. Так почему бы не рассмотреть и такой вариант? Ведь при этом мы с можем вероятностью 100% сохранить жизни нашим мудрецам, мы ведь не желаем им зла.</p><p>Для начала представим, что у нас есть бесконечная последовательность бросков. Вот пример начала такой последовательности:</p><figure><img src="https://media.tproger.ru/uploads/2020/12/table1-2.png" alt="" /></figure><p>Мы понимаем, что в ответе один из мудрецов должен каким-то образом закодировать и передать второму мудрецу информацию о последовательности результатов, которые ему известны. То есть мы должны придумать такую стратегию, в которой первый мудрец, называя цифру неизвестного ему броска второго мудреца, одновременно сообщал ему о том, какой результат броска нужно искать.</p><p>Перед нами симметричная монета, а значит, вероятность выпадения орла и решки всегда 50/50 и не зависит от числа подбрасываний. При этом мы подбрасываем её бесконечно много раз. Значит, по закону больших чисел, фактическое среднее будет стремиться к теоретическому, то есть мы получим примерно в 50% бросков орла и в 50% — решку. Случаи, когда выпадают только орлы или только решки, мы рассматривать не будем, как варианты с очень низкой вероятностью.</p><p>Таким образом, наши мудрецы должны договориться о формате сообщения, о каком-то паттерне, который они будут искать в последовательности своих бросков. Один из вариантов такого паттерна: последовательное выпадение орла и решки у первого мудреца.</p><p>Алгоритм действий будет следующим:</p><ol><li>Первый мудрец находит в известной ему последовательности идущие подряд броски, в которых выпал сначала орёл, потом решка.</li><li>Первый мудрец называет Злому Духу (и второму мудрецу) порядковый номер первого из этих двух бросков. Здесь речь идёт не о чётном или нечётном номере броска в общей серии, а о его порядковом номере у конкретного мудреца. Например, бросок с чётным номером 4 у первого мудреца будет иметь порядковый номер 2. У второго мудреца бросок с порядковым номером 2 будет третьим в общей серии бросков.</li><li>Второй мудрец проверяет в своей последовательности бросок под названным порядковым номером. Он понимает, что у первого мудреца под этим же номером значится результат броска орёл, а под следующим — решка.</li><li>Если у первого мудреца под этим номером тоже орёл, то он смело повторяет тот же номер Злому Духу. Если решка, то для того, чтобы результаты у обоих мудрецов совпали, увеличивает номер, который он сообщит Злому Духу, на единицу.</li></ol><p>В примере, который приведён в таблице выше, действия мудрецов будут следующими:</p><ol><li>Первый мудрец находит в серии своих бросков последовательную пару «Орёл — Решка». Это броски 4 (порядковый номер 2) и 6 (порядковый номер 3). Он сообщает Злому Духу порядковый номер броска 2.</li><li>Второй мудрец, услышав сообщение первого мудреца, проверяет результат из своей серии бросков под порядковым номером 2. Это бросок 3. Его результат — решка. Значит, чтобы результаты совпали, второй мудрец должен сообщить номер броска из серии первого мудреца с результатом — решка. По паттерну он точно знает, что это результат с порядковым номером 3. Этот номер второй мудрец и сообщает Злому Духу.</li></ol><p>Таких паттернов можно придумать сколько угодно. Если заранее договориться о нужной последовательности результатов бросков, то шанс остаться в живых у мудрецов будет равняться 100%.</p><h2>Вариант 2. Мудрецы не слышат друг друга (классический вариант)</h2><p>Теперь мы подобрались к тому решению, которое ждал от нас автор задачи. Здесь мы уже не можем гарантировать 100% выживаемость мудрецов.</p><p>Подходов к решению много. Ходят слухи, что кому-то удалось найти такое решение, которое обеспечивает вероятность спасения более 70%. Если вы знаете, как добиться такого результата, напишите об этом в комментариях!</p><p>Вот один из вариантов решения задачи в классическом варианте. Для упрощения рассмотрим только первые 4 броска. У каждого мудреца — по два броска.</p><p>Стратегия мудрецов будет направлена на то, чтобы увеличить шансы на совпадение результатов. Для этого нужно продумать алгоритм выбора первого или второго броска для каждого из мудрецов в зависимости от результатов этих бросков.</p><p>Рассмотрим такой алгоритм:</p><ol><li>Если у первого мудреца результат первого броска — решка, то он сообщает Злому Духу номер 1. Иначе — номер 2.</li><li>Если у второго мудреца в первом броске выпала решка, а во втором — орёл, то он сообщает Злому Духу номер 1. Во всех остальных случаях — номер 2.</li></ol><p>Давайте сведём все возможные варианты работы такого алгоритма в таблицу. В столбцах — результаты первого мудреца, в строках — второго. В скобках указан бросок, который называет мудрец по нашему алгоритму.</p><figure><img src="https://media.tproger.ru/uploads/2020/12/table2-2.png" alt="" /></figure><p>В ячейках таблицы — сравнение результатов. Если результаты мудрецов совпали, то указан плюс, если не совпали, то минус.</p><p>Нам удалось обеспечить очень неплохой результат — 10 успешных исходов из 16. Мудрецы выживут в 62,5% случаев.  Для нашей задачи можно придумать довольно много последовательностей, которые обеспечат такой же или лучший результат. Чем больше бросков мы включим в нашу стратегию, тем с большей вероятностью мудрецам удастся выжить.</p>]]></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>Подборка задач по спортивному программированию</title>
      <link>https://tproger.ru/problems/moscow-programming-contest-tasks</link>
      <comments>https://tproger.ru/problems/moscow-programming-contest-tasks?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/moscow-programming-contest-tasks</guid>
      <description><![CDATA[<p>Исходный фрагмент статьи не содержит текста, поэтому подтвердить тему, названия, даты, числа и другие детали этого материала невозможно.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/moscow-programming-contest-tasks">Подборка задач по спортивному программированию</a>»</p>]]></description>
      <category><![CDATA[Олимпиадное программирование]]></category>
      <category><![CDATA[Обучение программированию]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 08 Jun 2020 11:13:24 GMT</pubDate>
    </item>
    <item>
      <title>Задачи по JavaScript для начинающих от Tproger и GeekBrains</title>
      <link>https://tproger.ru/problems/javascript-exercises-for-beginners-geekbrains</link>
      <comments>https://tproger.ru/problems/javascript-exercises-for-beginners-geekbrains?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Марат Зимнуров]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/javascript-exercises-for-beginners-geekbrains</guid>
      <description><![CDATA[<p>Подборка задач по JavaScript для начинающих с решениями и объяснениями. Массивы, замыкания, копирование объектов, циклы и типы данных.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/javascript-exercises-for-beginners-geekbrains">Задачи по JavaScript для начинающих от Tproger и GeekBrains</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, 16 Apr 2020 09:27:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вместе с факультетом Веб-разработки GeekUniversity собрали для вас несколько простых задач по JavaScript для обучения и тренировки, а также пару теоретических вопросов. Задачи расположены в порядке возрастания сложности.</p><p>Обратите внимание, что у любой задачи по программированию может быть несколько способов решения. Чтобы посмотреть добавленный нами вариант решения, кликните по соответствующей кнопке.</p><p><b>Главное из статьи:</b><br />— Семь задач по JavaScript возрастающей сложности: от работы с массивами до глубокого копирования объектов<br />— Для каждой задачи приведено решение с подробным разбором используемых методов<br />— Затронуты ключевые темы: замыкания, методы массивов (filter, reduce), клонирование объектов, метки циклов, особенности типов данных<br />— Задачи подходят для подготовки к собеседованиям и самостоятельной практики</p><h2>Задача 1</h2><p>Напишите однострочное решение, которое вычисляет сумму квадратных корней для всех чётных чисел целочисленного массива.</p><h2>Задача 2</h2><p>Напишите функцию, которая пишет в консоль число в заданном диапазоне, в случае, если оно успешно делится или не делится с остатком или без остатка в зависимости от параметров.</p><h2>Задача 3</h2><p>Есть ферма животных, у всех животных есть имена и возраст. Животные бывают разных типов: Кошки, Собаки, Коровы. У каждого животного могут быть дети. Если животное является родителем этих детей, в свою очередь глубина семейного древа может достигать N либо 0.</p><p>Опишите структуры данных для фермы животных и напишите функцию, которая делает подсчёт всех возрастов животных и выводит общий возраст для всей фермы.</p><h2>Задача 4</h2><p>Перепишите функцию clone таким образом, чтобы она была способна клонировать переданный как параметр объект.</p><p>Пример проблемы:</p><h2>Задача 5</h2><p>Выйдите из цикла, изменив только две отмеченные строки. Результат в консоли сейчас останавливается на 9 9. Должен на 5 4.</p><h2>Задача 6</h2><p>Яблоко стоит 1.15, апельсин стоит 2.30. Сколько они стоят вместе — чему равна сумма 1.15 + 2.30 с точки зрения JavaScript?</p><h2>Задача 7</h2><p>Чему равен typeof null в режиме use strict?</p><h2>Часто задаваемые вопросы</h2><p><b>Какой уровень знаний нужен для решения этих задач?</b><br />Задачи рассчитаны на начинающих разработчиков, которые уже знакомы с основами JavaScript: переменные, циклы, функции, массивы и объекты. Первые задачи проще, последние требуют понимания замыканий и прототипов.</p><p><b>Почему typeof null возвращает object?</b><br />Это исторический баг JavaScript, который существует с первой версии языка. В ранней реализации типы значений хранились в виде тегов, и тег для null совпадал с тегом для объектов. Баг не исправляют ради обратной совместимости.</p><p><b>Чем отличается глубокое копирование от поверхностного?</b><br />Поверхностное копирование (shallow copy) копирует только первый уровень свойств объекта. Вложенные объекты и массивы остаются ссылками на оригинал. Глубокое копирование (deep copy) рекурсивно создаёт копии всех вложенных структур, полностью изолируя копию от оригинала.</p><p><b>Можно ли использовать эти задачи для подготовки к собеседованию?</b><br />Да, задачи охватывают типичные темы собеседований по JavaScript: работу с массивами, замыкания, клонирование объектов и особенности типов данных. Рекомендуется сначала решить задачу самостоятельно, а затем сравнить своё решение с предложенным.</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>
    <item>
      <title>Логическая задача про электрика и 49 кабелей</title>
      <link>https://tproger.ru/problems/electrician-and-49-cables</link>
      <comments>https://tproger.ru/problems/electrician-and-49-cables?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/electrician-and-49-cables</guid>
      <description><![CDATA[<p>Провода в кабеле на дне реки неотличимы друг от друга, а пронумеровать их концы надо за минимум переправ: условие задачи и разбор решения.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/electrician-and-49-cables">Логическая задача про электрика и 49 кабелей</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 27 Nov 2019 15:01:46 GMT</pubDate>
      <content:encoded><![CDATA[<p>По дну реки (поперёк) проложен кабель. В нём 49 изолированных проводов. Все провода имеют изоляцию одного цвета и их нельзя отличить друг от друга. Электрик должен перенумеровать одинаковыми числами соответствующие концы проводов. Для этого у него есть источник тока, пробник-индикатор, который позволяет определить, находится ли данный провод под напряжением, и лодка.</p><p>За какое минимальное количество переправ электрик сможет выполнить задачу?</p>]]></content:encoded>
    </item>
    <item>
      <title>Задачи по Python для начинающих от Tproger и GeekBrains</title>
      <link>https://tproger.ru/problems/python-3-exercises-for-beginners-geekbrains</link>
      <comments>https://tproger.ru/problems/python-3-exercises-for-beginners-geekbrains?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Алексей Михайлишин]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/python-3-exercises-for-beginners-geekbrains</guid>
      <description><![CDATA[<p>Подборка задач по Python с разбором решений — от простых до продвинутых. Идеально для тех, кто только начинает учить программирование.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/python-3-exercises-for-beginners-geekbrains">Задачи по Python для начинающих от Tproger и GeekBrains</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>Mon, 05 Aug 2019 09:51:28 GMT</pubDate>
      <content:encoded><![CDATA[<p>Вместе с факультетом Python-разработки GeekUniversity собрали для вас несколько простых задач по Python для обучения и тренировки. Их можно решать в любом порядке. Эта статья — часть нашего <a href="https://tproger.ru/articles/python--polnyj-putevoditel-dlya-razrabotchika">полного путеводителя по Python</a>.</p><p>• Подборка из 22 задач охватывает основные темы Python: списки, словари, строки, функции и работу с файлами
• Каждая задача имеет несколько способов решения — от простых циклов до элегантных однострочников через list comprehension и lambda
• Задачи расположены от простых к более сложным: начинайте с фильтрации списков, затем переходите к словарям и алгоритмам
• Встроенные функции Python (filter, sorted, map, zip) значительно сокращают код — изучайте их параллельно с решением задач
• Для закрепления навыков решайте каждую задачу самостоятельно, прежде чем смотреть ответ</p><p>Обратите внимание, что у любой задачи по программированию может быть несколько способов решения. Чтобы посмотреть добавленный нами вариант решения, кликните по соответствующей кнопке. Все приведённые варианты написаны на Python 3. Прежде чем решать задачи, полезно освежить <a href="https://tproger.ru/translations/python-data-types">знание типов данных в Python</a>.</p><h2>Задача 1</h2><p>Есть список a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89].</p><p>Выведите все элементы, которые меньше 5.</p><h2>Задача 2</h2><p>Даны списки:</p><p>a = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89];</p><p>b = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13].</p><p>Нужно вернуть список, который состоит из элементов, общих для этих двух списков.</p><h2>Задача 3</h2><p>Отсортируйте словарь по значению в порядке возрастания и убывания.</p><h2>Задача 4</h2><p>Напишите программу для слияния нескольких словарей в один.</p><h2>Задача 5</h2><p>Найдите три ключа с самыми высокими значениями в словаре my_dict = {'a':500, 'b':5874, 'c': 560,'d':400, 'e':5874, 'f': 20}.</p><h2>Задача 6</h2><p>Напишите код, который переводит целое число в строку, при том что его можно применить в любой системе счисления.</p><h2>Задача 7</h2><p>Нужно вывести первые n строк <a href="https://ru.wikipedia.org/wiki/Треугольник_Паскаля">треугольника Паскаля</a>. В этом треугольнике на вершине и по бокам стоят единицы, а каждое число внутри равно сумме двух расположенных над ним чисел.</p><h2>Задача 8</h2><p>Напишите проверку на то, является ли строка палиндромом. Палиндром — это слово или фраза, которые одинаково читаются слева направо и справа налево.</p><h2>Задача 9</h2><p>Сделайте так, чтобы число секунд отображалось в виде дни:часы:минуты:секунды.</p><h2>Задача 10</h2><p>Вы принимаете от пользователя последовательность чисел, разделённых запятой. Составьте список и кортеж с этими числами.</p><h2>Задача 11</h2><p>Выведите первый и последний элемент списка.</p><h2>Задача 12</h2><p>Напишите программу, которая принимает имя файла и выводит его расширение. Если расширение у файла определить невозможно, выбросите исключение.</p><h2>Задача 13</h2><p>При заданном целом числе n посчитайте n + nn + nnn.</p><h2>Задача 14</h2><p>Напишите программу, которая выводит чётные числа из заданного списка и останавливается, если встречает число 237.</p><h2>Задача 15</h2><p>Напишите программу, которая принимает два списка и выводит все элементы первого, которых нет во втором.</p><h2>Задача 16</h2><p>Выведите список файлов в указанной директории.</p><h2>Задача 17</h2><p>Сложите цифры целого числа.</p><h2>Задача 18</h2><p>Посчитайте, сколько раз символ встречается в строке.</p><h2>Задача 19</h2><p>Поменяйте значения переменных местами.</p><h2>Задача 20</h2><p>С помощью анонимной функции извлеките из списка числа, делимые на 15.</p><h2>Задача 21</h2><p>Нужно проверить, все ли числа в последовательности уникальны.</p><h2>Задача 22</h2><p>Напишите программу, которая принимает текст и выводит два слова: наиболее часто встречающееся и самое длинное.</p><h2>Часто задаваемые вопросы</h2><h3>С каких задач начать изучение Python?</h3><p>Начните с задач на работу со списками и простые циклы — это задачи 1, 2 и 11 из нашей подборки. Они помогут освоить базовые конструкции языка: условия, итерации и индексацию. После этого переходите к задачам на словари и строки, а затем — к алгоритмическим задачам вроде треугольника Паскаля и палиндромов.</p><h3>Сколько задач нужно решить, чтобы выучить Python?</h3><p>Конкретного числа нет — важнее регулярность и разнообразие тем. Решение 50–100 задач разной сложности даст уверенную базу в синтаксисе и стандартной библиотеке. Главное — не просто находить ответ, а разбираться, почему одно решение лучше другого, и пробовать разные подходы к каждой задаче.</p><h3>Где ещё можно найти задачи по Python для начинающих?</h3><p>Помимо нашей подборки, задачи для практики есть на LeetCode, Codewars и HackerRank — там можно решать прямо в браузере с автоматической проверкой. Для русскоязычных разработчиков также подойдут acmp.ru и Stepik. Рекомендуем комбинировать платформы: на одних решать алгоритмические задачи, на других — практиковать работу с библиотеками.</p><h3>Нужно ли знать математику для решения задач на Python?</h3><p>Для большинства задач из этой подборки достаточно школьной арифметики. Понадобится знание чётности, деления с остатком и базовой логики. Продвинутая математика нужна только для специализированных областей — машинного обучения, криптографии или научных вычислений. Начинающим важнее понять структуры данных и алгоритмы, чем углубляться в математику. Что учить после базовых задач — в нашей <a href="https://tproger.ru/articles/python-roadmap-2023-ljn8jvxfj">дорожной карте по Python</a>.</p><p>Хотите вырасти от новичка до профессионала? Факультет Python-разработки GeekUniversity даёт год опыта для вашего резюме. Обучайтесь на практических заданиях, по-настоящему освойте Python и станьте ближе к профессии мечты.<br /><a href="https://tprg.ru/AZzs">Узнать больше</a></p>]]></content:encoded>
    </item>
    <item>
      <title>День, магазин, парковка — задача для программистов</title>
      <link>https://tproger.ru/problems/afternoon-market-parking</link>
      <comments>https://tproger.ru/problems/afternoon-market-parking?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Туренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/afternoon-market-parking</guid>
      <description><![CDATA[<p>Парковка задана графом из N узлов и M рёбер, у каждого блока своя вместимость. Нужно распечатать чек с минимальной суммой расходов для владельца.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/afternoon-market-parking">День, магазин, парковка — задача для программистов</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Олимпиадное программирование]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 27 Apr 2019 09:16:25 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Дано</h2><p>Парковка построена в виде графа. Он состоит из N узлов и M рёбер. В нём нет ни петель, ни параллельных рёбер.</p><p>Каждый узел — парковочный блок с определённой вместимостью.</p><p>Каждое ребро (u, v) обладает весом w. Это означает, что чтобы добраться от узла u к узлу v, надо потратить некоторое количество единиц w.</p><p>Места на парковке платные, стоимость составляет F единиц в любом месте графа.</p><p>На парковку въезжает K одинаковых автомобилей, каждый из которых отмечен номером от 1 до K. Машины въезжают в стандартном порядке: сначала автомобиль под номером 1, затем — под номером 2 и так далее до автомобиля под номером K.</p><p>Нужно распечатать чек с минимальной общей суммой расходов для владельца автомобиля. Сумма расходов складывается из парковочного взноса и затрат на перемещение (W, вы же помните?). Гарантируется, что из одного парковочного места можно добраться до любого другого.</p><p>Все автомобили въезжают на стоянку с первого парковочного места.</p><h2>Формат ввода</h2><p>Первая строка состоит из трёх целых чисел: N, M и F. Они обозначают количество узлов, рёбер и стоимость за въезд соответственно.</p><p>Вторая строка состоит из N целых чисел, разделённых пробелами, которые означают количество мест в каждом блоке парковки. Этот массив представляется как C[].</p><p>Следующие строки M содержат три целых числа, разделённых пробелом: u, v и w, обозначающие, что чтобы добраться от узла u к узлу v будет затрачено w единиц.</p><p>Последняя строка содержит целое число K.</p><p>Пример ввода:</p><p>5 4 201 2 1 1 21 2 24 5 13 4 11 3 15</p><h2>Формат вывода</h2><p>Выведите K целых чисел, разделённых пробелами, обозначающие ответ для каждого автомобиля. i-е целое число из ряда целых чисел, разделённых пробелами, означает ответ для i-го номера автомобиля.</p><p>Пример: есть пять автомобилей. Третье целое число в ряду из пяти будет соответствовать третьему автомобилю.</p><p>Если автомобиль невозможно припарковать, выведите -1 для него.</p><p>Пример вывода:</p><p>20 21 22 22 22</p><h2>Ограничения для входных данных</h2><figure><img src="https://media.tproger.ru/uploads/2019/03/Snimok-jekrana-2019-03-14-v-23.47.04.jpg" alt="" /></figure><h2>Другие ограничения</h2><p>Ограничение по времени: не более 1 секунды для каждого входного файла.<br />Ограничение в потреблении памяти: 256 MB.<br />Ограничение для исходного кода: 1024 KB.</p><p>Ниже представлены решения на различных языках, а в конце дано пояснение. Делитесь своими решениями в комментариях.</p><h2>Варианты решения</h2>]]></content:encoded>
    </item>
    <item>
      <title>Маляры, носки и переменные — подборка задач для программистов</title>
      <link>https://tproger.ru/problems/painters-socks-variables</link>
      <comments>https://tproger.ru/problems/painters-socks-variables?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/painters-socks-variables</guid>
      <description><![CDATA[<p>Подборка задач для программистов: определить число носков для совпадения цвета и поменять местами две числовые переменные без третьей.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/painters-socks-variables">Маляры, носки и переменные — подборка задач для программистов</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 18 Dec 2018 15:01:55 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Носки в ящике</h2><p>В ящике лежат 7 чёрных носков, 7 белых носков, 8 зеленых носков и 8 красных носков. Вы собираетесь выйти, надев свои туфли. Какое максимальное количество раз вам нужно вынуть носок из ящика, чтобы вы могли идти?</p><p>Вы можете вынимать только 1 носок из ящика за раз. Учтите, что вы не можете пойти на улицу в разных носках.</p><h2>Поменяйте переменные местами</h2><p>Даны две числовые переменные, задача – написать программу, меняющую местами эти переменные без использования других переменных.</p><h2>Маляры и перчатки</h2><p>Двое маляров встречают на дороге еще двоих маляров. У всех них перепачканы руки разными красками. Как, используя всего две перчатки, двум малярам обменяться рукопожатиями с другими двумя малярами, чтобы их руки не испачкались чужими красками? Перчатки можно передавать и выворачивать.</p>]]></content:encoded>
    </item>
    <item>
      <title>Огурцы, богатства, бочки — подборка задач для программистов</title>
      <link>https://tproger.ru/problems/cucumbers-treasures-barrels</link>
      <comments>https://tproger.ru/problems/cucumbers-treasures-barrels?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/cucumbers-treasures-barrels</guid>
      <description><![CDATA[<p>Головоломки для программистов с условиями на русском и английском: сколько весят сто килограммов огурцов, потерявших за жаркий день часть воды.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/cucumbers-treasures-barrels">Огурцы, богатства, бочки — подборка задач для программистов</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 05 Dec 2018 12:05:00 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Огурцы под жарким солнцем</h2><p>Ранним утром бакалейщик выставил 100 килограмм огурцов на улицу перед своим магазином. Огурцы на 99 % состоят из воды. День был жарким и часть воды из огурцов испарилась. В конце дня огурцы состояли из воды на 98 %. Сколько килограммов эти огурцы весили в конце дня (если бакалейщик не продал ни одного огурца)?</p><h2>Города и богатства</h2><p>Дано n городов: x1, x2, …… xn — у каждого своё богатство T[i] и цвет C[i]. Вы можете выбрать между посещением города или его пропуском. Разрешено только движение вперёд. При посещении города вы получаете следующую сумму денег:</p><ul><li>A*T[i], если цвет города совпадает с цветом ранее посещённого города;</li><li>B*T[i], если это первый посещённый город такого цвета, или цвет отличается от цвета предыдущего города.</li></ul><p>Значения T[i], A и B могут быть отрицательными, в то время как C[i] может быть от 1 до n.</p><p>Задача: Необходимо составить алгоритм получения максимально возможной прибыли.</p><p>Примеры:</p><p>Вход: A = -5, B = 7<br />Богатство = {4, 8, 2, 9}<br />Цвет = {2, 2, 6, 2}<br />Выход: 133<br />Посетить города 1, 2 и 3. Прибыль = 8 * 7 + 2 * 7 + 9 * 7 = 133.</p><p>Вход: A = 5, B = -7<br />Богатство = {4, 8, 2, 9}<br />Цвет = {2, 2, 6, 2}<br />Выход: 57<br />Посетить города 1, 2, 4. Прибыль = (-7) * 4 + 8 * 5 + 9 * 5 = 57.</p><h2>Заполненность бочки</h2><p>Два рабочих на заводе спорят о том, сколько пива находится в бочке. Один оптимистично считает, бочка заполнена больше, чем наполовину, а другой заявляет, что пива в ней меньше половины. Как они могут проверить, кто из них прав, без использования измерительных приборов?</p><p>Примечание: крышку бочки можно снять.</p>]]></content:encoded>
    </item>
    <item>
      <title>Батарейки, ряды и конференции — подборка задач для программистов</title>
      <link>https://tproger.ru/problems/batteries-series-conferences</link>
      <comments>https://tproger.ru/problems/batteries-series-conferences?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/batteries-series-conferences</guid>
      <description><![CDATA[<p>Подборка задач для программистов: рабочие батарейки для фонарика, сумма рядов и посетители конференции, а также разбор решения задачи о батарейках.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/batteries-series-conferences">Батарейки, ряды и конференции — подборка задач для программистов</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 16 Nov 2018 13:46:19 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Батарейки и фонарик</h2><p>У вас есть 8 батареек, но работают только 4 из них. Вам необходимо вставить 2 рабочие батарейки в фонарик. Какое минимальное количество пар батареек придётся проверить, чтобы фонарик точно включился?</p><h2>Найти сумму ряда 1-2+3-4+5-6+7</h2><p>Дано число N. Необходимо написать программу для поиска суммы последовательности из n чисел по следующему алгоритму:<br />1 − 2 + 3 − 4 + 5 − 6 + …</p><p>Пример:</p><p>Вход: N = 8<br />Выход: −4</p><p>Вход: N = 10001<br />Выход: 5001</p><h2>Сколько людей на конференции?</h2><p>Каждый гость на конференции обменялся рукопожатием с другим. Всего было 66 рукопожатий. Сколько гостей прибыло на научную конференцию?</p>]]></content:encoded>
    </item>
    <item>
      <title>Избавляемся от шляп, ищем расстояния в массиве и нули в факториале — подборка задач для программистов</title>
      <link>https://tproger.ru/problems/hats-distance-zeros</link>
      <comments>https://tproger.ru/problems/hats-distance-zeros?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/hats-distance-zeros</guid>
      <description><![CDATA[<p>Подборка головоломок: джинн и магические шляпы на острове, поиск расстояний в массиве и подсчёт нулей в факториале с условиями и примечаниями.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/hats-distance-zeros">Избавляемся от шляп, ищем расстояния в массиве и нули в факториале — подборка задач для программистов</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 10 Oct 2018 17:27:09 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Джинн и шляпы</h2><p>На острове проживает группа людей. Появившийся джинн собрал всех и надел магические шляпы (или шляпу) некоторым людям (т. е., минимум одну шляпу). Волшебная природа шляпы проявляется в том, что она видима другими людьми, но не видна самому носителю. Чтобы избавиться от шляпы, обладатели (и только они) должны нырнуть в реку ровно в полночь. Если всего человек — N, а шляп — С, сколько времени займет избавление от шляп? Люди не могут сообщать друг другу о наличии шляпы (любым способом).</p><p>Примечание Джинн не сообщил, сколько шляп он надел.</p><h2>Максимальное расстояние между элементами массива</h2><p>Дан массив с повторяющимися элементами. Задача — найти максимальное расстояние между двумя вхождениями элемента.</p><p>Примеры:</p><p>Вход: arr[] = {3, 2, 1, 2, 1, 4, 5, 8, 6, 7, 4, 2}<br />Выход: 10</p><p>// максимальное расстояние для 2 это 11-1 = 10<br />// максимальное расстояние для 1 это 4-2 = 2<br />// максимальное расстояние для 4 это 10-5 = 5</p><h2>Нули в факториале числа 100</h2><p>Сколько замыкающих нулей в 100! (факториал числа 100)?</p>]]></content:encoded>
    </item>
    <item>
      <title>Продаём молоко, меряем денежные пирамиды и красим кубы — подборка задач для программистов</title>
      <link>https://tproger.ru/problems/milk-coins-cubes</link>
      <comments>https://tproger.ru/problems/milk-coins-cubes?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/milk-coins-cubes</guid>
      <description><![CDATA[<p>Подборка головоломок с разбором: как четырьмя банками отмерить от 1 до 40 литров молока, а также задачи про денежные пирамиды и окрашивание кубов.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/milk-coins-cubes">Продаём молоко, меряем денежные пирамиды и красим кубы — подборка задач для программистов</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 20 Sep 2018 16:53:50 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Отмеряем 1-40 литров молока</h2><p>У вас есть бидон, полный молока на продажу, и 4 банки. Какого объема должны быть эти банки, чтобы вы смогли отмерить любой объем молока от 1 до 40 литров, при том что каждая банка может быть использована только 1 раз?</p><h2>Максимальная высота треугольника из монет</h2><p>Дано N монет, которые нужно расположить в форме треугольника так, чтобы в первой линии была 1 монета, во второй — 2 и так далее. Необходимо вычислить максимальную высоту треугольника, который возможно сформировать из этих N монет.</p><h2>Шестицветные кубы</h2><p>У вас есть обычный шестигранный куб и краски шести разных цветов. Вам нужно окрасить каждую сторону куба в свой цвет. Сколько различный вариаций окраски вы сможете сделать?</p><p>Примечание Если 2 куба можно повернуть так, чтобы у них совпали по цветам все грани, — окраски считаются одинаковыми.</p>]]></content:encoded>
    </item>
    <item>
      <title>Ищем профессора, проверяем пары в массиве и зажигаем лампы: подборка задач для программистов</title>
      <link>https://tproger.ru/problems/professor-array-bulb</link>
      <comments>https://tproger.ru/problems/professor-array-bulb?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/professor-array-bulb</guid>
      <description><![CDATA[<p>Три задачи для программистов: определить профессора по вопросам об именах, проверить пары в массиве и решить задачу о зажигании ламп.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/professor-array-bulb">Ищем профессора, проверяем пары в массиве и зажигаем лампы: подборка задач для программистов</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 03 Sep 2018 13:37:08 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Найдите профессора</h2><p>Известный профессор прибыл с лекцией на конференцию. К сожалению, вы не успели на лекцию и пришли уже во время перерыва. Вы хотели бы задать профессору несколько вопросов, но не знаете даже его имени. В комнате N+1 человек, они могут знать или не знать имена других гостей. Также присутствует один профессор (всего людей N+1), профессор не знает ничьего имени, но все знают имя профессора.</p><p>У вас есть поименный список присутствующих (N+1). Вы можете задавать только один вопрос: «Вы знаете это имя?».</p><p>Какое максимальное количество вопросов потребуется задать, чтобы узнать имя профессора?</p><p>Примечание Предположим, что все имена уникальны и вы знаете присутствующих по именам (но не знаете, является ли человек профессором).</p><h2>Ищем пары элементов массива с оператором AND</h2><p>Дан массив из N целых чисел. Задача: найти количество таких пар (i, j), при которых результат побитовой операции A[i] &amp; A[j] является нечётным.</p><p>Пример:</p><p>Вход: N = 4A[] = { 5, 1, 3, 2 }</p><p>Выход: 3</p><p>Все пары чисел в A[] = ( 5, 1 ), ( 5, 3 ), ( 5, 2 ), ( 1, 3 ), ( 1, 2 ), ( 3, 2 )</p><p>5 AND 1 = 1, 5 AND 3 = 1, 5 AND 2 = 0,1 AND 3 = 1, 1 AND 2 = 0,3 AND 2 = 2</p><p>Всего пар с нечетным результатом A( i, j ) = 3</p><p>Вход: N = 6A[] = { 5, 9, 0, 6, 7, 3 }</p><p>Выход: 6</p><p>Всего пар в A[] =</p><p>( 5, 9 ) = 1, ( 5, 0 ) = 0, ( 5, 6 ) = 4, ( 5, 7 ) = 5, ( 5, 3 ) = 1,( 9, 0 ) = 0, ( 9, 6 ) = 0, ( 9, 7 ) = 1, ( 9, 3 ) = 1,( 0, 6 ) = 0, ( 0, 7 ) = 0, ( 0, 3 ) = 0,( 6, 7 ) = 6, ( 6, 3 ) = 2,( 7, 3 ) = 3</p><h2>Зажгите лампы</h2><p>2014 ламп расположены по кругу, 2 из них включены, 2012 — выключены. Вы можете выбрать любую лампу и изменить состояние соседних с ней на противоположное — включить погасшую или погасить включенную. Получится ли таким образом зажечь все 2014 ламп? Если да, то как?</p>]]></content:encoded>
    </item>
    <item>
      <title>Считаем деньги, уравниваем элементы массива и усаживаем людей в баре: подборка задач для программистов</title>
      <link>https://tproger.ru/problems/capital-array-bar</link>
      <comments>https://tproger.ru/problems/capital-array-bar?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/capital-array-bar</guid>
      <description><![CDATA[<p>Подборка головоломок: подсчёт начального капитала после посещения храмов, выравнивание элементов массива и размещение гостей в баре.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/capital-array-bar">Считаем деньги, уравниваем элементы массива и усаживаем людей в баре: подборка задач для программистов</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Mon, 20 Aug 2018 06:16:28 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Начальный капитал</h2><p>У некого человека в кармане лежит сумма денег между $90 и $95. Этот человек посещает несколько храмов. Как только он входит в храм, количество денег у него удваивается, а на выходе он жертвует $100 в каждом храме. Когда он выходит из последнего храма, его карман остается пустым. Вопрос: сколько денег было у этого человека изначально и сколько храмов он посетил?</p><h2>Равенство элементов массива</h2><p>Дан массив положительных целых чисел arr[]. Разрешены следующие операции:</p><ol><li>Выбрать 2 индекса, элемент массива с первым индексом увеличить на 1, элемент со вторым индексом — уменьшить на 1. Стоимость операции = a.</li><li>Выбрать любой индекс, элемент с этим индексом увеличить на 1. Стоимость операции = b.</li></ol><p>Задача: найти минимальную стоимость операций, которые позволят сделать все элементы массива равными.</p><p>Примеры:</p><p>Вход: n = 4, a = 2, b = 3</p><p>arr[] = { 3, 4, 2, 2 }</p><p>Выход : 5</p><p>Выполним операцию 2 над 3-им элементом (нумерация с 0). Стоимость операции — 2. Выполним операцию 1 над элементом 1 (уменьшение) и элементом 2 (увеличение). Стоимость этой операции — 3.</p><p>Вход : n = 3, a = 2, b = 1</p><p>arr[] = { 5, 5, 5 }</p><p>Выход : 0</p><h2>Бар для асоциальных людей</h2><p>В одном баре стоит 25 стульев, выстроенных в линию. Посетители этого бара не любят общаться, и когда кто-то приходит, он всегда старается сесть как можно дальше от присутствующих. Если же мест без соседства с кем-либо не осталось, он разворачивается и уходит. Владелец бара хочет, чтобы посетителей было как можно больше. Первому пришедшему посетителю бармен может указать место, на которое нужно сесть, последующие же выберут себе мест сами. Предположим, что места пронумерованы от 1 до 25. Какое место следует занять первым?</p>]]></content:encoded>
    </item>
    <item>
      <title>Ищем правду, решаем судоку и генерируем числа: подборка задач для программистов</title>
      <link>https://tproger.ru/problems/truth-sudoku-rand</link>
      <comments>https://tproger.ru/problems/truth-sudoku-rand?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/truth-sudoku-rand</guid>
      <description><![CDATA[<p>Головоломка из ста утверждений: каждое сообщает, сколько утверждений ложны. Последовательное рассуждение даёт 50 истинных и 50 ложных.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/truth-sudoku-rand">Ищем правду, решаем судоку и генерируем числа: подборка задач для программистов</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 12 Aug 2018 18:00:39 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Правильные и неправильные предложения</h2><p>Имеется сотня следующих утверждений:</p><p>1-е гласит: по меньшей мере, одно утверждение ложно.<br />2-е гласит: по меньшей мере, два утверждения ложны.<br />3-е гласит: по меньшей мере, три утверждения ложны.<br />4-е гласит: по меньшей мере, четыре утверждения ложны.<br />…<br />100-е гласит: по меньшей мере, сто утверждений ложны.</p><p>Сколько утверждений ложны и сколько истинны?</p><h2>Проверка поля Судоку</h2><p>Дана конфигурация доски судоку, необходимо написать программу для проверки корректная она или нет.</p><p>Пример:</p><p>Вход:</p><p>Выход: корректна.</p><h2>Генератор равной вероятности</h2><p>Напишите метод для генерации случайного числа от 1 до 8, если имеется метод, возвращающий случайное число 1 до 3. Распределение чисел должно быть равномерным.</p>]]></content:encoded>
    </item>
    <item>
      <title>Разбор задач из онлайн-соревнования по бэкенду Yandex.Taxi Coding Fest</title>
      <link>https://tproger.ru/problems/ytcf-problems-solutions</link>
      <comments>https://tproger.ru/problems/ytcf-problems-solutions?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Прияцелюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/ytcf-problems-solutions</guid>
      <description><![CDATA[<p>Решения задач июльского онлайн-соревнования по бэкенду Yandex.Taxi Coding Fest с подробным разбором, включая группировку точек подачи такси.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/ytcf-problems-solutions">Разбор задач из онлайн-соревнования по бэкенду Yandex.Taxi Coding Fest</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Олимпиадное программирование]]></category>
      <category><![CDATA[Партнёрский материал]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Thu, 09 Aug 2018 18:23:44 GMT</pubDate>
      <content:encoded><![CDATA[<p>В июле прошло онлайн-соревнование по бэкенду Yandex.Taxi Coding Fest. Перед вами задачи, которые предлагались на соревновании, и их решения с подробным разбором.</p><h3>1. Группировка рекомендуемых точек подачи на прямой</h3><h4>Формулировка задачи</h4><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/aee74482-e274-4d8c-a008-bf1ae347557f.png" alt="" /></figure><p>На улицу Льва Толстого заказали такси N раз. Известны точки на улице, куда подъехали водители. Назовём их точками прибытия. Приложение запоминает точки прибытия и на их основе просчитывает рекомендуемые точки подачи. Точки подачи нужны, чтобы приложение порекомендовало пользователю, куда лучше заказать автомобиль.</p><p>Сформируйте из точек прибытия на улице Льва Толстого наименьшее количество рекомендуемых точек подачи. Каждая рекомендуемая точка должна быть одной из списка точек прибытия. Расстояние от каждой точки прибытия до ближайшей рекомендуемой не должно превосходить R.</p><p><b>Формат ввода</b></p><p>В первой строке задаётся два числа N (0 ≤ N ≤ 105) и R (0 ≤ R ≤ 109) через пробел. В следующей строке записано N целых чисел (координаты точек), каждое из которых по абсолютной величине не превосходит 109.</p><p>Формат вывода</p><p>Выведите одно целое число, показывающее наименьшее количество точек, которые надо выбрать в качестве рекомендуемых точек подачи.</p><p><b>Примеры</b></p><p><b>Формат вывода</b></p><p>Выведите одно целое число, показывающее наименьшее количество точек, которые надо выбрать в качестве рекомендуемых точек подачи.</p><p><b>Примеры</b></p><p><b>Входные данные №1</b></p><p>3 2</p><p>3 5 1</p><p><b>Выходные данные №1</b></p><p>1</p><p><b>Входные данные №2</b></p><p>3 2</p><p>4 7 1</p><p><b>Выходные данные №2</b></p><p>3</p><p><b>Входные данные №3</b></p><p>6 1</p><p>6 2 4 3 5 1</p><p>Выходные данные №3</p><p>2</p><h4>Разбор задачи</h4><p>Для начала переведём задачу в математическую постановку.</p><p>Нужно выбрать такое наименьшее количество точек на числовой прямой, чтобы расстояние от каждой имеющейся точки до выбранной нами не превосходило R. Можно считать, что каждая выбранная нами точка вырезает на плоскости отрезок длиной 2R, и после вырезаний должны пропасть все точки. Для решения задачи нам сначала надо отсортировать точки. После сортировки у нас появляется самая левая точка. Легко доказать, что эта точка в оптимальном решении должна входить ровно в один отрезок, причём этот отрезок должен быть максимально отодвинут вправо. Чтобы выбрать наиболее подходящую точку, мы проходимся циклом по точкам слева направо и ищем самую правую, у которой расстояние до первой точки не превосходит R. Потенциально это может быть и самая правая точка.</p><p>Как только мы нашли эту точку, мы виртуально вырезаем отрезок длиной 2R и пропускаем все точки, что находятся внутри него (слева от первой и справа от последней точки отрезка).</p><p>После этого действия у нас снова остался отсортированный список точек, к которому мы применяем тот же алгоритм. Осталось посчитать, сколько точек нам удалось выбрать.</p><h3>2. Такси в отеле</h3><h4>Формулировка задачи</h4><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/9d64f53f-f571-4802-bbcf-6d29eaec5145.png" alt="" /></figure><p>При отеле в курортном городе работает такси. Оно забирает постояльцев отеля из аэропорта, а в день отъезда отвозит назад. Нам известны дни приездов и отъездов автомобилей этого такси и число клиентов отеля, которые каждый раз приезжали или уезжали. В один и тот же день может быть как несколько приездов, так и несколько отъездов посетителей.</p><p>В отеле по нечётным числам месяца готовит шеф-повар Мефодий, по чётным — шеф-повар Кирилл. Они поспорили, кому тяжелее работать. Повара хотят посчитать максимальное число посетителей, для которых готовил каждый из них с первого дня по текущий включительно.</p><p>Напишите программу, которая, используя данные про приезды и отъезды посетителей, выводит на стандартный вывод два числа через пробел. Первое число — максимальное количество посетителей, для которых готовил Мефодий. Второе — максимальное количество посетителей, для которых готовил Кирилл.</p><p>Условие: для приезжающих постояльцев в день приезда готовить нужно, а для отъезжающих в этот день — уже не нужно (то есть нужно готовить только для тех, кто остаётся в отеле как минимум на ночь). Изначально в отеле посетителей не было.</p><p><b>Формат ввода</b></p><p>На входе на первой строке есть одно число N (2 ≤ N ≤ 105), где (N − 1) — число записей в логе.</p><p>Далее следует строка с информацией про номер текущего дня M — целое положительное число (0 ≤ M ≤ 103). После идёт (N − 1) — строка с данными о приездах и отъездах такси с посетителями по текущий день в виде набора строк в следующем формате:</p><p>arrival arrival_day_number clients_count</p><p>departure departure_day_number clients_count</p><p>Строки, начинающиеся со слова arrival, соответствуют приезду clients_count клиентов в день под номером arrival_day_number.</p><p>Строки, начинающиеся со слова departure, соответствуют отъезду clients_count клиентов в день под номером departure_day_number.</p><p>При этом выполняются условия:</p><p>0 &lt; clients_count ≤ 103</p><p>0 ≤ arrival_day_number ≤ 105</p><p>0 ≤ departure_day_number ≤ 105</p><p>Формат вывода</p><p>Два числа — максимальные количества посетителей, для которых готовили Мефодий и Кирилл соответственно.</p><p><b>Примеры</b></p><p><b>Входные данные</b></p><p>7</p><p>3</p><p>arrival 3 2</p><p>departure 2 5</p><p>arrival 3 2</p><p>arrival 2 2</p><p>arrival 1 10</p><p>departure 3 7</p><p><b>Выходные данны</b>е</p><p>10 7</p><h4>Разбор задачи</h4><p>Задача имеет несколько разных подходов к решению. Разберём один из них.</p><p>Нас просят найти два числа: максимальные количества посетителей в день, для которых готовил каждый из поваров.</p><p>Для начала считаем данные о приездах и отъездах посетителей в массив структур, каждая из которых хранит в себе информацию об одном из событий: в какой из дней был приезд или отъезд и сколько людей в этот день приехало или выехало из отеля соответственно.</p><p>Далее отсортируем этот массив событий в хронологическом порядке. После этого, чтобы посчитать интересующие нас показатели, нужно пройти по получившемуся массиву событий слева направо, поддерживая текущее число посетителей отеля, для которых нужно готовить, и обновляя два максимума — количества посетителей в чётные и нечётные дни. При этом стоит обратить внимание на два нюанса:</p><p>1. В один и тот же день может быть несколько приездов и отъездов, поэтому нужно явно посчитать, сколько людей приехало и выехало в каждый из дней, суммируя приезжающих и вычитая выезжающих.</p><p>2. Если в некоторый момент времени мы рассматриваем день с, например, чётным номером N, а на предыдущей итерации цикла был рассмотрен день с номером меньшим (N − 1), то, при условии, что текущее число посетителей отеля, для которых нужно готовить превысило максимум для нечётных дней, нужно обновить и этот максимум (по нечётным дням).</p><h3>3. Очередь такси в космическом порту</h3><h4>Формулировка задачи</h4><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/aa2359d3-b060-4ec9-9de1-1faa5b4e3ec7.png" alt="" /></figure><p>Водитель такси прибывает в космопорт Луны. Все такси в ожидании заказа выстраиваются в очередь возле шлюзов космической станции.</p><p>Считаем, что автомобили образуют очередь, если все они находятся на одной прямой. Длина очереди не может быть менее 3. Координаты автомобиля задаются тремя целыми числами. В одной точке пространства не может находиться более одного автомобиля.</p><p>Помогите водителю найти самую короткую очередь. В случае, если невозможно найти минимальную очередь длиной ≥ 3, в качестве ответа верните 0.</p><p><b>Формат ввода</b></p><p>Первая строка содержит целое неотрицательное число — количество записей с координатами такси. Каждая следующая строка состоит из трёх целых чисел, разделённых пробелами, образующих тройку координат x, y, z.</p><p><b>Формат вывода</b></p><p>Одно число — минимальная длина очереди.</p><p><b>Примеры</b></p><p>Входные данные №1</p><p>10</p><p>1 1 1</p><p>2 2 2</p><p>3 3 3</p><p>4 4 4</p><p>5 5 5</p><p>6 6 6</p><p>7 7 7</p><p>3 6 9</p><p>2 4 6</p><p>1 2 3</p><p>Выходные данные №1</p><p>3</p><p>Входные данные №2</p><p>5</p><p>1 1 1</p><p>2 2 2</p><p>3 3 3</p><p>4 1 4</p><p>9 9 9</p><p>Выходные данные №2</p><p>4</p><h3>Разбор задачи</h3><p>Очевидно, что задача сводится к поиску подмножеств точек, лежащих на одной прямой, и выбору подмножества минимальной мощности ≥ 3.</p><p>Вспомним каноническое уравнение прямой:</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/4560122c-42ec-471b-b2ed-8c4608f14061.png" alt="" /></figure><p>Где (α, β, γ)  – координаты вектора, коллинеарного этой прямой.</p><p>Из данного уравнения явным образом следует:</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/b6f49207-3da8-4ba0-b742-4c6d31ea0ff6.png" alt="" /></figure><p>Таким образом, получаем простой алгоритм решения задачи.</p><p>На каждом шаге будем поочерёдно выбирать каждую из N точек за (x0, y0, z0). Разобьём всё остальное множество точек на подмножества по ключу</p><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/2d121bc2-347a-44c3-887f-eeeab7087200.png" alt="" /></figure><p>и запомним минимальную мощность получившихся подмножеств.</p><p>С точки зрения реализации, удобно перейти от операций с рациональными дробями к операциям с тройкой целых чисел (Δxi, Δyi, Δzi).</p><p>Для этого необходимо нормировать (xi − x0, yi − y0, zi − z0) по НОД(xi − x0, yi − y0, zi − z0).</p><p>Полученный алгоритм будет иметь вычислительную сложность O(n2) и требования к памяти O(n).</p><h3>4. Телепорт</h3><h4>Формулировка задачи</h4><figure><img src="https://media.tproger.ru/user-uploads/33794/2024-02-21/17646ea7-bd61-47b4-8e6f-10aefe375667.png" alt="" /></figure><p>Яндекс.Такси открыло услугу межконтинентальной телепортации автомобилей. Телепорт представляет собой замкнутую область (полигон), в котором одновременно могут находиться несколько автомобилей. Телепорт открывается в определённые моменты времени — заранее они не известны. Одновременно может телепортироваться только одна машина. Если в момент открытия портала в полигоне находится более одного автомобиля, то будет телепортирован тот, который лучше всего синхронизирован с полем телепорта (дольше других непрерывно находился в зоне телепортации). Зная траектории движения автомобилей и моменты времени открытия портала, выведите соответствие порядкового номера открытия портала и автомобиля. Если в момент открытия портала в полигоне не было автомобилей, выведите -1.</p><p>Формат ввода</p><p>В первой строке находится число N — количество вершин в полигоне. В следующей строке находится N пар целых чисел Pxi и Pyi (разделённые пробелом), задающих вершины полигона. Никакие из двух сторон полигона не пересекаются. В следующей строке находится число M — количество автомобилей. Далее следует M строк, в каждой из которых идёт количество треков i-го автомобиля Ti; следом за ней — Ti * 3 целых чисел, разделённых пробелом. Каждая тройка - это одна координата автомобиля, состоящая из времени точки t и координат точки x и y. В следующей строке находится количество открытий телепорта K. За ней на этой же строке через пробел находится K чисел, обозначающих время открытия телепорта Ki. Гарантируется, что все времена будут строго возрастающими.</p><p>Ограничения:</p><p>3 ≤ N ≤ 100</p><p>-109 ≤ Pxi, Pyi, x, y ≤ 109</p><p>0 ≤ M ≤ 104</p><p>1 ≤ K ≤ 104</p><p>0 ≤ t ≤ 106</p><p>0 ≤ Ki ≤ 107</p><p>Суммарное количество всех треков Ti всех автомобилей не превышает 105, при этом каждый автомобиль имеет хотя бы один трек. У каждого автомобиля все треки гарантированно уникальные по времени. Автомобиль находится внутри полигона, если последний его трек (со временем t ≤ Ki) находится внутри полигона.</p><p><b>Формат вывода</b></p><p>Необходимо вывести K целых чисел, где каждое число обозначает идентификатор автомобиля, который телепортируется в соответствующее время, либо -1, если автомобилей в очереди нет. Если несколько автомобилей въехали одновременно, то необходимо вывести тот, у которого меньший идентификатор. Каждый автомобиль может телепортироваться не более одного раза.</p><p><b>Примеры</b></p><p>Входные данные №1</p><p>4</p><p>-1 -1 -1 1 1 1 1 -1</p><p>4</p><p>1 1 -2 1</p><p>1 2 0 0</p><p>1 3 0 0</p><p>1 4 1 1</p><p>5 0 2 4 5 6</p><p>Выходные данные №1</p><p>-1 2 3 4 -1</p><p>Входные данные №2</p><p>4</p><p>-1 -1 -1 1 1 1 1 -1</p><p>4</p><p>2 1 -2 1 3 -1 1</p><p>1 2 0 0</p><p>1 3 0 0</p><p>1 4 1 1</p><p>5 0 2 4 5 6</p><p>Выходные данные №2</p><p>-1 2 1 3 4</p><h3>Разбор задачи</h3><p>Рассмотрим один из подходов к решению задачи.</p><p>При считывании позиций водителей можно сразу определять принадлежность точки заданному полигону. По условию полигон не имеет никаких пересечений, поэтому задача несколько упрощается. Можно воспользоваться алгоритмом с использованием луча, выпущенного из проверяемой точки, и посчитать количество пересечений со сторонами многоугольника.</p><p>Далее можно объединить все позиции водителей с привязкой ко времени и время открытия телепорта в один сортированный список событий и пройти по нему. Тогда задача сводится к поддержанию актуального списка водителей в очереди и их последовательности.</p><p>При появлении очередного трека с координатами, проверяем, был ли этот водитель внутри полигона ранее. Если водитель только что въехал в полигон, то добавляем его в конец очереди (удобнее использовать для этого двусвязный список) и в индекс для быстрого поиска водителя внутри списка. Если водитель выехал из полигона, то по индексу находим его в списке и удаляем из списка и из индекса.</p><p>При открытии телепорта берём первого водителя из списка (или выводим -1, если список пустой) и добавляем его в список исключений, поскольку он уже переместился на другой континент.</p><p>Так как все моменты открытия телепорта строго возрастающие, нет необходимости делать дополнительные индексы, а можно выводить данные сразу по ходу новых открытий телепорта.</p>]]></content:encoded>
    </item>
    <item>
      <title>Режем кубы, преобразовываем строки, считаем квадраты: подборка задач для программистов</title>
      <link>https://tproger.ru/problems/cube-strings-chess</link>
      <comments>https://tproger.ru/problems/cube-strings-chess?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/cube-strings-chess</guid>
      <description><![CDATA[<p>Куб со стороной 4 см разрезают на кубики по 1 см, перемешивают и бросают один из них. Нужно найти вероятность выпадения зелёной грани.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/cube-strings-chess">Режем кубы, преобразовываем строки, считаем квадраты: подборка задач для программистов</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 04 Aug 2018 13:48:44 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Зелёный куб</h2><p>У вас есть куб со стороной 4 см, покрашенный зеленой краской со всех сторон. Вы разрезаете этот куб на маленькие кубики со стороной 1 см. У этих новых кубиков будет либо 3 зеленые стороны, либо 2 зеленые стороны, либо 1, либо вообще ни одной. Все кубики помещаются в урну и тщательно перемешиваются, затем случайным образом выбирается один. Он подбрасывается как игральная кость. Какова вероятность, что он приземлится зеленой стороной вверх?</p><h2>Способы преобразования одной строки к другой</h2><p>Даны 2 строки: str1 и str2; задача — вывести все возможные варианты преобразования str1 в str2. К str1 применимы операции:</p><ul><li>вставки;</li><li>удаления;</li><li>замены.</li></ul><p>Все операции имеют одинаковую стоимость. Задача — вывести все варианты преобразования str1 в str2 с использованием минимального количества шагов (операций), где вариантом ответа является последовательность операций.</p><p>Примеры:</p><p>Вход: str1 = «abcdef», str2 = «axcdfdh»</p><p>Выход:</p><p>Вариант 1:</p><ul><li>Вставить h;</li><li>Заменить f на d;</li><li>Заменить e на f;</li><li>Заменить b на x.</li></ul><p>Вариант 2:</p><ul><li>Заменить f на h;</li><li>Вставить d;</li><li>Заменить e на f;</li><li>Заменить b на x.</li></ul><p>Вариант 3:</p><ul><li>Заменить f на h;</li><li>Заменить e на d;</li><li>Вставить f;</li><li>Заменить b на x.</li></ul><h2>Квадраты на шахматной доске</h2><p>Сколько квадратов на шахматной доске?</p><figure><img src="https://media.tproger.ru/uploads/2018/07/image1-280x280.jpg" alt="" /></figure><p>Если вы думаете, что 64, — подумайте еще раз!</p><p>Учли ли вы квадраты, которые образованы комбинацией клеток (2×2, 3×3, 4×4 и т.д.)?</p>]]></content:encoded>
    </item>
    <item>
      <title>Подборка задачек: считаем спички, капли и вычисляем лживых осьминогов</title>
      <link>https://tproger.ru/problems/matchsticks-pipes-and-an-octopus</link>
      <comments>https://tproger.ru/problems/matchsticks-pipes-and-an-octopus?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/matchsticks-pipes-and-an-octopus</guid>
      <description><![CDATA[<p>Два игрока по очереди забирают крайнюю кучку спичек из ряда. Нужно выбрать порядок хода и алгоритм, который даст максимальное число спичек.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/matchsticks-pipes-and-an-octopus">Подборка задачек: считаем спички, капли и вычисляем лживых осьминогов</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 24 Jul 2018 16:40:10 GMT</pubDate>
      <content:encoded><![CDATA[<h2>Игра со спичками</h2><p>N спичечных кучек с различным количеством спичек расположены в ряд (предположим, что кучек четное количество). Два игрока по очереди забирают себе по крайней куче, пока не останется ни одной. Игрок с большим количество спичек побеждает.</p><p>Вы бы предпочли ходить первым или вторым? Это имеет значение?</p><p>Предположим, что вы ходите первым — предложите алгоритм для получения максимального количества спичек, которое вы сможете выиграть.</p><p>Стратегия, просто основанная на заборе максимальной из 2-х крайних куч, может не работать. В следующем примере первый игрок проигрывает, если забирает максимальную из 2-х куч каждый ход:</p><p>Расстановка 18 20 15 30 10 14:</p><ol><li>Первый игрок забирает 18, осталось: 20 15 30 10 14.</li><li>Второй игрок забирает 20, осталось: 15 30 10 14.</li><li>Первый игрок забирает 15, осталось: 30 10 14.</li><li>Второй игрок забирает 30, осталось: 10 14.</li><li>Первый игрок забирает 14, осталось: 10.</li><li>Второй игрок забирает 10, конец игры.</li></ol><p>Второй игрок (20+30+10) собрал в итоге больше, чем первый (18+15+14) и выиграл.</p><h2>Капли в трубе</h2><p>Рассмотрим трубу длиной L. В трубе присутствует N капель на N различных позициях. Каждая капля движется к концу трубы (x = L) с разной скоростью. Когда капля смешивается с другой каплей, она принимает скорость капли с которой смешивается. Напишите программу для определения количества капель, которые вытекут из трубы.</p><p>См. рисунок ниже:</p><figure><img src="https://media.tproger.ru/uploads/2018/07/droplets-puzzle-mini-pic-1.jpg" alt="" /></figure><p>Пример:</p><p>Вход: длина = 12, позиции = [10,8, 0, 5, 3], скорость = [2, 4, 1, 1, 3].<br />Выход: 3.</p><p>Объяснение:</p><p>Капли, начинающие с позиций x=10 и x=8 станут одной каплей, встретившись в х=12 через одну секунду. Капля, начинающие с позиции 0 ни с кем не смешается, поэтому выйдет как есть. Капли, начинающие с позиций x=5 и x=3 объединятся в одну каплю на позиции х=6 во время равное t=1 сек. Никакие другие капли им не встретятся до конца трубы, поэтому ответом к задаче будет 3. Рассмотрим иллюстрацию.</p><p>Цифры на каплях означают скорость:</p><figure><img src="https://media.tproger.ru/uploads/2018/07/droplets-puzzle-pic-2.jpg" alt="" /></figure><h2>Король Осьминог</h2><p>У короля Осминога есть слуги с шестью, семью и восемью ногами. Слуги с семью ногами всегда лгут, но слуги с 6 или 8 ногами всегда говорят правду.</p><p>Однажды встретились 4 слуги:</p><ol><li>Синий заметил: «Всего у нас 28 ног»;</li><li>Зеленый ответил: «У нас 27 ног»;</li><li>Желтый сказал: «У нас 26 ног»;</li><li>А красный заметил: «У нас 25 ног»;</li></ol><p>Слуга какого цвета сказал правду?</p>]]></content:encoded>
    </item>
    <item>
      <title>Плавание, башня и тролли — 3 задачки для разминки мозга</title>
      <link>https://tproger.ru/problems/sailing-tower-trolls</link>
      <comments>https://tproger.ru/problems/sailing-tower-trolls?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/sailing-tower-trolls</guid>
      <description><![CDATA[<p>Парусник проходит километр за две минуты с попутным ветром и за три минуты против него. Задача предлагает вычислить скорость лодки в полный штиль.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/sailing-tower-trolls">Плавание, башня и тролли — 3 задачки для разминки мозга</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Tue, 17 Jul 2018 13:50:24 GMT</pubDate>
      <content:encoded><![CDATA[<h3>Плавание против ветра</h3><p>Парусник проходит 1 километр за 2 минуты с попутным ветром и возвращается за 3 минуты против встречного. Насколько быстро будет плыть лодка эту дистанцию в штиль?</p><h3>Башня из коробок</h3><p>Дан набор n типов прямоугольных трехмерных ящиков. У i-того ящика высота hi, ширина wi и длина di (действительные числа). Вам необходимо построить башню максимальной высоты из ящиков, с учётом того, что ящик можно поставить на другой ящик только в том случае, если каждое из двух измерений основания верхнего ящика меньше соответствующих измерений нижнего ящика. Вы можете поворачивать ящики, так что любая сторона может выступать основанием.Также разрешено использовать любое количество ящиков одного типа.</p><p>Пример:</p><p>Вход: { {4, 6, 7}, {1, 2, 3}, {4, 5, 6}, {10, 12, 32} }</p><p>Выход: Максимальная высота башни — 60.</p><h3>Мосты и тролли</h3><p>Вы возвращаетесь из долгого путешествия и сейчас на завершающем этапе – на пути к дому, расположенному в конце долины. У вас с собой некоторое количество денег, которые вы привезли из путешествия. Между вами и вашим домом вам придётся пересечь 5 мостов, и, поскольку дело обстоит в выдуманной стране, под каждым мостом живёт тролль! Каждый тролль справедливо будет требовать плату за проход. Прежде чем пересечь мост, вам придётся отдать половину всех наличных крон, но поскольку тролли добрые — каждый даст сдачей одну крону.</p><p>Сколько крон вы должны взять с собой, что прийти к дому ровно с 2 кронами? Постарайтесь избежать лишних трат.</p>]]></content:encoded>
    </item>
    <item>
      <title>Задачи на логику: помогите таракану, посчитайте множители и побудьте диспетчером</title>
      <link>https://tproger.ru/problems/airplane-cockroach-numbers</link>
      <comments>https://tproger.ru/problems/airplane-cockroach-numbers?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/airplane-cockroach-numbers</guid>
      <description><![CDATA[<p>Подборка головоломок с ответами и разбором: за сколько часов таракан заберётся на десятиметровую стену, как посчитать множители и справиться с диспетчерской.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/airplane-cockroach-numbers">Задачи на логику: помогите таракану, посчитайте множители и побудьте диспетчером</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, 10 Jul 2018 14:23:41 GMT</pubDate>
      <content:encoded><![CDATA[<h3>Таракан на стене</h3><p>Маленький таракан карабкается по стене высотой 10 метров. Таракан начал путь с подножия стены. Каждый час он может проползти 1 метр в высоту и затем немедленно скатывается на ⅔ метра вниз. Сколько часов понадобится таракану, чтобы достичь вершины стены?</p><h3>Найдите количество простых множителей для каждого числа в диапазоне [0, K]</h3><p>Вход: N = 4<br />Выход : 0 1 1 1<br />Количество простых множителей для 1 — 0<br />Количество простых множителей для 2 — 1<br />Количество простых множителей для 3 — 1<br />Количество простых множителей для 4 — 1</p><p>Вход: 6<br />Выход: 0 1 1 1 1 2<br />Количество простых множителей для 1 — 0<br />Количество простых множителей для 2 — 1<br />Количество простых множителей для 3 — 1<br />Количество простых множителей для 4 — 1<br />Количество простых множителей для 5 — 1<br />Количество простых множителей для 6 — 2<br />2, 3 и 5 сами являются простыми. Для 4 единственный простой множитель — 2. Для 6 простых множителей два — 2 и 3.</p><h3>Минимальное количество самолётов</h3><p>На удаленном острове находится аэропорт. Этот аэропорт является базой для неограниченного количества одинаковых самолетов. Топливная емкость каждого самолета позволяет облететь ровно ½ земного шара вдоль большого круга. Самолеты имеет возможность дозаправки в воздухе без потери скорости и горючего. Хотя количество топлива тоже неограничено, едиственным его источником является этот остров.</p><p>Какое минимальное количество самолетов нужно, чтобы облететь земной шар, с учетом того, что каждый самолет должен безопасно вернуться в аэропорт?</p><p>Обратите внимание:</p><ol><li>Можно игнорировать затраты горючего на ускорение, потери при испарении топлива и пр.</li><li>Поскольку все самолеты должны вернуться в аэропорт — нельзя передать все топливо с одного самолета на другой.</li><li>Предполагается, что дозаправка — чрезвычайно быстрый процесс.</li></ol>]]></content:encoded>
    </item>
    <item>
      <title>Развиваем мышление: три простые задачи на логику</title>
      <link>https://tproger.ru/problems/cat-production-line-stairs</link>
      <comments>https://tproger.ru/problems/cat-production-line-stairs?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Андрей Приб]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/cat-production-line-stairs</guid>
      <description><![CDATA[<p>Три логические задачи для программистов: про производственную линию с удвоением выпуска (25% за 16 дней), поиск кота и подъём по ступенькам.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/cat-production-line-stairs">Развиваем мышление: три простые задачи на логику</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 29 Jun 2018 15:05:33 GMT</pubDate>
      <content:encoded><![CDATA[<h2>1. Экспериментальная производственная линия</h2><h3>Вопрос:</h3><p>Новая экспериментальная производственная линия тестируется перед запуском на заводе. Линия выпускает автомобильные двигатели. В ходе тестирования выпуск продукции на линии удваивался ежедневно, и задача по выпуску продукции была выполнена за 18 дней. Сколько дней занял выпуск 25% этой продукции?</p><h2>2. Найдите кота</h2><h3>Вопрос:</h3><p>Кот прячется в одной из пяти коробок. Коробки пронумерованы от одного до пяти и расположены в ряд по порядку. Каждую ночь пугливый кот прячется в соседнюю коробку, находящуюся рядом с коробкой, в которой он прятался в предыдущий день. Каждое утро, вы можете открыть только одну коробку, чтобы проверить, есть ли там кот. Можно ли с уверенностью сказать, найдётся ли кот? Как нужно играть в эту игру, чтобы вычислить кота?</p><h2>3. По ступенькам</h2><h3>Вопрос:</h3><p>Вы поднимаетесь по ступенькам. До вершины n шагов. За каждый шаг вы можете переступить 1 или 2 ступеньки. Сколько у Вас есть различных вариантов подъема на вершину?</p>]]></content:encoded>
    </item>
    <item>
      <title>Задача на работу со скобками</title>
      <link>https://tproger.ru/problems/working-with-brackets</link>
      <comments>https://tproger.ru/problems/working-with-brackets?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/working-with-brackets</guid>
      <description><![CDATA[<p>Разбор алгоритма, который выводит все правильно открытые и закрытые комбинации из n пар круглых скобок, с рекурсивным подходом и борьбой с дубликатами.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/working-with-brackets">Задача на работу со скобками</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sun, 17 Jun 2018 10:35:31 GMT</pubDate>
      <content:encoded><![CDATA[<h3>Условие задачи</h3><p>Реализуйте алгоритм для вывода всех корректных  (правильно открытых и закрытых) комбинаций из n пар круглых скобок.</p><p>Пример:</p><p>Ввод: 3<br />Вывод: ( ( () ) ), ( ()() ), ( () )(), ()( () ), ()()()</p><h3>Решение</h3><p>Первое, что приходит в голову, — использовать рекурсивный подход и строить ре­шение для f(n), добавляя пары круглых скобок в f(n-1). Мысль абсолютно здравая.</p><p>Рассмотрим решение для n = З:</p><p>Как получить это решение из решения для n = 2?</p><p>Можно вставить пары скобок в каждую существующую пару скобок, а также одну пару в начале строки. Другие возможные места для вставки скобок (например, в конце строки) сводятся к предыдущим случаям.</p><p>Итак, имеем следующее:</p><p>Постойте, в списке есть дубликаты! Строка () ( () ) встречается дважды! Если мы будем использовать данный подход, следует реализовать проверку дубли­катов перед добавлением строки в список.</p><p>Алгоритм работает, но не очень эффективно. Он тратит слишком много времени на дублирующиеся строки.</p><p>Проблемы дублирования можно избежать путем построения строки с нуля. В этом случае левые и правые скобки добавляются до тех пор, пока выражение остается корректным.</p><p>При каждом рекурсивном вызове мы получаем индекс определенного символа в строке. Теперь нужно выбрать скобку (левую или правую). Когда можно исполь­зовать левую скобку, а когда — правую?</p><ol><li>Левая скобка: пока не израсходованы все левые скобки, мы всегда можем вста­вить левую скобку.</li><li>Правая скобка: добавить правую скобку можно в том случае, если добавление не приведет к синтаксической ошибке. Когда появляется синтаксическая ошибка? Тогда, когда правых скобок больше, чем левых.</li></ol><p>Таким образом, нам нужно отслеживать количество открывающих и закрывающих скобок. Если в строку можно вставить левую скобку, добавляем ее и продолжаем рекурсию. Если правых скобок осталось больше, чем левых, то вставляем правую скобку и продолжаем рекурсию.</p><p>Поскольку мы добавляем левые и правые скобки для каждого индекса в строке, индексы не повторяются, и каждая строка гарантированно будет уникальной .</p>]]></content:encoded>
    </item>
    <item>
      <title>Посчитайте вероятность коллизии хеш-функции</title>
      <link>https://tproger.ru/problems/hash-collision-probability</link>
      <comments>https://tproger.ru/problems/hash-collision-probability?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Типичный программист]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/hash-collision-probability</guid>
      <description><![CDATA[<p>Задача на расчёт вероятности коллизии хеш-функции: h(x)=x mod p для n случайных чисел. Решение и условие 100% вероятности.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/hash-collision-probability">Посчитайте вероятность коллизии хеш-функции</a>»</p>]]></description>
      <category><![CDATA[Математика и теория вероятностей]]></category>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Fri, 08 Jun 2018 15:50:04 GMT</pubDate>
      <content:encoded><![CDATA[<p>Дана хеш-функция h(x) = x mod p (то есть остаток от целочисленного деления x на p). Для данного n посчитайте вероятность, что для каких-нибудь двух чисел из набора n случайных целых чисел хеш-функция совпадёт. Для каких значений n вероятность будет равна 100%?</p><h2>Решение</h2><p>Для начала заметим, что результатом функции могут быть только значения от 0 до p-1, а это означает, что мы можем заменить числа в наборе остатками от их деления на p. Теперь мы можем переформулировать задачу следующим образом: какова вероятность, что в наборе из n целых чисел c возможным значением от 0 до p-1 два числа совпадут. Для решения сначала посчитаем вероятность того, что они все будут различными. Обратимся к формулам комбинаторики: всего наборов может быть pⁿ (<a href="https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5#.D0.9A.D0.BE.D0.BB.D0.B8.D1.87.D0.B5.D1.81.D1.82.D0.B2.D0.BE_.D1.80.D0.B0.D0.B7.D0.BC.D0.B5.D1.89.D0.B5.D0.BD.D0.B8.D0.B9_.D1.81_.D0.BF.D0.BE.D0.B2.D1.82.D0.BE.D1.80.D0.B5.D0.BD.D0.B8.D1.8F.D0.BC.D0.B8">количество размещений с повторениями</a>), а наборов, где все числа будут различны (то есть благоприятных исходов), — p ⋅ (p-1) ⋅ (p-2) ⋅ … ⋅ (p-n+1) = p! / (p-n)! (<a href="https://ru.wikipedia.org/wiki/%D0%A0%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D0%B5">количество размещений</a>). Таким образом, вероятность того, что все числа в наборе будут различны — p! / (pⁿ ⋅ (p-n)!), а значит, вероятность того, что какие-нибудь два из них совпадут — 1 – p!/(pⁿ ⋅ (p-n)!). Осталось ответить на последний вопрос: для каких значений n вероятность станет равна 100%? Очевидно, что для n ≥ p+1. Тогда по <a href="https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF_%D0%94%D0%B8%D1%80%D0%B8%D1%85%D0%BB%D0%B5_%28%D0%BA%D0%BE%D0%BC%D0%B1%D0%B8%D0%BD%D0%B0%D1%82%D0%BE%D1%80%D0%B8%D0%BA%D0%B0%29">принципу Дирихле</a> хотя бы одному значению на интервале 0 .. p-1 будут соответствовать два числа из набора.</p><h2>Немного истории</h2><p>Эта задача является обобщением знаменитого <a href="https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%80%D0%B0%D0%B4%D0%BE%D0%BA%D1%81_%D0%B4%D0%BD%D0%B5%D0%B9_%D1%80%D0%BE%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D1%8F">парадокса дней рождения</a>, согласно которому в группе из 23 или более человек вероятность того, что день рождения у каких-нибудь двоих из них придется на один день, превышает 50%. Впрочем, парадоксом в классическом смысле этого слова это не является — как видите, мы только что вывели формулу вероятности и даже можем её проверить с помощью длинной арифметики в языке Java.  Если же вы все еще не верите, можете проверить это на своих знакомых, или, например, в комментариях к этой статье — просто напишите дату своего дня рождения.</p>]]></content:encoded>
    </item>
    <item>
      <title>Задача про обиженного короля и сотню звездочётов</title>
      <link>https://tproger.ru/problems/sad-king-riddle</link>
      <comments>https://tproger.ru/problems/sad-king-riddle?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Евгений Туренко]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/sad-king-riddle</guid>
      <description><![CDATA[<p>Король наказывает 100 звездочётов за опоздание, надевая им шляпы. Учёные угадывают цвет шляпы, глядя вперёд. Один рискует, 99 выживают по алгоритму чётности.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/sad-king-riddle">Задача про обиженного короля и сотню звездочётов</a>»</p>]]></description>
      <category><![CDATA[Головоломки]]></category>
      <category><![CDATA[Задачи повышенной сложности]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Wed, 23 May 2018 16:22:34 GMT</pubDate>
      <content:encoded><![CDATA[<p>Король после пира в своём дворце дал команду страже арестовать 100 звездочётов, так как они позже всех пришли на празднество и этим его обидели. Он был любителем поиграть и приказал звездочётам выстроиться в ряд, задумав надеть на их головы синие и красные шляпы. После построения им будет запрещено общаться, издавать какие-либо звуки, оглядываться и снимать шляпы. Однако разрешено смотреть на шляпы стоящих спереди и слушать ответы стоящих сзади.</p><p>Король будет подходить к каждому звездочёту и задавать один и тот же вопрос: «какого цвета твоя шляпа?»</p><p>Учёные должны ответить на вопрос короля только одним словом: «красная» или «синяя». Неверный ответ карается тихой смертью, а за верный даруется жизнь (но всё равно придётся стоять безмолвно).</p><p>Король доходчиво объяснил, что в случае нарушения правил будет казнена вся сотня участников его игры. После чего разрешил учёным посовещаться.</p><p>Какой алгоритм поможет спасти максимальное количество звездочётов?</p><p>Обратите внимание Шляпы на головы звездочётов надевает король, обход начинается с конца. Люди выстроены таким образом, что смотрят друг другу в затылок.</p><h2>Решение</h2><p>Звездочёты должны договориться и создать правило: первый отвечающий считает количество синих шляп перед собой, если это нечётное число, он говорит «синяя», если чётное — «красная». Следующий, видя количество и цвет шляп перед собой, может определить, какого цвета шляпа у него на голове (например, если синих все ещё нечётное количество, видимо, на нём красная). Можно вывести правило: если чётный номер говорит «синяя», то синих шляп нечётное число, если он говорит «красная», то красных шляп чётное число и т.д.</p><p>Таким образом гарантированно выживут 99 из 100. У первого шансы 50/50.</p><blockquote>Обратите внимание на другую нашу задачку о том же короле.</blockquote>]]></content:encoded>
    </item>
    <item>
      <title>Задача: годовой баланс</title>
      <link>https://tproger.ru/problems/annual-balance</link>
      <comments>https://tproger.ru/problems/annual-balance?scrollTo=tproger-comments</comments>
      <dc:creator><![CDATA[Никита Прияцелюк]]></dc:creator>
      <guid isPermaLink="true">https://tproger.ru/problems/annual-balance</guid>
      <description><![CDATA[<p>Практическая задача для программистов: найдите максимальную разность a-b перестановкой цифр. Учтите знаки и ведущий ноль.</p><p>— Читать дальше «<a rel="follow" href="https://tproger.ru/problems/annual-balance">Задача: годовой баланс</a>»</p>]]></description>
      <category><![CDATA[Задачи умеренной сложности]]></category>
      <category><![CDATA[Алгоритмы и структуры данных]]></category>
      <category><![CDATA[Сортировка и поиск]]></category>
      <category><![CDATA[Задачки]]></category>
      <slash:comments>0</slash:comments>
      <pubDate>Sat, 19 May 2018 12:30:50 GMT</pubDate>
      <content:encoded><![CDATA[<p>В конторе «Рога и Копыта» подходит время подведения годового баланса. В бухгалтерию поступили сведения о том, что, согласно документам, суммарный расход составил а рублей, a суммарный приход – b рублей. Поскольку с реальным положением дел эти цифры все равно не имеют ничего общего, бухгалтер решил реализовать следующую свою идею. Как известно, при наборе чисел на компьютере люди часто ошибаются и вводят цифры в неправильном порядке (например, если надо ввести 150, могут ввести 105). Поэтому бухгалтер хочет найти такой способ переставить цифры в числах a и b, чтобы в результате разность a−b (и, соответственно, количество денег, которые он положит к себе в карман), была максимальна, а в случае чего можно будет сослаться на ошибку секретаря. При этом нельзя забывать о знаке чисел и о том, что ноль не может быть первой цифрой числа, отличного от ноля. Напишите программу, которая поможет бухгалтеру.</p><p>Входные данные:</p><p>Входной файл INPUT.TXT содержит два целых числа a и b (-109 &lt; a,b &lt; 109).</p><p>Выходные данные:</p><p>В выходной файл OUTPUT.TXT выведите одно целое число – наибольшую разность чисел, первое из которых может быть получено перестановкой цифр a, а второе – перестановкой цифр b.</p><p>Примеры:</p><ol><li>Входные данные: 18 и 10; выходные: 71;</li><li>Входные данные: 1 и -23; выходные: 33.</li></ol><h3>Решение</h3><p>Для того, чтобы значение a−b было максимально, необходимо из a получить максимально возможное число, а из b, наоборот, определить наименьшее. Если число неотрицательно, то для получения минимума цифры сортируются в порядке возрастания, а при вычислении максимума, соответственно, в порядке убывания. Для отрицательных чисел ситуация с сортировкой цифр меняется с точностью до наоборот. Причем, нужно заметить, что при сортировке цифр по возрастанию нужно избежать момента, где пришлось бы поставить 0 на первое место (этого можно достичь, например, при сортировке пузырьком, если при сравнении первых двух соседних элементов не менять их в том случае, когда второй — это ноль).</p><p>Сортировку цифр в числе проще проводить, если преобразовать само число в строку, и работать с обычным массивом символов. Причем, знак  - не обязательно включать в этот массив. Отсортировав его, например пузырьком, можно сделать обратное преобразование строки в число. После нахождения максимального a и минимального b останется просто вывести значение a−b.</p><p>Для хранения чисел можно использовать обычный 4-байтовый целый тип (long или longint например), т.к. результат вычислений не может превзойти значения 1999999998 по абсолютной величине. Если бы ограничения на a и b были не до миллиарда, а до двух миллиардов, то итоговая разница могла бы достигать значения, большего 19 миллиардов, где пришлось бы использовать такие 8-байтовые целые типы как int64 или __int64.</p><p>Другие интересные задачи для программистов (и не только) вы можете посмотреть у нас <a href="https://tproger.ru/problems/">на сайте</a>.</p>]]></content:encoded>
    </item>
  </channel>
</rss>