Skip to content

Instantly share code, notes, and snippets.

@diego9627
Created May 23, 2015 06:11
Show Gist options
  • Save diego9627/5ccbdfae8959eaac0c94 to your computer and use it in GitHub Desktop.
Save diego9627/5ccbdfae8959eaac0c94 to your computer and use it in GitHub Desktop.
type DQ a = [a] -> [a]
pushBack :: a -> DQ a -> DQ a
pushBack a dq = (a:).dq
pushFront :: a -> DQ a -> DQ a
pushFront a dq = dq.(a:)
toListDQ :: DQ a -> [a]
toListDQ dq = dq []
fromListDQ :: [a] -> DQ a
fromListDQ a = const a
follows :: DQ a -> DQ a -> DQ a
follows a b = a.b
emptyDQ :: DQ a
emptyDQ = id
solveEven :: DQ Char -> String -> (DQ Char,String)
solveEven dq "" = (dq,"")
solveEven dq (')':xs) = (dq,xs)
solveEven dq ('(':xs) = let (u,v) = solveOdd emptyDQ xs in solveEven (dq.u) v
solveEven dq (x:xs) = solveEven (pushFront x dq) xs
solveOdd :: DQ Char -> String -> (DQ Char,String)
solveOdd dq "" = (dq,"")
solveOdd dq (')':xs) = (dq,xs)
solveOdd dq ('(':xs) = let (u,v) = solveEven emptyDQ xs in solveOdd (u.dq) v
solveOdd dq (x:xs) = solveOdd (pushBack x dq) xs
solve = toListDQ . fst . solveEven emptyDQ
main = interact solve
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment