Python: Увеличение двумерного списка в ФП-стиле
Python: Функции 2 сообщенияЭто испытание представляет собой задание повышенной сложности. Помните: в самом начале обучения программированию вполне нормально не уметь решать подобные задачи!
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
Для полного доступа к испытанию нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.