27/04/2024

Решаем простые задачи на Python

 

Решаем простые задачи на Python

Я решил чуть-чуть отвлечься от обучения вас PyQt, углублением в ООП и магическими методами. Я подумал, что не все на таком уровне познании python как я, так что сегодня мы порешаем простые задачи на python.

Начнем с простой задачи на палиндром.

Решаем простые задачи на Python Python, Задача, Программирование, IT, Длиннопост

#1 Запись input_string[::-1] означает, что мы переворачиваем строку. Например если мы ввели привет, то при применение [::-1] получим тевирп.

Решаем простые задачи на Python Python, Задача, Программирование, IT, Длиннопост

reversed() — переворачивает слово и возвращает список.

Решаем простые задачи на Python Python, Задача, Программирование, IT, Длиннопост

Переходим к следующей задаче, она часто задается в школе учителем информатике.

Решаем простые задачи на Python Python, Задача, Программирование, IT, Длиннопост

В этом случае мы в цикле пробегаемся по строке, превращаем каждый символ строки в число и суммируем их.

Решаем простые задачи на Python Python, Задача, Программирование, IT, Длиннопост

Выдергиваем каждый символ из строки и превращаем его в число и суммируем.

Решаем простые задачи на Python Python, Задача, Программирование, IT, Длиннопост

Переходим к тяжелой артиллерии.

Решаем простые задачи на Python Python, Задача, Программирование, IT, Длиннопост

считаем четные дни days_odd, days_even считаем нечетные дни. Далее проверяем, что четных дней больше чем нечетных и выводим в зависимости от этого YES или NO. В последней строке мы разделяем четные, нечетные дни и (YES или NO) пробелами.

Решаем простые задачи на Python Python, Задача, Программирование, IT, Длиннопост

Решаем последнюю задачу.

Решаем простые задачи на Python Python, Задача, Программирование, IT, Длиннопост

Во первых мы преобразуем строку в числа ( input().split() — разбивает строку и превращает её в список). Далее находим сумму всех чисел > 0. Потом идет проверка меньшее число стоит перед большим или после большего. После идет цикл, с помощью которого мы считаем произведение чисел от меньшего к большему или от большего к меньшему.

Решаем простые задачи на Python Python, Задача, Программирование, IT, Длиннопост

Найдены возможные дубликаты

Программирование на python

209 постов 7.1K подписчиков

Правила сообщества

Публиковать могут пользователи с любым рейтингом. Однако!

Приветствуется:

• уважение к читателям и авторам

• простота и информативность повествования

• тег python2 или python3, если актуально

• код публиковать в виде цитаты, либо ссылкой на специализированный сайт

Не рекомендуется:

• допускать оскорбления и провокации

• распространять вредоносное ПО

• просить решить вашу полноценную задачу за вас

Опять ты от незнания Python людей говнокоду учишь.

Зачем тут лишние list и lambda, если можно проще и изящнее?

Очевидно, что ты нихуя не знаешь как sum и map работают.

Иллюстрация к комментарию

Иллюстрация к комментарию

Я имхо проще эту задачу решил

s = list(filter(str.isalnum, s))

А где обработка пользовательского ввода? Вдруг юзер введёт «6р4ин37» ?

Вот объяснил так объяснил! Молодец! Все сразу так и поняли, что за магические map и lambda и как они работают.

Зачем нужен этот пост с неэффективными решениями алгоритмических задач? На олимпиадах и собесах такие решения не катят.

Здесь у тебя алгоритмически сложно. Можно проще.

Иллюстрация к комментарию

Иллюстрация к комментарию

Сгольфил немного: ‘sorted’ короче, но медленнее. Лучше, конечно же, так:

Иллюстрация к комментарию

> считаем четные дни days_odd, days_even считаем нечетные дни.

Опять какой-то жуткий говнокод.

Все же намного проще.

Иллюстрация к комментарию

Иллюстрация к комментарию

ТС, у тебя ошибка, odd —> нечетный, это когда остаток деления по модулю 2 равен 1, а у тебя наоборот.

Здесь я неправ, не прочитал до конца задание.

Иллюстрация к комментарию

1. С точки зрения good practice нужно курить PEP8 — https://www.python.org/dev/peps/pep-0008/ .

2. С точки зрения читабельности — как у вас в команде принято, желательно с учетом PEP8.

3. Оптимизация по скорости не имеет смысла, пока не доказано, что нужно оптимизировать. [premature optimization is the root of all evil (or at least most of it) in programming. — D.Knuth]. Но и пессимизировать на ровном месте не стоит — не нужно использовать «пузырек», если доступен «quicksort» (см. О-нотация).

В данном случае я просто выебнулся в стиле code golf.

В продакшн коде лучше использовать «if else», имхо. Из соображений читабельности.

> Цитатку утащу, часто на разных курсах в коментах под решениями происходят баталии оптимизаций

Что-то мне подсказывает, что ты еще нестарый программист.

Эта «цитатка» (про «premature optimization») — баян баянов с 1974 года.

И ты, возможно, упускаешь вторую часть про пессимизацию.

«When items are appended or inserted, the array of references is resized. Some cleverness is applied to improve the performance of appending items repeatedly; when the array must be grown, some extra space is allocated so the next few times don’t require an actual resize.» — https://docs.python.org/3/faq/design.html#how-are-lists-impl.

Эта заметка , конечно, и рядом не валялась с четким стандартом С++, но можно предположить, что поведение python list похоже на c++ std::vector (и замечу, что мало что иного можно придумать, а в комитете по стандартизации с++ довольно неглупые профи сидят).

И если питоновский list.append() примерно равен плюсовому std::vector::push_back(), то сложность добавления элемента через list.append() = амортизированная константа = O(1).

А вот добавление через +[element] синтактически порождает новый список с резервированием памяти, а затем еще один, суммарный. Итого O(N).

Насколько интерпретатор питона (и какой из? CPython не одинок), способен соптимизировать эту конструкцию, я не знаю.

Если эта конструкция встречается незначительное число раз, то можно и забить, особенно, если +[element] выглядит понятнее в контексте.

> Остужать пыл работяг, которые в изначально очень высокоуровневый Пайтон пытаются вклинить свои низкоуровневые велосипеды в надежде на большее быстродействие

А так ответ универсальный: всегда нужно профилировать.

> Тут даже не стоило растекаться мыслью по древу, очевидно, что встроенные методы быстрее и предпочтительнее нативных операций в большинстве ситуаций,

В формулировке этого вывода я вижу непонимание.

Мой скромный совет: если ты сам не программер, то не нужно искать на непрофильных площадках аргументов для споров с профи. И вообще не нужно.

Пусть профи делают свое дело.

> встроенные методы быстрее и предпочтительнее нативных операций

А даже если ты и описался, и имел в виду другое, то учти, что даже в CPython есть JIT (хоть и частично) через Numba, если, конечно, понимаешь о чем я.

Решения у тебя крутые, спасибо 👍

Пожалуйста! Даже немного неловко за нелестные слова в твой адрес. Держись!

Да ничего, бывает).Мне интересно сколько ты программируешь?

Зачем извращения с list(map(lambda x: f(x), . ))), если есть [f(x) for x in . ]. Короче, понятнее и быстрее (нет лишней лямбды). Это же не курс по ФП в питоне, да?

Блин, а практических задачах reverse вообще используется?

> Блин, а практических задачах reverse вообще используется?

Да. ТС по незнанию не упомянул важный нюанс.

a[::-1] —> создает копию списка, т.е для списка в N элементов, тебе потребуется выделить дополнительно памяти на N элементов, скопировать их в обратном порядке, и только потом использовать. А теперь пусть N = 100500000000.

reversed(a) —> позволяет итерироваться от конца к началу по оригинальному списку. Никаких дополнительных затрат на память и копирование.

Когда зашел в комменты под любым постом про IT:

Когда зашел в комменты под любым постом про IT:

Отзыв на Гитхаб

Отзыв на Гитхаб IT, IT юмор, Github, Программирование

Экспресс-курсы программирования: "да" или "нет" — и почему "нет"

Под моим комментарием получился неожиданный ажиотаж, из которого было очевидно, что народ сильно волнует тема курсов, обещающих быстрое вхождение в профессию разработчика и золотые горы для новоиспечённого гуру программирования. Народ требовал зрелищ и ненависти в адрес таких курсов — как говорится, получайте, что просили 🙂

Об авторе: разработчик и интервьюер Google с историей стажировок в Google, Microsoft и JetBrains, образование — матмех СПбГУ, кафедра системного программирования.

Чего ожидать от поста: очень личное мнение с точки зрения интервьюера топ IT-компании о том, что не так с быстрыми IT-курсами и о пробелах в знаниях их выпускников; советы в общих чертах, как же всё-таки войти в это самое АйТи. Пост ограничен профессией разработчика ПО ввиду жизненного опыта автора.

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

Что значит «войти в АйТи»?

В данном контексте под вхождением в профессию мы будем понимать трудоустройство на позицию Junior-разработчика или хотя бы на оплачиваемую стажировку, а также успех в соответствующей должности. Успех стажировки определяется предложением постоянной работы, успех Junior-разработчика — повышением до позиции Middle-разработчика.

Чего работодатели ждут от кандидатов?

Рекламируемая цель курсов — подготовить их клиентов к интервью и работе в качестве разработчика ПО, так что давайте определимся с требованиями к соискателям, до того как оценивать эффективность курсов в достижении этой цели.

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

Для осознания минимального необходимого набора навыков давайте посмотрим, что ожидается от кандидата на стажировку (оплачиваемую, и временами весьма неплохо):

* Умение более-менее свободно общаться на английском;

* Культура мысли — кандидат должен уметь разбить несложную задачу на элементарные составляющие, следовать базовым законам матлогики в своих рассуждениях, построить формальное доказательство утверждения;

* Базовые алгоритмы и структуры данных — кандидат должен уметь определить адекватные задаче алгоритм и организацию данных, оценить вычислительную сложность решения;

* Концепции программирования — например, динамическое программирование, принцип «разделяй и властвуй», жадные алгоритмы, графы;

* Низкоуровневые концепции — архитектура компьютера и операционные системы, виртуальная память, кэши и алгоритмы их организации, прерывания;

* Понимание организации сетей, сетевых протоколов;

* Понимание параллелльного программирования и многопоточности;

* Принципы трансляции программного кода в исполняемый код;

* Понимание концепций и синтаксиса какого-нибудь популярного языка программирования и умение применять их для решения учебной задачи;

* Владение терминами информатики и адекватное их применение в процессе решения задачи;

* Понимание принципов тестирования и их разумное применение к поставленной задаче;

* Знание принципов объектно-ориентированного программирования;

* Умение внятно превращать мысли в слова.

От стажёров не требуется опыт работы по специальности, но желательно иметь несколько небольших проектов: учебные проекты и курсовые, pet-projects, участие в опен-сорсе.

Junior-разработчик, помимо означенных выше качеств, должен также:

* Иметь опыт разработки на стажировке в крупной компании и/или в качестве разработчика в небольшой или не широко известной компании;

* Быть способным реализовать поставленную хорошо очерченную задачу без постоянного надсмотра со стороны более старших разработчиков (часто при наличии готового плана реализации, разработанного старшими товарищами);

* Уметь разбить небольшую систему на компоненты, спроектировать интерфесы между ними, облегчая тестирование, поддержку кода, расширение системы.

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

Отметим также, что это список на «общее программирование». Нишевые области, такие как геймдев, машинное обучение, мобильная разработка и т.д. добавят своих требований в общую кучу.

Учат ли этому «вайтишные» курсы?

После прочтения списка сверху в вас уже должны были зародиться сомнения в правдивости рекламы, обещающей освоение профессии за несколько месяцев, смотря лекции пару часов в неделю и тратя ещё пару часов на домашние задания.

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

И это не зря. Каждый пункт из списка — это как минимум полугодовой курс с объёмными теоретическими и практическими заданиями — и это не говоря уже о математической базе, необходимой для понимания многих из этих тем.

Так что как бы ни хотелось поверить молодым-активным-хипстеровато-выглядящим парням, завлекающих рассказами об очередях хэдхантеров к выпускникам их контор, увы, это такой же нонсенс, как и заявление, что к работе хирурга в элитной клинике можно подготовиться, зарезав пару кур в деревне.

Что же там тогда происходит?

Я посмотрела один широко рекламируемый курс по Java и попыталась систематизировать увиденное. Систематизировать оказалось немного. Плакала только горько, вина бутылку выпила.

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

И вот что я там увидела:

1. Материал подаётся в каше, запутанно. С первых же уроков используются сложные для новичка концепции («клиент-серверная архитектура»). Всё происходит в консоли (которую ученик, скорее всего, никогда до этого в глаза не видел). Сложные понятия вводятся напрямую, а не строятся на более простых (например, «String — это класс, length — это метод класса String» без объяснения, что такое класс и метод, да и хотя бы ООП в общих чертах, ну и как можно в принципе Джаву давать без хотя бы одной лекции по ООП — это отдельный вопрос). Сложилось ощущение, что основная цель — показать, какой лектор умный и сколько разных слов он знает, а не действительно помочь ученику разобраться.

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

2. Сложно о простом. Чтобы объяснить условные операторы, совсем не нужно заводить программу на 100 строк, которая не влезает на экран и где сам лектор путается в логике. Зачем? Или это ещё один приём, чтобы вызвать у ученика ощущение себя как бесполезной воши, неспособной ничего достичь без богоподобного лектора курса?

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

3. Отсутствие внятных практических заданий. В задании обычно даётся готовый код, где нужно поменять пару строк. Ученику не даются задания, которые действительно заставят его думать и осознанно применять новые концепции, чтобы решить задачу с нуля.

4. Даются разрозненные, бессистемные знания синтаксиса языка, но никаких объяснений принятых практик программирования, организации мысли, разбиения задачи на подзадачи, хорошего тона для определения границ классов и методов. Грубо говоря, научили, как писать буквы, а про грамматику, пунктуацию, и орфографию забыли, не говоря уже об изложении мысли и структурированию текстов.

5. Лектор читает уставшим, скучающим тоном. Всем своим видом он показывает, как низко он опускается, передавая светоч знаний всяким идиотам. Я не знаю, даёт ли этот курс возможность общаться с преподавателями, но лично мне было бы крайне стрёмно задавать вопросы из страха вызвать своей никчёмной глупостью пренебрежительное закатывание глаз или смешки. Фактически, новичка отталкивают от идеи общаться о программировании с коллегами и просить помощи у более опытных товарищах, что является самым важным навыком любого программиста, особенно новичков!

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

Подытожим результат. Если вам сильно повезёт с курсом, то, может быть, за три месяца вас по верхам научат синтаксису языка — без единой возможности понять, как этот синтаксис применять, без понимания, как написанный код фактически исполняется машиной, без систематического обучения базе и без внятных возможностей получить практический опыт.

Часто курсы фокусируются на изучении конкретной технологии вместо фундаментальных концепций. К примеру, курс с названием вроде «Программируем с помощью Django» или «Разработка приложений с MongoDB») — это мгновенный красный флаг. 99% такой курс состоит из заучивания 10-20 стандартных решений без понимания концепций фреймворка или механизмов его работы.

К чему это приводит?

Это приводит к миллионам резюме, написаным под копирку: «знания языков X, Y, фреймворков A, B, баз данных L, M» — внушительный список технологий при абсолютно пустом списке проектов и достижений. Это приводит к кандидатам, требующим позицию синьора, потому что ну вот же они обучались у такого великолепного преподавателя. Это приводит к печальным интервью, где человек со своими впечатляющими резюме и амбициями мнётся полчаса у доски, неспособный банально развернуть список.

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

Работодателю плевать, что вы приблизительно знаете синтаксис языка X или пару библиотек фреймворка A. Все эти языки и библиотеки меняются и уходят в небытие чаще, чем мгновение ока. Что действительно интересно крупным, стабильным игрокам IT-рынка — так это кандидаты, владеющими непоколебимыми понятиями информатики и способными адаптироваться к разным языкам, фреймворкам и технологиям, думать в реальном времени и эффективно общаться в другими разработчиками и с клиентами, генерировать идеи для решения задач — как проектирования, так и алгоритмических — а также организовывать работу (свою и других разработчиков) для выпуска качественного продукта в разумные сроки.

Вы скажете: «Да рядовому программисту это всё не нужно! За мои over 9000 лет в разработке мне никогда не приходилось писать сортировку самому!» Это может быть правдой.

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

Во-первых, без этих знаний в настоящее время новичок банально не пройдёт собеседование в более-менее приличной конторе, так что какая разница, что вам там приходилось или не приходилось.

Во-вторых, даже если самому алгоритмы писать не придётся, то их почти наверняка придётся использовать в качестве библиотек, и, например, правильный выбор между std::unordered_map и std::map — это именно тот случай, где базовые знания подчёркивают разницу между квалифицированным специалистом и «ненуачо компилица жи роботает жи».

Наконец, если человек не обладает банальной профессиональной грамотностью, мы не можем ожидать, что он будет эффективен, когда нужно будет вынуть мозг через ухо и решить что-то нестандартное, что не вкладывается в типовые трафареты очередного фреймворка-однодневки.

Любая инновация стоит на плечах гигантов. Выпускники курсов — увы! — стоят максимум на шаткой табуретке посреди болотной топи.

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

Если не курсы, тогда что?

Ох, боюсь навлечь на себя праведный гнев вайтишников. Но была не была — есть в жизни вещи поважнее рейтинга на Пикабу 🙂

Моё профессиональное мнение состоит в том, что нацеленную программу образования превзойти практически невозможно. Адекватный факультет/кафедра пройдутся ровно по списку навыков, обозначенному выше, но мякотка даже не в этом, а в том что у топ-факультетов имеются связи в хороших компаниях, благодаря чему они могут рекомендовать вас на стажировки (которые, кстати, обычно тоже предлагаются только студентам, а не любым новичкам).

На отдельных кафедрах есть культура летних школ — неоплачиваемых (или оплачиваемых по грантам) проектов, предназначенных исключительно для предоставления среды студентам, где они могут набраться практического опыта, набить шишки перед более серьёзными соисканиями и заполнить своё первое резюме ссылками на реальные проекты.

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

Значит ли это, что тёплого местечка в Гугле вам не видать, не просидев предварительно 4-6 лет за партой в пыльном универе? Отнюдь нет.

Индустрия жадна до (высококлассных) специалистов, и никому нет дела, каким образом навык был достигнут. Но навык при этом должен быть. Самостоятельно достичь его можно, но, интуитивно, это будет сложнее, дольше, и потребует гораздо большей дисциплины и самоотдачи, чем обучение на кафедре.

И это не говоря уже о том, что при самообучении у вас не будет доступа к опытным специалистам, которым можно задавать разные дурацкие вопросы, а так же к связям кафедры, так что придётся позиции искать самостоятельно и без рекомендательных писем, что на практике часто означает, что рекрутер просто выбросит ваше резюме, если в нём нет строчки об обучении по специальности в адекватном вузе.

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

Как промежуточный вариант между самообразованием и полноценной вышкой существуют «школы курсов». Они не дают официальных дипломов об образовании, но они полностью бесплатны, преподают в них (да, снова связи. ) лучшие преподаватели вузов (знаю некоторых лично, потому что они и в СПбГУ преподают) и инженеры приличных компаний (Яндекс, JetBrains), а часть обучения составляют обязательные практические проекты.

В чём подвох? Чтобы поступить, нужно сдать экзамен на математику уровня примерно второго курса столичного вуза.

Я в курсе двух таких школ, которые к тому же сотрудничают между собой: Школа Анализа Данных (упор на машинное обучение) и Computer Science Center (более широкий спектр предметов). Готовьтесь потратить 2-3 года на обучение в любой из них (сравните с 4 годами полноценного бакалавриата, которые включают в себя также и математику, требуемую обеими школами на входе).

Я всё еще не знаю, как мне быть — можно поподробнее?

Экспресс-курсы программирования: "да" или "нет" - и почему "нет" Программирование, IT, Мнение, Курсы программирования, Гифка, Длиннопост

Можно! Вместить в один пост всю информацию о том, как освоить профессию, да ещё и требующую глубоких теоретических и приладных знаний, заведомо невозможно. Если вам пришлась по душе эта статья, вас могут заинтересовать следующие темы:

* Разделы математики, полезные разработчику ПО (со списком литературы);

* Темы информатики, с которыми должен быть знаком любой программист (со списком литературы);

* Список алгоритмов и структур данных, наиболее полезных на интервью и в разработке;

* Как выглядит типичный процесс собеседования на программиста в топ западные компании;

* Составляем резюме грамотно;

* Один день из жизни разработчика ПО, или что вы не знали о профессии программиста.

Голосуйте за наиболее интересные темы в комментариях или предлагайте свои, и не стесняйтесь задавать вопросы 🙂 Будет достаточно голосов — напишу больше статей 🙂

Сталин и ИТ

Сталин и ИТ

Самые милые конспекты по Git

Честно стырено с просторов твитора.

Самые милые конспекты по Git IT, Git, Программирование, Учеба, Котята, Кот, Длиннопост

Самые милые конспекты по Git IT, Git, Программирование, Учеба, Котята, Кот, Длиннопост

Самые милые конспекты по Git IT, Git, Программирование, Учеба, Котята, Кот, Длиннопост

Самые милые конспекты по Git IT, Git, Программирование, Учеба, Котята, Кот, Длиннопост

Программистский спринт

Программистский спринт Программирование, IT, Юмор, IT юмор, Картинки, Спринт, Работа, Длиннопост

Программистский спринт Программирование, IT, Юмор, IT юмор, Картинки, Спринт, Работа, Длиннопост

Программистский спринт Программирование, IT, Юмор, IT юмор, Картинки, Спринт, Работа, Длиннопост

YAGNI, или Оно вам нужно?!

YAGNI, или Оно вам нужно?! Программирование, IT, Юмор, IT юмор, Картинки, Михаил Булгаков, Собачье сердце, Длиннопост

YAGNI, или Оно вам нужно?! Программирование, IT, Юмор, IT юмор, Картинки, Михаил Булгаков, Собачье сердце, Длиннопост

YAGNI, или Оно вам нужно?! Программирование, IT, Юмор, IT юмор, Картинки, Михаил Булгаков, Собачье сердце, Длиннопост

YAGNI, или Оно вам нужно?! Программирование, IT, Юмор, IT юмор, Картинки, Михаил Булгаков, Собачье сердце, Длиннопост

Немного не то ожидала

Немного не то ожидала IT, IT юмор, Программирование, Юмор, Ожидание и реальность, Облом

Как насчёт монеток?

Значит так, посмотрел давеча видео Кевина, того, который Vsauce, про «наггетсовый» алгоритм. Ну и вот там, среди всего прочего, было то, что набор монеток мелочи, ну то есть существующие номиналы монеток — это не самое оптимальное решение, чисто математически. И вот тут я сразу понял, что обязательно заморочусь насчёт кое-какого дела. Сейчас объясню в чём суть:

В практически каждой стране на данный момент времени используется такое важное изобретение как деньги. И очень много где заведено, помимо этого, основную денежную единицу дробить на более мелкие. Например, рубль — это сто копеек, доллар — сто центов и так далее. Не знаю, встречается ли деление денежной единицы не на сотню, а на десять, к примеру, частей, но суть в том, что явление разменной мелочи достаточно знакомо нам всем.

В моей стране (Беларусь) мелочь отчеканена монетами, номиналом в 1, 2, 5, 10, 20 и 50 копеек. То есть всего шесть номиналов. Разные номиналы, понятное дело, сделаны для того, чтобы суммы, размером от 1 до 99 копеек было удобно отсчитывать небольшим количеством монет. Например, нужно вам 73 копейки — хорошо: это 1х(50) + 1х(20) + 1х(2) + 1х(1), то есть всего четыре монетки, если у вас есть монетки нужных номиналов под рукой.

Практично, не так ли? Очень удобно отсчитывать любую сумму. На практике. Человеку. Но чисто математически: это ли оптимальные номиналы монеток? То есть правда ли, что при наборе суммы от 1 до 99 копеек с таким набором монет из шести номиналов, получается так, что в среднем используется меньше всего монеток? И. Нет!

А как узнать, каков оптимальный набор монеток, тогда? Ну, будь я математиком, я бы точно полез куда-нибудь в дебри матанализа и накопал кучу всего и всякого полезного, что точно, основательно и однозначно давало бы ответ на данный вопрос.

Но. Из математика может получиться программист, а вот из программиста математик — уже никогда. В конце концов когда можно вычислить ответ просто брутфорсом даже на своём унылом ПК, кому пойдёт в голову лезть в матанализ?

Вот он, тот звёздный час, когда я могу сказать, что быть сишарпилой для таких дел куда лучше, чем являться даже самым искусным питонье. Потому что скорость тут как раз имеет значение.

В общем, в код вдаваться сильно не буду. Комп просто генерирует все возможные комбинации номиналов монеток, потом для каждой комбинации оптимальным образом разменивает все суммы от 1 до 99, запоминая, сколько монеток требуется для каждой суммы. Ну то есть сначала он разменивает 1 — получается нужна одна монетка с номиналом 1, потом 2 — тут уже зависит от того, какие номиналы есть в текущем наборе: либо две монеты по 1, либо одна номиналом 2, если такая в наборе есть. Дальше, в процессе своего титанического труда, которым он занимается прямо сейчас, пока я пишу этот пост, он вычисляет среднее арифметическое от того, сколько монеток требовалось ему для размена каждой суммы. У какого набора монеток такое среднее арифметическое меньше, тот, очевидно, и есть самый лучший с точки зрения экономии монеток из всех.

Разумеется, всё состряпано на коленке и код оптимальным не назовёшь, но он работает и делает своё дело, что и нужно.

Как насчёт монеток? Программирование, Математика, IT, Длиннопост

В окне консоли первые шесть чисел — номиналы монеток в наборе, а самое правое — среднее количество монеток, которое нужно для размена всех сумм от 1 до 99 таким набором.

И если для четырёх номиналов программа высчитывает результат практически мгновенно, то для шести. Несколько часов. Разумеется, по сути считается на один номинал меньше, потому что самая младшая монетка всегда должна иметь достоинство в 1 — иным набором любую сумму просто не разменять.

Итааак, дамы и господа, леди и джентльмены!

Я рад вам сообщить, что если бы все люди умели считать как чёртовы машины и некруглые большие числа никого не смущали, то номиналы монеток лучше всего было бы сделать такими:

Как насчёт монеток? Программирование, Математика, IT, Длиннопост

(1), (2), (5), (11), (25), (62) для шести номиналов. Близко к тому, что есть, но не то же самое, однако. При этом вы бы тратили в среднем 3.16 монеток, для того, чтобы отсчитывать ими мелкие суммы.
А вот при наборе из шести номиналов (1), (2), (5), (10), (20), (50) этот показатель составляет аж 3.43 !

Желаете отчеканить всего 5 номиналов монет для казны, сударь?
Ваш математически лучший выбор:
(1), (3), (7), (16), (40) и тогда в среднем нужно будет 3.49 монетки для того, чтобы составить нужную сумму мелочи.

4 номинала? Ну, тогда (1), (3), (11), (38) конечно! Ведь именно такой набор требует в среднем лучшие 4.14 монетки для размена мелочи!

А в категории три номинала побеждает (1), (5), (22) со средним количеством необходимых монет в 5.31

Сердечно поздравляю всех, кто дочитал до этого места (именно дочитал, а не доскроллил). Теперь вы знаете забавную информацию, добытую парой часов процессорного времени. И я очень надеюсь, что это знание вас хоть немного развлечёт, как развлекло меня.

Тестовое задание Python программист

Мне позвонил HR из ИТ-компании ООО «ТП Лаб» в Санкт-Петербурге, которая занимается разработкой ПО на Python и предложила пройти тестовое задание. Я его выполнил, все оформил как требовалось, но после отправки результата даже не получил никакого фидбека, ситуация очень стрёмная, поэтому передам привет Алене Ермакович и опубликую само задание и результат, который у меня получился.

Наверняка моя статья будет хорошо индексироваться в поисковых системах и всем, кто планирует устроится в эту компанию, советую не тратить время на выполнение тестовых заданий, останетесь без ответа — как я.

Задание я получил в пятницу вечером и прислал ответ в субботу. Для меня не понятно, почему так произошло, может попал под ковровую бомбардировку эйчара, которая всем налево и направо раздавала задания

Мне позвонил HR из ИТ-компании ООО "ТП Лаб" в Санкт-Петербурге, которая занимается разработкой ПО на Python и предложила пройти тестовое задание. Я его выполнил, все оформил как требовалось, но после отправки результата даже не получил никакого фидбека, ситуация очень стрёмная, поэтому передам привет Алене Ермакович и опубликую само задание и результат, который у меня получился.

Ответ к данному заданию я опубликую в конце статьи, но если тебе хочется попрактиковаться в решение тестовых заданий при прохождение собеседований — попробуй сделать сам, это не сложно, но может отнять несколько часов.

Тестовое задание

Написать клон телеграм-бота @vsratoslavbot с минимальным функционалом.

Бот получает от пользователя картинку, выбирает из файла-сборника случайную подпись и рисует её на картинке пользователя. Полученную картинку бот отправляет пользователю и предлагает ей поделиться.

Технические требования

  • Реализовать на языке Python.
  • Все настройки бот должен брать из переменных окружения.
  • Картинки пользователя бот должен сохранять в папку (путь до неё настраивается) с именем в формате «YYYY-MM-DD_HH:mm_<user id>.jpg».

YYYY — год, четыре знака,

MM — месяц, два знака,

DD — день, два знака,

HH — часы, 24 часовой формат, два знака,

mm — минуты, два знака,

<user id> — id пользователя, приславшего фото

  • Если пользователь согласен поделиться картинкой — бот репостит её в канал, который указан в настройках бота.
  • Файл-сборник имеет текстовый формат, каждая фраза занимает отдельную строку. Путь до файла-сборника указывается в настройках.

Критерии оценивания

За каждый пункт начисляется один балл, максимум 4.

  • Бот выполняет заявленные функции.
  • Код оформлен в репозиторий на Github/Bitbucket.
  • Бот использует как можно меньше внешних зависимостей, необходимые зависимости указаны в requirements.txt
  • Для бота написан Dockerfile для сборки образа.

Бонус-баллы

За каждый пункт начисляется один балл, максимум 4.

  • Зависимости в requirements.txt указаны с версиями.
  • Есть юнит-тесты.
  • Для бота есть инструкция по запуску в README.md проекта.
  • Подписи к картинкам сделаны шрифтом Lobster.

Мне на выполнения этого задания понадобилось около 6 часов, а сколько потратишь ты?

Прочитайте другие статьи посвященные языку программирования Python.

GeekUniversity — обучение до уровня Middle с гарантированным трудоустройством.

Источник https://pikabu.ru/story/reshaem_prostyie_zadachi_na_python_7771335

Источник https://egorovegor.ru/testovoe-zadanie-dlya-backend-python-programmista/

Источник

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *