import System.Environment slideWords :: Int -> String -> String -> (String, String) slideWords n a b = (drop ((length a) - n) a, take n b) overlaps :: String -> String -> [(String, String)] overlaps a b = [slideWords n a b | n <- [0..minLength]] where minLength = min (length a) (length b) longestOverlap :: String -> String -> String longestOverlap a b = fst $ last $ (filter (\(a,b) -> a==b) $ overlaps a b) condenseWords :: String -> String -> String condenseWords a b = if overlap == "" then a ++ " " ++ b else a ++ (drop (length overlap) b) where overlap = longestOverlap a b condense :: String -> String condense ws = foldr condenseWords "" $ words ws main = do input <- fmap unwords getArgs putStrLn $ condense input