"Ёлочка"

As of March 2020, School of Haskell has been switched to read-only mode.

"Ёлочка"

Данная задача представляет собой одну из множества задач, задаваемых время от времени начинающим разработчикам на собеседованиях.

Само задание звучит так:

Написать программу, выводящую в консоль для заданного числа n "изображение" ёлочки высотой n

Обычно, ожидается, что ёлка будет выглядеть так:

    *
   ***
  *****
 *******
*********

Данная задача просто решается на императивных ЯП, таких как Python. Здесь же будет приведено "функциональное" решение.

Скелет программы

Скелет программы будет следующим:

module Main where

main :: IO ()
main = putStrLn (pineTree 10)

pineTree :: Int -> String
pineTree = undefined

Простое решение

Функция формирования "изображения" дерева представлена следующим кодом:

pineTree x = unlines $ map row ranges
  where
    row (n, m) = take n spaces ++ take m stars
    stars  = repeat '*'
    spaces = repeat ' '
    ranges = zip [x - 1, x - 2 .. 0] [1, 3..]

main = putStrLn (pineTree 10)

Бесточечный вариант

В качестве разминки для ума можно переписать функцию "рисования" ёлки в бесточечном стиле:

pineTree = unlines
         . zipWith (flip (++)) (zipWith take [1,3..] (repeat (repeat '*')))
         . zipWith (flip take) (repeat (repeat ' '))
         . reverse
         . flip ($) [1,2..]
         . take

main = putStrLn (pineTree 10)

Бесточечный вариант №2

Функция записана бесточечно, но сложновата на вид, хоть и повторяет изначальное решение. Однако можно реализовать эту функцию и короче:

pineTree = unlines
         . takeWhile ((== ' ') . head)
         . iterate ((++ "**") . tail)
         . (++ "*")
         . (flip take) (repeat ' ')

main = putStrLn (pineTree 10)
comments powered by Disqus