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
빡대가리라서 직사각형은 못함.
하스켈 인덱싱 안 되는 것 때문에 존나 고생했네; ; - dc App
이열 bb