✅ Решения

⚡ Кратко

Сначала сравните своё решение с идеей, а не с каждой строкой.

Если код отличается, проверьте поведение на тех же входных данных.

Решение считается хорошим, если оно понятно, проходит пример и не зависит от случайного порядка вывода.

Топ-3 ошибки: путать ссылку и копию; ожидать порядок там, где его нет; усложнять выражение, когда обычный цикл читается лучше.

Решение 1. Номер покупки

products = ["Bread", "Butter", "Cheese", "Milk", "Eggs"]
target = "Milk"

if target in products:
    print(f'Товар "{target}" в списке покупок:', products.index(target) + 1)
else:
    print(f'Товара "{target}" нет в списке')

Проверка in защищает от ValueError в index().

Решение 2. Список уникальных слов

text = "Python is a great programming language. Python is popular and powerful."
words = [word.strip(".").lower() for word in text.split()]
unique_words = sorted(set(words))
print("Количество уникальных слов:", len(unique_words))
print("Уникальные слова:", unique_words)

set убирает повторы, sorted возвращает алфавитный порядок.

Решение 3. Перемещение в конец

numbers = [4, 7, 1, 6, 3, 8, 2]
first_part = [number for number in numbers if number >= 5]
second_part = [number for number in numbers if number < 5]
print("Перемещённые элементы:", first_part + second_part)

Два прохода сохраняют относительный порядок внутри каждой группы.

Решение 4. Суммы пар

numbers = [3, 5, 9]
pair_sums = set()

for i in range(len(numbers)):
    for j in range(i + 1, len(numbers)):
        pair_sums.add(numbers[i] + numbers[j])

print("Суммы пар чисел по убыванию:", sorted(pair_sums, reverse=True))

set убирает одинаковые суммы.

Решение 5. Упаковка товаров по ящикам

weights = [3, 4, 9, 8, 2, 5, 3, 6, 1, 7, 1, 1, 2, 4]
limit = 10
boxes = []

for weight in sorted(weights, reverse=True):
    for box in boxes:
        if sum(box) + weight <= limit:
            box.append(weight)
            break
    else:
        boxes.append([weight])

for index, box in enumerate(boxes, start=1):
    print(f"Ящик {index}: {box}")

Это жадная стратегия first-fit decreasing. Она хорошо подходит для учебной задачи, но не доказывает оптимальность для всех входов.

Решение 6. Приходы и расходы

transactions = [(100, -50, -30), (-200, 100, 50), (300, -100, -50), (-50, -50), (200, -300, 150)]

for index in range(len(transactions) - 1, -1, -1):
    if sum(transactions[index]) < 0:
        del transactions[index]

print("Обновлённый список:", transactions)

Проход с конца позволяет менять исходный список без смещения необработанных индексов.

Решение 7. Последовательность цифр

my_list = ["3", "6", "3", "2", "9", "3", "9", "4", "3", "9", "0"]
sequence = "943"
position = 0

for digit in my_list:
    if position < len(sequence) and digit == sequence[position]:
        position += 1

print("Результат:", position == len(sequence))

Индекс position показывает, сколько символов последовательности уже найдено.

Решение 8. Зашифрованное послание

message = (
    "92 114 120 35 102 100 113 35 103 114 35 108 119 36 35 92 114 120 35 "
    "100 117 104 35 106 117 104 100 119 35 100 113 103 35 76 35 101 104 "
    "111 108 104 121 104 35 108 113 35 124 114 120 36"
)
shift = 3
decoded = "".join(chr(int(code) - shift) for code in message.split())
print("Сдвиг:", shift)
print("Послание:", decoded)

Каждое число — код символа после сдвига. Вычитаем 3 и собираем строку.