Python: логические головоломки для начинающих и продвинутых
Логические задачи: пример FizzBuzz
Наиболее эффективное решение задачи FizzBuzz на Python использует цикл с проверкой остатка от деления. Ключевой момент - проверка деления на 15 (общее кратное 3 и 5) первой, чтобы числа типа 30 выводили "FizzBuzz", а не "Fizz".
for i in range(1, 101):
if i % 15 == 0:
print("FizzBuzz")
elif i % 3 == 0:
print("Fizz")
elif i % 5 == 0:
print("Buzz")
else:
print(i)алгоритм решения задачи python (алгоритм решения задачи на python)
Этот код прост и понятен. Ошибки возникают при изменении порядка условий: если сначала проверять i % 3 == 0, то число 15 выведет "Fizz".
Как использовать тернарный оператор для компактной записи FizzBuzz?
for i in range(1, 101):
print("FizzBuzz" if i % 15 == 0 else "Fizz" if i % 3 == 0 else "Buzz" if i % 5 == 0 else i)базовые задачи python (базовые задачи python)
Проблема: вложенные тернарные операторы ухудшают читаемость. Частая ошибка - неверный порядок веток, при котором условие на 3 может перехватить числа, кратные 15. Решение: всегда ставить самое специфическое условие (на 15) первым.
Как породить список результатов через списковое включение?
result = ["FizzBuzz" if i % 15 == 0 else "Fizz" if i % 3 == 0 else "Buzz" if i % 5 == 0 else str(i) for i in range(1, 101)]
print("\n".join(result))
задачи для обучения python (задачи для обучения python)
Типичная ошибка: забыть преобразовать число в строку (str(i)), что вызывает TypeError при вызове join. Решение: всегда явно приводить к строке, если в списке есть строки.
Как применить словарь для отображения комбинаций делителей?
rules = {(1,0): "Fizz", (0,1): "Buzz", (1,1): "FizzBuzz"}
for i in range(1, 101):
key = (i % 3 == 0, i % 5 == 0)
print(rules.get(key, i))
Ошибка: ключ должен быть кортежем из булевых значений, но не путать с числами (True/False против 1/0). Решение: использовать bool или числа 0/1, но будьте последовательны. Если ключа нет, get вернёт i, что корректно для остальных чисел.
Дополнительные примеры логических задач
Проверка строки на палиндром
Задача: определить, является ли строка палиндромом, игнорируя пробелы, знаки препинания и регистр.
def is_palindrome(s):
cleaned = ''.join(c.lower() for c in s if c.isalnum())
return cleaned == cleaned[::-1]
print(is_palindrome("A man, a plan, a canal: Panama"))
True
Пояснение: избавляемся от лишних символов через isalnum() и приводим к нижнему регистру. Результат равен обратной строке.
Поиск простых чисел с помощью решета Эратосфена
Задача: найти все простые числа до заданного n.
def sieve(n):
primes = [True] * (n+1)
primes[0] = primes[1] = False
for i in range(2, int(n**0.5)+1):
if primes[i]:
for j in range(i*i, n+1, i):
primes[j] = False
return [i for i, is_p in enumerate(primes) if is_p]
print(sieve(30))
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
Пояснение: алгоритм помечает составные числа, начиная с квадрата простого. Сложность O(n log log n).
Определение анаграмм
Задача: проверить, являются ли две строки анаграммами (игнорируя пробелы и регистр).
from collections import Counter
def are_anagrams(s1, s2):
return Counter(s1.replace(" ", "").lower()) == Counter(s2.replace(" ", "").lower())
print(are_anagrams("Listen", "Silent"))
True
Используется Counter для подсчета символов. Ошибка: не учитывать пробелы - они искажают сравнение.
Задача Two Sum
Задача: найти индексы двух чисел в списке, сумма которых равна заданному числу.
def two_sum(nums, target):
seen = {}
for i, num in enumerate(nums):
complement = target - num
if complement in seen:
return [seen[complement], i]
seen[num] = i
return []
print(two_sum([2,7,11,15], 9))
[0, 1]
Пояснение: используем словарь для хранения пройденных чисел. Ошибка: если забыть вернуть список, можно вернуть None. Решение: всегда возвращать список, даже пустой.