5 заметок с тегом задачи

Задачи для программистов

Задача о средних зарплатах

Условие. В IT-компании «ЭВМ+» работает 70 человек. У каждого сотрудника плавающая зарплата: каждый месяц она случайно генерируется в диапазоне от 20 до 150 тысяч рублей. Список зарплат хранится в двумерном списке. Ваша задача узнать количество человек, получивших среднюю зарплату за год выше среднего. Итак, решаем:

from random import randint

# Список зарплат, количество работников и месяцев, диапазон зарплат
salaries = []
people = 70
months = 12
min_salary = 20000
max_salary = 150000

# Заполняем список зарплат случайными данными
for i in range(people):
    salaries.append([])
    for j in range(months):
        salaries[i].append(randint(min_salary, max_salary))


def people_average_salary(salaries_list):
    # Считаем среднюю зарплату за год
    average_salary = 0
    for i in range(len(salaries_list)):
        average_salary += sum(salaries_list[i])
    average_salary = int(average_salary / 12 / 70)

    # Считаем количество людей с з/п выше средней
    people_counter = 0
    for i in range(len(salaries_list)):
        if sum(salaries[i]) / 12 > average_salary:
            people_counter += 1

    print("Количество людей с з/п выше среднего:", people_counter, "человек.")


people_average_salary(salaries)
 Нет комментариев    79   4 мес   задачи

Задача о количестве пирогов

Мне подкинули вот такую задачку.

Петя любит печь пироги. У него есть его любимый рецепт и определённое количество ингредиентов. Сколько он сможет испечь любимых пирогов? Необходимо написать функцию, на вход которой подаётся два словаря: первый содержит пары {ингредиент: необходимое_количество_для_рецепта}, а второй — {ингредиент: доступное_количество}. Ингредиенты, не указанные во втором списке, отсутствуют.

Тест-кейсы:

cakes({"flour": 500, "sugar": 200, "eggs": 1}, {"flour": 1200, "sugar": 1000, "eggs": 5, "milk": 200}) # answer: 2
cakes({"apples": 2, "flour": 300, "milk": 100, "sugar": 100}, {"sugar": 500, "milk": 2000}) # answer: 0
cakes({"flour": 200, "sugar": 200, "eggs": 1}, {"sugar": 200, "flour": 200, "eggs": 1}) #answer: 1

Вот, как я решил задачу:

def cakes(recipe, ingredients):
    values = list()
    for recipe_key in recipe:
        if recipe_key in ingredients:
            values.append(ingredients[recipe_key] // recipe[recipe_key])
        else:
            return 0
    return min(values)

А вот, как её можно было решить. Этот вариант подсказал модератор чата. Минус, который я нашёл в таком решении: функция будет перебирать значения до самого конца, даже если сразу будет очевидно, что пирог мы не приготовим.

def cakes(recipe, ingredients):
    return min(ingredients.get(ingredient, 0) // recipe[ingredient] for ingredient in recipe)

Красиво, чисто, лаконично. Мне к такому ещё стремиться и стремиться)

 Нет комментариев    50   4 мес   задачи

Как в Python сравнить переменную с несколькими объектами?

Увидел я в чатике вот такой вопрос:

while(not x==«m» and not x==«f» and not x==«g» and not x==«h»): — Можно ли как-то короче записать такую строку?

Оказывается, можно. Делается это так:

while(not x in ("m", "f", "g", "h")):

Красиво, лаконично, просто :) Пёрфект!

 Нет комментариев    48   4 мес   задачи

Задача про количество пробелов

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

Задача «Loneliest character». Напишите функцию loneliest(), которая принимает строку вида «a b  z   p c» и возвращает массив символов, у которых больше всего пробелов справа и слева.

Примеры:

'a b  c' => ['b']
'a bcs           d k' => ['d']
'    a b  sc     p     t   k'  => ['p']
'a  b  c  de'  => ['b', 'c']
'     a  b  c de        '  => ['b']
'abc' => ['a', 'b', 'c']

Примечание:

  • Начальные и конечные пробелы в строке не считаем
  • Строки содержат только уникальные символы от a до z;
  • Порядок символов в массиве не имеет значения.

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

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

Я минут 20 ломал голову, думал уже бросит затею, но потихоньку родилась вот такая реализация. Она не идеальная (далеко), но с поставленной задачей справляется.

По ссылке можно посмотреть исходный код.

 Нет комментариев    34   4 мес   задачи

Форматирование текста в Python без импортов

В книге Виктора Трофимова о программировании игр есть раздел об игре «Казино 678». Для того, чтобы на экране было весело, автор предлагает раскрашивать текст в разные цвета. Для этого он подключает модуль ctypes и использует длинный страшный код.

windll.Kernel32.GetStdHandle.restype = c_ulong
h = windll.Kernel32.GetStdHandle(c_ulong(0xfffffff5))

def color(c)
    windll.Kernel32.SetConsoleTextAttribute(h, c)

В таком подходе три минуса:

  1. Сразу не разобраться, что написано в коде
  2. Подключаем модуль, который для других целей не нужен
  3. Кроме цвета нельзя добавить другое форматирование

Я решил использовать ASCII-цвета и форматирование. Это сразу решает три проблемы, указанные выше и делает программу гибкой. Для удобства написал функцию, которая принимает в себя аргументы с тегами и текстом, который будем оформлять.

Вот, что в итоге получилось. Забирайте код по ссылке, пользуйтесь, наслаждайтесь :)

 Нет комментариев    34   4 мес   задачи