Python Codewars: Решение задачи Scramble (5 kyu)

Задача 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 уровня сложности помогает подготовиться к задачам более высокого уровня.

Что будем искать? Например,программа