import Data.List(sort, sortBy)
-- генерирует все сочетания
findSolution l found len current
| found == len = [current]
| length l < len - found = []
| otherwise = (findSolution (tail l) (succ found) len (current ++ [head l])) ++ (findSolution (tail l) found len current)
-- обертка над верхней функцией
solve l = concat [findSolution (sort l) 0 len [] | len <- [1..(length l)]]
-- замена в списке всех элементов a на b
replace [] _ _ = []
replace (x:xs) a b
| x == a = (b:(replace xs a b))
| otherwise = (x:(replace xs a b))
-- лексикографический порядок
lexOrder :: [Int] -> [Int] -> Ordering
lexOrder [] [] = EQ
lexOrder [] (x:xs) = LT
lexOrder (x:xs) [] = GT
lexOrder (x:xs) (y:ys)
| x == y = lexOrder xs ys
| x < y = LT
| otherwise = GT
-- лексикографическая сортировка
lexSort = sortBy lexOrder
main = do
input <- getLine -- считывание
print $ lexSort $ solve $ (read ("[" ++ (replace input ' ' ',') ++ "]") :: [Int]) -- вывод ответа
Comments