module Worms where import Prelude hiding(Left, Right, Up, Down) data Border a = Border { right :: [a], up :: [a], left :: [a], down :: [a]} deriving(Show) data Direction = Right | Up | Left | Down createBorder :: [a]->Border a createBorder xs = borderHelper Right xs where n = round (fromIntegral (length xs) /4 + 1) borderHelper dir xs = case dir of Right -> let cur = borderHelper Up (drop (n-2) xs) in cur{right = reverse $ take (n-2) xs} Up -> let cur = borderHelper Left (drop n xs) in cur{up = reverse $ take n xs} Left -> let cur = borderHelper Down (drop (n-2) xs) in cur{left = take (n-2) xs} Down -> Border {down = take n xs} mergeBorder :: [[a]] -> Border a -> [[a]] mergeBorder xs (Border right up left down) = [up] ++ side ++ [down] where side = map (\ (xs, (left, right)) -> [left] ++ xs ++ [right]) (zip xs (zip left right)) snail :: Integer -> [[Integer]] snail 1 = [[1]] snail n = mergeBorder (snail (n-2)) border where border = createBorder [((n-2)^2+1)..(n^2)] printSnail xs = mapM_ (putStrLn . unwords . (\ xs -> map show xs)) xs

빡대가리라서 직사각형은 못함.