56 lines
1009 B
Python
56 lines
1009 B
Python
from functools import (reduce)
|
|
|
|
|
|
def main():
|
|
for xs in transpose(
|
|
(chunksOf(3)(
|
|
ap([tail, init, compose(init)(tail)])(
|
|
['knights', 'socks', 'brooms']
|
|
)
|
|
))
|
|
):
|
|
print(xs)
|
|
|
|
|
|
# GENERIC -------------------------------------------------
|
|
|
|
# tail :: [a] -> [a]
|
|
def tail(xs):
|
|
return xs[1:]
|
|
|
|
|
|
# init::[a] - > [a]
|
|
def init(xs):
|
|
return xs[:-1]
|
|
|
|
|
|
# ap (<*>) :: [(a -> b)] -> [a] -> [b]
|
|
def ap(fs):
|
|
return lambda xs: reduce(
|
|
lambda a, f: a + reduce(
|
|
lambda a, x: a + [f(x)], xs, []
|
|
), fs, []
|
|
)
|
|
|
|
|
|
# chunksOf :: Int -> [a] -> [[a]]
|
|
def chunksOf(n):
|
|
return lambda xs: reduce(
|
|
lambda a, i: a + [xs[i:n + i]],
|
|
range(0, len(xs), n), []
|
|
) if 0 < n else []
|
|
|
|
|
|
# compose (<<<) :: (b -> c) -> (a -> b) -> a -> c
|
|
def compose(g):
|
|
return lambda f: lambda x: g(f(x))
|
|
|
|
|
|
# transpose :: [[a]] -> [[a]]
|
|
def transpose(xs):
|
|
return list(map(list, zip(*xs)))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|