Задача 1: Scramble
Описание: Завершите функцию scramble, которая возвращает True, если символы первой строки можно переставить так, чтобы получить вторую строку, иначе возвращает False. Используются только строчные буквы, без знаков препинания и цифр. Необходимо учитывать производительность.
Решение: Используется множество. Функция проверяет, достаточно ли в первой строке (s1) символов каждого типа, присутствующих во второй строке (s2). Если количество символов в s1 меньше, чем в s2 хотя бы для одного типа, функция возвращает False. В противном случае возвращается True.
def scramble(s1, s2):
s2_set = set(s2)
for char in s2_set:
if s1.count(char) < s2.count(char):
return False
return True
Задача 2: Greed is Good
Описание: «Жадность» — игра в кости с пятью шестигранными костями. Задача — подсчет очков броска по правилам: три единицы — 1000 очков, три шестерки — 600, три пятерки — 500, три четверки — 400, три тройки — 300. Одна пятерка — 50 очков, одна единица — 100 очков. Кубик учитывается только один раз в каждом броске (как часть тройки или отдельно).
Решение: Функция суммирует очки. Перебираются грани кубика (от 1 до 6). k считает количество выпадений каждой грани. Если k ≥ 3, добавляются очки за тройку. Затем k уменьшается на 3. Если остаются одиночные единицы или пятерки, добавляются соответствующие очки.
def score(dice):
result = 0
for d in range(1, 7):
k = dice.count(d)
if k >= 3:
result += 1000 if d == 1 else d * 100
k -= 3
if d == 1 and k == 1:
result += 100
elif d == 5 and k == 1:
result += 50
return result
Задача 3: Training Zeroes of N!
Описание: Напишите программу, вычисляющую количество нулей в конце факториала заданного числа. Прямое вычисление факториала запрещено.
Решение: Количество нулей определяется количеством пятерок в разложении числа на простые множители. Функция перебирает числа от 5 до N с шагом 5, суммируя количество пятерок в каждом.
def zeros(n):
k = 0
i = 5
while n // i >= 1:
k += n // i
i *= 5
return k
Задача 4: Perimeter of squares in a rectangle
Описание: На рисунке квадраты со сторонами 1, 1, 2, 3, 5, 8. Сумма периметров — 4 * (1 + 1 + 2 + 3 + 5 + 8) = 80. Найдите сумму периметров всех квадратов многоугольника, когда имеется N+1 квадратов, расположенных аналогично.
Решение: Стороны квадратов — числа Фибоначчи. Функция генерирует последовательность Фибоначчи до N-го числа и вычисляет сумму периметров.
def perimeter(n):
a, b = 1, 1
sum_fib = 2
while n > 1:
a, b = b, a + b
sum_fib += b
n -= 1
return 4 * sum_fib
Решенные задачи демонстрируют различные подходы к решению задач на Codewars: использование множеств, условных операторов и математических закономерностей. Решение задач 5 kyu уровня сложности помогает подготовиться к задачам более высокого уровня.