-10%
-40%
Профессии со скидками и подарки от Хекслета
Покупайте себе, дарите друзьям!

Python: Увеличение двумерного списка в ФП-стиле

Python: Функции 5 сообщений
Обновлено: 14 сент., 02:04
158
Студентов
65%
Завершения

Это испытание представляет собой задание повышенной сложности. Помните: в самом начале обучения программированию вполне нормально не уметь решать подобные задачи!

src/solution.py

В этом испытании вам предстоит решить ту же проблему, что вы могли решать в испытании "Увеличение двумерного списка" (вам стоит это проделать, если вы ещё не проходили то испытание).

Задача заключается в том, что нужно реализовать функцию enlarge(), которая увеличивает переданное "изображение" в два раза: каждый "пиксель" удваивается по горизонтали и вертикали. Изображением служит список строк, а пиксели в нём — символы строк. Получившаяся функция должна работать так:

glider = [' * ', '  *', '***']
def display(image):
    for line in image:
        print(line)

display(glider)
# =>  *
# =>   *
# => ***
display(enlarge(glider))
# =>   **
# =>   **
# =>     **
# =>     **
# => ******
# => ******

Сама задача не отличается от задачи в оригинальном упражнении, однако в этот раз вам предстоит решить проблему в функциональном стиле!

Вы не должны использовать изменяемые структуры данных, переменные, циклы и даже рекурсию. Всё, что вы можете делать, это определять функции через композицию существующих!

Средства для решения задачи

Вам даны функции-комбинаторы curry() и compose(), а так же две простые функции pair() и dup().

Функция curry() превращает функцию двух аргументов в функцию от первого, возвращающую функцию от второго (такая операция называется каррированием):

from operator import add
add(5, 6)
# 11
f = curry(add)
f(5)(6)
# 11
add5 = curry(add)(5)
add5(10)
# 15
from functools import reduce
concat = curry(reduce)(add)
concat(["Hello", ", ", "World!"])
# "Hello, World!"

Функция compose() берёт одну функцию, затем другую и возвращает их композицию:

from operator import add, mul
add5 = curry(add)(5)
mul3 = curry(mul)(3)
f = compose(add5)(mul3)   # f(x) == add5(mul3(x))
g = compose(mul3)(add5)   # f(x) == mul3(add5(x))
f(1)  # 5 + (3 * 1)
# 8
g(1)  # 3 * (5 + 1)
# 18

Оставшиеся две функции элементарны:

pair = lambda x: [x, x]
dup = lambda x: x + x

Ваша задача описать функцию enlarge(), через указанные функции и, возможно, map/filter/reduce. Имейте в виду, что задачу можно решить с использованием одних лишь упомянутых выше функций, и не потребуются даже lambda-функции!

Кстати, функция display() из первого примера может быть определена и так:

display = compose(print)('\n'.join)
display(['foo', 'bar'])
# => foo
# => bar

Для полного доступа к испытанию нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
1000
упражнений
2000+
часов теории
3200
тестов