Всем привет! Меня зовут Аргентум, или же Бронислав. На момент написания этой статьи мне 15 лет. Недавно я победил в школьном туре олимпиады по информатике, а скоро иду на муниципальный этап. По нынешней системе всероссийских олимпиад, программирование на олимпиаде по информатике начинается с 8 класса. У нас в школе олимпиада проводилась в формате онлайн, на платформе "Сириус". Для решения задач по программированию можно было использовать Python, C++, C#, Java, Pascal и некоторые другие. Интересно, что я потратил ~20 минут олимпиадного времени на подключение стабильного интернета. Я бы не сказал, что я гений программирования, второй Торвальдс, Страуструп, Столлман, Гвидо Ван Россум, Билл Гейтс, Цукерберг вместе взятые. Но я старался решать. За это время, пока велись расчеты победителя школьного тура, я решил изучить олимпиадное программирование и решение задач по программированию. И эти задачи могут касаться также других предметов - химии, физики, математики и так далее, т.к. я решил, что решая такие задачи, я также закрепляю пройденный материал других. Но почему я решил написать статью на тему олимпиадного программирования и решения проблем? Как по мне, любому человеку важно постоянно тренировать свои навыки, будь то спортсмен или программист. Решение задач закрепляет материал, заставляет человека думать и постоянно развиваться. Текста и кода будет много, постарался сделать как можно качественнее. Весь код и примеры я буду показывать преимущественно на Python. Наука и инжинерные вычисления Это целая библиотека, которую я начал разрабатывать в первой моей статье на хабре Общие задачи (в разработке, пока пустой) В репозитории есть директория tasks, в ней несколько директорий - base, medium, pro и модуль тестирования задач. В них я складываю задачи по сложности - легкие в base, средние в medium, сложные в pro. Также в репозитории есть файл olimp.py, через которого вы можете запустить решение той или иной задачи. Начнем с простого и легкого - определение относительной молекулярной массы вещества. Эту тему обычно изучают первой в курсе по химии в школе. Ниже я привел формулу для вычисления относительной молекулярной массы на примере NaCl (хлорид натрия, или же поваренная соль). Для того, чтобы реализовать такой калькулятор, нам потребуется парсер химических функций и сам класс элемента. Герои не ищут простых путей, мы создадим все с нуля Сверху мы импортировали нужные нам модули. Они нужны для парсинга формулы. Сверху мы создали класс элемента и словарь элементов (я добавил не все элементы, а только с водорода до натрия включительно). Если вам нужно больше, создавайте по шаблону Сверху конец кода, там мы вычисляем молекулярную массу формулы. При запуске мы вводим свою формулу... И вуаля, все работает как часы. Весь код вы можете просмотреть в моем репозитории. Пошли серьезные расчеты. Ниже вы видите, как рассчитать массовую долю водорода в формуле H2O (вода). Мы делим атомную массу элемента на молекулярную массу формулы и умножаем на 100%, и получаем проценты. В итоге - массовая доля водорода равна 11.1% Сама формула проста - делим атомную массу элемента и умножаем ее на количество элементов на относительную молекулярную массу всей формулы, после умножаем на 100% и получаем сколько процентов занимает элемент в формуле. Реализуем это на Python, в добавок к предыдущему коду Вот и все. При запуске этой функции мы получим массовую долю в процентах Из массива [2, 4, 19, 20, 40, 23, 45, 1000, 34, 23, 1, -3] найдите те, которые делятся на 2 без остатка и больше 5. На выходе должно получиться  Существует много разных решений, но наиболее рациональным будет следующее:  Найдите три ключа с самыми высокими значениями в словаре my_dict = {'a':500, 'b':5874, 'c': 560,'d':400, 'e':5874, 'f': 20}. На выходе должно получиться ['b', 'e', 'c']  Постройте числовой треугольник из 12 рядов, по типу: Выше представлено решение Большинство соревнований для программистов требует быстрой и качественной реализации решения проблемы. Программисты пытаются сделать код как можно короче, быстрее и тратить меньше ресурсов, жертвуя при этим читабельностью и стилем кода. Любой спортивный программист выбрал бы нечитабельное решение за 1 строчку кода, чем такое же, но за две. Принцип олимпиадного программирования - это участие в соревнованиях по решению нетривиальных алгоритмических задач. Программисту важно быстро решить задачу, не сделав ошибок (но их нет только в том коде, которого не существует). Жюри готовит описание задачи, формат входных и выходных данных, сколько максимум ресурсов может использовать программа. Для того чтобы стать профессионалом в олимпиадном программировании, вам надо решать не только задачи на программирование, но и простые, логические задачи. Также вам нужно будет изучить динамическое программирование -  способ решения сложных задач путём разбиения их на более простые подзадачи. Он применим к задачам с оптимальной подструктурой, которые выглядят как набор подзадач, сложность которых меньше исходной. В этом случае время вычислений по сравнению с «наивными» методами можно значительно сократить. Чтобы решить поставленную задачу, требуется решить отдельные части задачи (подзадачи), после чего объединить решения подзадач в одно общее решение. Часто многие из этих подзадач одинаковы. Олимпиадное программирование, решение задач - штука сложная, но полезная. Они заставляют думать и отметать неэффективные решения. Можно начинать с Python, но постепенно переходить на C++, если хотите участвовать в более сложных олимпиадах. Минимум для изучения в программировании - переменные, функции, операторы и логика, массивы, циклы, процедуры, классы, стандартные библиотеки. Сайты для решения задач по программированию: CodeWars (решение задач) Kaggle (исследовательские задачи, связанные с Data Science и МО) LeetCode (решение задач) Codeforces (решение задач) Exercism (решение задач) All Cups (решение задач) Задавайте вопросы и комментируйте, я рад услышать любое мнение. И конечно, ставьте плюсы!  Изучаю науку, историю, программирование