-- WARNING: код не претендует на оптимальность и понятность -- WARNING: just for lulz import Data.List perms [] = [[]] perms list = concat $ map (\x -> map (x:) $ perms (delete x list)) list inversed [] = False inversed (x:xs) = inv xs $ inversed xs where inv [] t = t inv (y:ys) t | x > y = inv ys (not t) | otherwise = inv ys t showCell x y = "a[" ++ show x ++ "," ++ show y ++ "]" showRow r = sign ++ (intercalate "*" $ zipWith showCell [1..] r) where sign = if inversed r then "-" else "+" inter _ [] = [] inter s (x:y:r) = x ++ y ++ s ++ inter s r showTable n = inter "\n" $ map showRow $ perms [1..n] header n = "function det" ++ show n ++ "(var a:atab):double;\n" ++ "{FUNKCIYA VYCHISLYAET OPREDELITEL MATRITSY " ++ show n ++ "-go PORYADKA a}\n" ++ "begin\ndet" ++ show n ++ ":=\n" footer n = "end;" gen n = header n ++ showTable n ++ footer n main = putStrLn $ gen 6