{-# LANGUAGE NoMonomorphismRestriction #-} import Control.Monad import Data.Char razmer = 25 sdvig = 0.2 main = getLine >>= mapM_ (printanutSnezhinku . zaebashitSnezhinku) . words zaebashitSnezhinku slovo = snezhinka where snezhinka = stvoli ++ mnogougoljni4ki ++ veto4ki summa = sum [ord c^p | (p,c) <- zip [1..] slovo] ugol = 2*pi/fI stvolov shag = fI (round (razmer/fI mnogougoljni4kov)) stvoli = [0,ugol..2*pi] >>= zaeboshitLiniju (0,0) razmer mnogougoljni4ki = [shag,2*shag..razmer-shag] >>= zaeboshitMnogougolni4ek ugol veto4ki = join [[t-pi/4,t+pi/4] >>= zaeboshitLiniju to4e4ka dlinaVeto4ki | t <- [0,ugol..2*pi], s <- [shag,2*shag..razmer-shag], let to4e4ka = zaeboshitTo4e4ku s t] stvolov = mod summa (maxStvolov-minStvolov) + minStvolov mnogougoljni4kov = mod summa (maxMnogougoljni4kov-minMnogougoljni4kov) + minMnogougoljni4kov maxStvolov = 13 minStvolov = 3 maxMnogougoljni4kov = 5 minMnogougoljni4kov = 2 dlinaVeto4ki = 4 printanutSnezhinku snezhinka = forM_ [razmer,razmer-1 .. -razmer] (\y -> forM_ [-razmer..razmer] (\x -> putStr [if elem (x,y) snezhinka then '#' else ' ',' ']) >> putChar '\n') >> putStrLn "\n" zaeboshitTo4e4ku rasstojanie ugol = (round (rasstojanie*cos ugol),round (rasstojanie*sin ugol)) zaeboshitLiniju (x0,y0) dlina ugol = map ((\(x1,y1) -> (x0+x1,y0+y1)) . (`zaeboshitTo4e4ku` ugol)) [0,sdvig..dlina] soedenit2To4e4ki (x0,y0) (x1,y1) = zaeboshitLiniju (x0,y0) rasstojanie ugol where rasstojanie = sqrt $ fI $ (x0-x1)^2 + (y0-y1)^2 ugol = atan2 (fI (y1-y0)) (fI (x1-x0)) zaeboshitMnogougolni4ek ugol dlina = join $ take (round (2*pi/ugol)) $ zipWith soedenit2To4e4ki to4e4ki (drop 1 to4e4ki) where to4e4ki = cycle (map (zaeboshitTo4e4ku dlina) [0,ugol..2*pi]) fI = fromIntegral