✅ Решения заданий

⚠️ Рекомендация: попробуйте решить задания самостоятельно, прежде чем смотреть ответы. Решения — это последняя инстанция, когда собственные попытки исчерпаны.

⚡ Решения в двух словах

  • Задание 1 — range(height, 0, -1) + "*" * i.
  • Задание 2 — цикл с ord(char) > 127 и break.
  • Задание 3 — индексация + end="" или print(*text, sep=" ").
  • Задание 4 — счётчик баланса скобок.
  • Задания 5–13 — см. полные решения ниже.

Решение задания 1: Перевёрнутая лестница

📄 task_01_reverse_stairs.py
height = int(input("Введите высоту лестницы: "))

for i in range(height, 0, -1):
    print("*" * i)

Логика решения: range(height, 0, -1) генерирует числа от height до 1. Умножение строки "*" на число повторяет её нужное количество раз.

Решение задания 2: Проверка текста на ASCII

📄 task_02_ascii_check.py
text = input("Введите текст: ")

all_ascii = True
for char in text:
    if ord(char) > 127:
        all_ascii = False
        break

print("Все символы ASCII:", all_ascii)

Логика решения: флаг all_ascii остаётся истинным, пока не встретится символ с кодом больше 127. При первом же таком символе цикл прерывается — дальнейшая проверка не нужна.

💡 Современный вариант: print("Все символы ASCII:", text.isascii()) или print("Все символы ASCII:", all(ord(c) < 128 for c in text)).

Решение задания 3: Вывод строки с интервалами

📄 task_03_spaced_output.py
text = input("Введите строку: ")

for i in range(len(text)):
    if i == len(text) - 1:
        print(text[i], end="")
    else:
        print(text[i], end=" ")

Логика решения: для всех символов, кроме последнего, печатаем пробел после символа. Для последнего символа используем end="", чтобы не было завершающего пробела.

💡 Современный вариант: print(*text, sep=" ") — распаковка символов и параметр sep автоматически ставят одиночные пробелы между ними.

Решение задания 4: Проверка скобок

📄 task_04_parenthesis_balance.py
text = input("Введите строку: ")
balance = 0

for char in text:
    if char == "(":
        balance += 1
    elif char == ")":
        balance -= 1
    if balance < 0:
        break

print("Скобки расставлены правильно?", balance == 0)

Логика решения: открывающая скобка увеличивает баланс, закрывающая — уменьшает. Если баланс становится отрицательным, закрывающих скобок стало больше, чем открывающих, и дальнейший перебор не имеет смысла.

Решение задания 5: Поиск минимального символа

📄 task_05_min_char.py
text = input("Введите строку: ")
min_char = text[0]

for char in text:
    if ord(char) < ord(min_char):
        min_char = char

print("Минимальный символ:", min_char)

Логика решения: начинаем с первого символа как с минимального. На каждой итерации сравниваем код текущего символа с кодом найденного минимума и обновляем при необходимости.

Решение задания 6: Чётные и нечётные цифры

📄 task_06_even_odd_digits.py
number = input("Введите число: ")

even_digits = ""
odd_digits = ""

for digit in number:
    if int(digit) % 2 == 0:
        even_digits += digit
    else:
        odd_digits += digit

even_digits = even_digits if even_digits else "0"
odd_digits = odd_digits if odd_digits else "0"

print("Число из чётных цифр:", even_digits)
print("Число из нечётных цифр:", odd_digits)

Логика решения: цифры читаются как строка, чтобы перебирать посимвольно. Чётность проверяется через % 2. Если одна из групп осталась пустой, заменяем её на строку "0".

Решение задания 7: Строка из диапазона Unicode

📄 task_07_unicode_range.py
start = int(input("Введите начальный код: "))
end = int(input("Введите конечный код: "))

result = ""

for code in range(start, end + 1):
    result += chr(code)

print("Символы:", result)

Логика решения: диапазон range(start, end + 1) включает конечный код. Каждый код преобразуется в символ и добавляется к результату.

💡 Современный вариант: result = "".join(chr(code) for code in range(start, end + 1)) — быстрее и лаконичнее.

Решение задания 8: Длина слов

📄 task_08_word_lengths.py
text = input("Введите строку: ")
word = ""

for char in text:
    if char != " ":
        word += char
    else:
        if word:
            print(f"Слово: {word}, Длина: {len(word)}")
            word = ""

if word:
    print(f"Слово: {word}, Длина: {len(word)}")

Логика решения: собираем символы в word до тех пор, пока не встретится пробел. При пробеле выводим накопленное слово и сбрасываем word. После цикла отдельно обрабатываем последнее слово, если строка не заканчивается пробелом.

💡 Современный вариант: for word in text.split(): print(f"Слово: {word}, Длина: {len(word)}").

Решение задания 9: Текст палиндром

📄 task_09_palindrome.py
text = input("Введите строку: ")
filtered_text = ""

for char in text:
    if ("A" <= char <= "Z") or ("a" <= char <= "z") or \
       ("А" <= char <= "Я") or ("а" <= char <= "я"):
        if "A" <= char <= "Z":
            char = chr(ord(char) + 32)
        elif "А" <= char <= "Я":
            char = chr(ord(char) + 32)
        filtered_text += char

is_palindrome = filtered_text == filtered_text[::-1]
print("Палиндром?", is_palindrome)

Логика решения: оставляем только буквы английского и русского алфавитов, большие буквы приводим к строчным через сдвиг кода на 32. Затем сравниваем строку с её перевёрнутой копией.

💡 Современный вариант: filtered = "".join(char.lower() for char in text if char.isalpha()). Метод isalpha() принимает любые буквы, но для строгого соответствия исходной задаче лучше явно проверять диапазоны.

Решение задания 10: Все буквы алфавита

📄 task_10_pangram.py
text = input("Введите строку: ")
contains_all = True

for code in range(ord("A"), ord("Z") + 1):
    if chr(code) not in text and chr(code + 32) not in text:
        contains_all = False
        break

print("Содержит все буквы алфавита?", contains_all)

Логика решения: перебираем коды заглавных букв A..Z. Для каждой буквы проверяем, есть ли она в исходной строке в любом регистре. Если хотя бы одна буква отсутствует, ответ False.

💡 Современный вариант: print("Содержит все буквы алфавита?", set("abcdefghijklmnopqrstuvwxyz") <= set(text.lower())).

Решение задания 11: Сравнение строк на уникальность

📄 task_11_unique_compare.py
str1 = input("Введите первую строку: ")
str2 = input("Введите вторую строку: ")

unique1 = ""
unique2 = ""

for char in str1:
    if char not in unique1:
        unique1 += char

for char in str2:
    if char not in unique2:
        unique2 += char

if len(unique1) > len(unique2):
    print("Больше уникальных символов в строке:", str1)
elif len(unique1) < len(unique2):
    print("Больше уникальных символов в строке:", str2)
else:
    print("Количество уникальных символов одинаковое.")

Логика решения: в каждой строке накапливаем только те символы, которых ещё нет в строке уникальных символов. Затем сравниваем длины полученных строк.

💡 Современный вариант: len(set(str1)) и len(set(str2)) — множество автоматически хранит только уникальные элементы.

Решение задания 12: Счётчик символов

📄 task_12_char_counter.py
text = input("Введите строку: ")
letters = 0
digits = 0
others = 0

for char in text:
    if "A" <= char <= "Z" or "a" <= char <= "z":
        letters += 1
    elif "0" <= char <= "9":
        digits += 1
    else:
        others += 1

print("Букв:", letters)
print("Цифр:", digits)
print("Остальных символов:", others)

Логика решения: три аккумулятора-счётчика. Для каждого символа определяем его категорию по диапазону кодов и увеличиваем соответствующий счётчик.

💡 Современный вариант: используйте sum(1 for c in text if c.isalpha()), sum(c.isdigit() for c in text) и len(text) - letters - digits.

Решение задания 13: Одинаковый сдвиг

📄 task_13_same_shift.py
str1 = input("Введите первую строку: ")
str2 = input("Введите вторую строку: ")

flag = True
if len(str1) != len(str2):
    flag = False
else:
    for i in range(len(str1) - 1):
        if ord(str1[i]) - ord(str1[i + 1]) != ord(str2[i]) - ord(str2[i + 1]):
            flag = False
            break

print("Одинаковый сдвиг?", flag)

Логика решения: если длины строк различаются, ответ сразу False. Иначе сравниваем разности кодов соседних символов на одинаковых позициях. Если хотя бы одна разность не совпадает, ответ False.

💡 Современный вариант: flag = len(str1) == len(str2) and all(ord(str1[i]) - ord(str1[i + 1]) == ord(str2[i]) - ord(str2[i + 1]) for i in range(len(str1) - 1)).