import List
-- Отразить зеркально по горизонтали
mh = map reverse
-- -"- -"- по вертикали
mv = reverse
-- -"- -"- по вертикали и по огризонтали
mvh = mv.mh
-- Повернуть на 90 градусов по часовой стрелке
r90 = mh.transpose
-- -"- -"- -"- -"- против часовой стрелки
l90 = transpose.mh
-- Негатив картинки
inv = map (map invp) where invp '#'='.'; invp '.'='#'
-- Масштабировать
scale m n = (sv n).(sh m) where
sv n = concat.map (replicate n)
sh n = map (concat.(map(replicate n)))
-- Вырезать часть
crop x y w h = (crop1 y h).(map (crop1 x w)) where crop1 y h = (take h).(drop y)
-- Найти различие между рисунками
comp = zipWith (zipWith (cmp)) where
cmp '#' '#' = '.'
cmp '.' '.' = '.'
cmp _ _ = '#'
-- Найти границы
bounds x = (l x, r x, t x, b x) where
l x = minimum(map (length.(takeWhile (== '.'))) x)
r x = maximum(map length x) -1- (l (mh x))
t x = length (takeWhile (all(== '.')) x)
b x = length x -1- (t (mv x))