Ёлочка
let author = "Алексей Пирогов"
date = fromGregorian 2014 dec 29
category = "Задачи"
tags = ["ёлочка"]
date = fromGregorian 2014 dec 29
category = "Задачи"
tags = ["ёлочка"]
Данная задача представляет собой одну из множества задач, задаваемых время от времени начинающим разработчикам на собеседованиях.
Само задание звучит так:
Написать программу, выводящую в консоль для заданного числа n “изображение” ёлочки высотой n
Обычно, ожидается, что ёлка будет выглядеть так:
*
***
*****
*******
*********
Данная задача просто решается на императивных ЯП, таких как Python. Здесь же будет приведено “функциональное” решение.
Скелет программы
Скелет программы будет следующим:
module Main where
main :: IO ()
= putStrLn (pineTree 10)
main
pineTree :: Int -> String
= undefined pineTree
Простое решение
Функция формирования “изображения” дерева представлена следующим кодом:
= unlines $ map row ranges
pineTree x where
= take n spaces ++ take m stars
row (n, m) = repeat '*'
stars = repeat ' '
spaces = zip [x - 1, x - 2 .. 0] [1, 3..]
ranges
= putStrLn (pineTree 10) main
Бесточечный вариант
В качестве разминки для ума можно переписать функцию “рисования” ёлки в бесточечном стиле:
= unlines
pineTree . zipWith (flip (++)) (zipWith take [1,3..] (repeat (repeat '*')))
. zipWith (flip take) (repeat (repeat ' '))
. reverse
. flip ($) [1,2..]
. take
= putStrLn (pineTree 10) main
Бесточечный вариант №2
Функция записана бесточечно, но сложновата на вид, хоть и повторяет изначальное решение. Однако можно реализовать эту функцию и короче:
= unlines
pineTree . takeWhile ((== ' ') . head)
. iterate ((++ "**") . tail)
. (++ "*")
. (flip take) (repeat ' ')
= putStrLn (pineTree 10) main