diff --git a/10/input.txt b/10/input.txt
deleted file mode 100644
index cf96421..0000000
--- a/10/input.txt
+++ /dev/null
@@ -1,98 +0,0 @@
-[[{(<({[(([[([()<>][()<>])]][<{[[]<>]}<<[]{}>>>])[({<[{}[]]<{}<>>><{()[]}[{}[]]>}<<(<>[])[[]{}]>{(<
-{{{[[<{<{({({(<>{})}<(()[])([]<>)>)})(<[([{}()]([]{}))[([][])([]<>)]]((<{}<>>[[]{}])({<>()}{()}))>
-[(<<[(<[[[<{(([]{})){<{}{}>{()<>}})><(<[()()][<>]>([[]]))[(([]<>)(<><>))((<>)({}[]))]>]{<<{{()[]}<[]<>>}
-{{({{{([<((<[[<>[]](<>[])]><<(()<>)<<><>>>{(()<>)(<>{})}>))>]({(([{{()()}>{{{}{}}{<><>}}]{({()<>
-<<{(<<{<<{([{{(){}}{()()}}{<[]{}>(<>{}))][({<>{}}[[]<>])<{{}{}}{{}()}>])[<<{{}{}}[()[]]>{{
-[[<{[<((<[[{{{{}{}}{{}[]}}}[[<{}<>>]]]({<([][]){{}<>}>((()<>)<<>[]>)})]><[({{<{}()>{()()}}})]{(<({[]{}}[{
-<<[{([[[[[<{[([]())({}[])]{[{}[]]}}<(<[]{}>({}{})){{[]<>}[()]}>>{(<{[]}[<>[]]>)}][(([[{}[]]<[]
-[(<[<{{((<{<[<{}[]>[<>{}]][<{}<>>]><<({}[])[[]<>]>}}>)<(([{<{}<>>(()[])}[[{}()]([])]]<<{<>()}({}{})>
-<{{[[<(<<<([({{}())([]{})){<()<>>{<>{}}}]<{[[]{}][[]<>]}{<{}()>{[]()}}>)<<{(<>())[<><>]}[{{}[]}(<>(
-{{{{<{{<{<<[[[{}()]<[][])]<{(){}}{[]{}}>][{<[]()>{<>{}}}]>><{(<<<>[]>{(){}}>{{[]()}[<><>]}){(<{}()>){[[][]](
-{(<{{([[(<{[((()<>){()()})<[<>{}]{()}>]<{[()[]]}>}([{<()>{{}[]}}[([][]){()[]}]]{{<<>[]>}{([]{}){<><>}}})
-[(((({[{<<{[{([]())(<>[])}[<{}()>{()()}]]}>>[<[[{{{}()}{()<>}}(<()<>>[{}[]])]{[({}<>)<<>>]}]<({<<><>
-<([[[((<[<<((<[][]>))<<{[][]}>>>{<([()()>)>}><([[[()[]]({}())]({<>{}}{()[]})]{{{<><>}[[]()]}[[[]
-(((<({([[({{({[][]})(({}())[()<>])}(<[[][]]>(<{}>[<>{}]))})](<{((<<><>>[()()]){<[]<>>[[]<>]})}([<
-[[{[[{[[{[{{[<{}()><()[]>]}}]<<{{<<><>>{{}{}}}[(<>{})(()())]}[{([]<>)[{}()]}<[[]][()()]>]><<{{[]{}}
-((<<((<(<[{[({()<>}{()()}){<{}{}>}]}[{<[<>()][[]()]>}]]{[{[<()>{[]{}}]}<{[{}{}}}[([]{})(<><>)]>](({(<>{})
-[[<[<({[[<<{[[()()]{(){}}]<[{}<>](()())>>(<[()[]][[]()]>)>[{(([][])([]{}))}[<<<><>><()<>>>(<<>[]>)]
-[({(<{(<{[{[{([]){{}{}}}(<[][]>(<>[]))](<{<>[]}<[]()>>{<()><{}>})}{[([<>{}]{[]()})[(<>{})<[]()>]][{[()<>
-[[<<{[(<({(((([]{})[[][]])<<{}{}>{[]()}>))})<[(<<(<>[])<[]()>><((){})[()<>]>>{<({}[])>{<<>{}>{(){}}}}
-<<([[({(<{<[[({}()){()[]}]]>((<<()[]>(<>{})>(([]())))(((()<>)({}[]))))}>{<{((([])<()[]>)<({}())<()<
-<<({[<{<({{{{[()()]<<>[]>}[{{}<>}[()()]]}{(([]()))})})[[[{[<<>[]>[<>()]]<{[]{}}[<>{}]>}]([{{[][]}{
-{((((([[([<{([<>{}]<{}[]>){({}())[{}[]]}}{(<()()>({}[]))<{<><>}(<>[])>}>([<{()<>}[()[]]><[()<>]>]{[{
-{[((((({<[{<{[(){}][[]()]}[({}[])]>{[[<>{}]{{}}]{[<>[]]<<>[]>}}}({[([]{})]{[[]<>]<[]{}>}}(<(()[])[{}()]
-((<<{<{{{<(<<[<>()]{{}<>}>({<>{}}[[]()])>(<<{}<>>({}<>)><[{}<>]{(){}}>))<(((()[])([]())){(<
-{(<(<([{{{((([<>[]]([]<>))({<>[]}<<>[]>)}{<(<><>)<<>{}>>(({}[])(()<>))}){[{{{}{}}}]{[<{}()>(<>{})][{[]}]}
-{{{([([(<[<[{<()>{()()}}<[()()]<<><>>>]{<<()<>>>(((){}){()<>})}>{<{({}[])<<><>>}((()())<{}{}>)>
-{(({(<<([[({<{[][]}<<><>>>}(<({}<>){{}<>}>{<<><>>(<>())}))<{{[{}<>]<[]()>}<<{}{}>>}[{<{}[]><(){}>}{
-[[[([[(([<[<{<<>{}><{}[]>}>((<[][]>[{}[]]))]{({<<><>>[()[])}[{{}()}<{}>])}>]){[{{((<<>{}>([]<>))([
-([<<<[(<(<{[[({}{}](<>)]{{{}<>}({}{})}][({()}{[]()})[({})]]}{<[(<><>)({}{})]<{<>}{[]}>>}>)>){{<[(<{(()()
-{{{<{(<(([<<<{{}[]}[<>{}]}>([<<>()>{<>()}]<<<><>>[{}<>]>)>{[([<>()]{()[]}){{<>{}}[<>[]]}]}][(<[(()
-<<<[[{(([<<{{(()())[{}[]]}{[[]<>]<<>>}}[(<<>><{}<>>){{{}[]}[{}()])]>([(<{}()>[[]()])[(()())
-{{{([[[<{(<<{[[]()](<>{})})[(<[]{}><[]{}>)[<[]{}>{{}()}]]>[[[(()()){{}{}}][[<>[]](())]]<([{}()][{
-([{{([[[({[(((<>)(()<>)){[{}{}](()())}){(((){})([]()))[(<>{})<[][]>]}]([({[]()}[(){}])<[{}()>(()<>)>
-[[[<<(({<<(([({}[])<(){}>][[{}]([]())])<{{[]()}[[]]><{<><>}<()[]>>>)>{<{<[[][]]<{}<>>>([[]<>]{{}<
-[[[<[<([{<[{{{()<>}({}<>)}}(<{{}<>}{[]()}>[<()())(<>())])]>[[(<{()}<[]()>><[()[]]<<>{}>>){<[()<
-{{(<({((<[<<[([][])<[]<>>](<<>[]>)>>{<([(){}]{[]{}})>{[({}<>)]<[(){}]{{}}}}}]>)[[[[<{<[][]>(
-[[[[{{{{([(((({}<>){()()})[{()()}([]<>)])[{<{}{}><[]{}>}([()<>][[]()])])]))}(<[[[{[[()[]]<()[]>]}]{((
-({{[(((([<({{(<>())<{}()>}([{}{}]<{}{}>)}[{[{}{}]}<[[]]<()[]>>])[([<{}{}><[]{}>])<<[(){}]({}{}
-(<<({<({[({[{{()[]}[()<>]}<{<>{}}({}{})>](<{<>{}}>[{{}<>}{(){}}])})(({<<{}[]>{<>()}>}{{<<>()>
-[[[[<<<({<({({[]}[[]{}])(<{}()>[{}{}])}[[({}())][{<>{}}{[]<>}]])>})<([<(<(()[])([]())>)<[[{}[]][{}<>]][[(
-{<{<{<[[{[[<(([]{})){[()[]][{}[]]}><[{<>{}}({}{})]{({}())<<>[]>}>]]}(([<[{<>()}{(){}}]<<[]{}>(()())>>]
-{<<<{<{<(<{([(<>)<[][]>][(()[]){{}<>}])}(((({}<>)<[][]>){([]<>){()<>}})<<<<>()>{{}()}>{<[]()><[]()>}>)})[<{
-([<<[[{{<[{(<{[]()}>)<<<<>()>([]<>)>>}]{(({{<>()](()<>)}(({}())[[]()])))}>{(<[<(<><>)[{}<>]
-[{<<{[[<[<<{{<<>()>}[[{}[]]({}{})]}([[<>[]]][(<><>)<()()>])>[({[<><>][[]<>]})({<[][]>(()<>)})]>}>][{(([<[{
-{([[[<[(([[<<<()<>>[<>()]>[<()<>><(){}>]>[<<[][]>(<><>)>]][(([<>()]<<>()>))<([{}()]{{}{}}){<()[]){[]()}}>]]{[
-{{<<[<{{([({[([]<>)[{}()]]{[()[]>[()()]}}<[[<>{}](<><>)]>)[<(<<><>><[]{}>)([<>{}])><<{[]}[{}()]>{<<>{}>[<>[]
-{{<(<<((<[<<<[{}[]]<<><>>>[({}[]){{}()}]>>]>){(<([(<<>[]><{}>)({<><>}<{}[]>)]{{([]{}>(()())}
-[(<<<{[<([[(({()()}<{}[]>){[{}<>]([]<>)})({(<>[])(()<>)}[([][])<())])]])({[<(([][]){()()})>{[[(
-[<[[(({[<<([{({}[])[{}{}]}{<<>[]>[{}{}]}])[[({{}}<[]>){<[]()>{{}{}}}]<{[<>[]](<>())}<[()()][()<>]>>]>(<[[[[
-{<{[([[<<<{<<({}{})(<>())>{<<><>><{}{}>}>{({()()}<{}()>)<(<>{}){<>[]}}}}({[{[]{}}{()<>}](<<><>>(
-{{<<([{([[(([{()<>}<(){}>]<<()()>(()<>)>)({[{}()]}<<()[]><()()>>))][[<(((){})<[][]>)><(<<><>>
-{(([{({<{[({[(<><>)(()()]]<[<>[]][{}<>]>})]}>{(([[(<()[]>(()<>)){{[]<>}(<>())}]([<[]()>[{}[
-{{({{{<{{{[([[<><>]]<{[][]}[[]<>]>)(<<<><>><<><>>>[(()())({}<>)])]((<(<><>)<(){}>>[{{}{}}[{}<>]])([<()[]>
-{(<<{{<<{{{{<<[]<>>[{}()]><<()[]>{{}[]}>}}}}([({<<{}{}>[()]>[[{}[]]<[]{}>]}(<{()()}<()[]>>))]{
-{<<([((<<[<{({{}[]}<()()>)(([]{})<{}[]>)}<(((){})[()<>])>><(<(<><>)<<><>>>){[((){})([]<>)](([][])[<
-<{[{<{<<({<<([{}()]{[]{}})[({}())<{}()>]>>[[[(()[])[()<>]](<[][]><{}()>)][(([]()]([]))]]})>>{<[<[((<{}<>>{(
-[{[[[({<<[[([{<>{}}[[]]]<<{}<>><[]<>>>)(<<{}()>[()<>]>[<(){}>])][<{<()()><<>[]>}<[[][]][<>()]>><[[{}()](<>)
-<{{[{[{[([[[([<><>]({}[]))([[][]](<>{})}][[{[]()}{{}()}][{[][]}<{}<>>]]][(({[]<>}[<>()])[<()<>><[][]>])<(({}
-{(({[{(<[<(<[{<><>}<{}[]>]<[{}<>]((){})>>([{()}(<><>)])){<[<()<>>[{}()]]({<>{}}(<><>))>{{(<
-<<[[(<{<({<<[[<>()]((){})]>{[({})<{}<>>]((<>{}){[]<>})>>})>}>({{(<<{([()[]])[{{}[]}(<>[])]}>>)}<((<<<
-[[([{{((<(<({{[]<>}}<{<>()}([]())>)<[<<>()>(<>{})][[()()]<<>{}>]>>)>(<[[{[{}{}]({}[])}({{}{}}[[]()
-<{[[{[([<([{<<()()>><<<>[]>>}][[((<>)(<><>))<({}{})<()<>>>]<{[<>()]<[]{}>}>])({[[{[]{}}]]}{({[<>()
-<<[<{<([([<({<(){}>{[]()}}<<{}<>><[]<>>>)>{{<[(){}]{<>()}>(<<>()>[{}<>])]}](<(<(()())<<><>>
-[{[<[<[<<(<[(<<>{}>)[<{}{}>({}{})]]})>[[(((<<>[]>[<>()])<{(){}}<(){}>>){{(<><>)}[(<>()){{}<>}]})
-{<{<({{(<(<([[<>()][[]()]][(()[])[[]<>]])[([[]{}]{{}<>})]>[[<({}()){<><>}><{()[]}({}())>]([{<>{}}
-({(([(<[[{{<([[]()]{{}{}})[{{}{}}[{}<>]]>[{([]<>)(()())}(<<><>>{<>{}})]}<<({()()}{()<>})[(<>
-[<[<((({{<{([({}())([]{})]<(()())(<>())>)({<()[]>{<>[]}})}<[([()<>]{{}<>})](<{[]()}(<>())>)>>[({[([])(
-({[<[(<((<{(<[()[]>[{}<>]>)<{<[]<>>{<>[]}}(({}{}))>}{{<[[]{}][{}{}]>{(())<[]()>}}}><<<{(<>[])<[]()>}({[][
-(<<<({({<[[<<(<><>}<()<>>>{<{}<>><[]<>>}>[<<[]<>>(()[])>{<()()>}]]]{{(([<>[]]<[]{}>){({}{})([][]
-({<[[<[({[{<{(()<>)}[(()[])<<>{}>]>}({{(<><>)[<><>]}[{[]()}<(){}>]}{{[()()]<(){}>}[[{}[]]([]{})]})]([[<{{}()}
-[[[(<({(({{{<{()<>}[<>{}]><<[][]>({}[])>}[[[{}{}]<<>{}>][[(){}]]]}[<([{}{}][[]])[{<><>}[()[]]]>]}<<[({{
-[<[[{[(([[<{(<{}{}>)}(<{(){}}([][])>{<(){}><<>{}>})>([([{}{}])(<[]><(){}>)])][({<<{}<>><[]<>>>[[[]{}]{[]{}}]
-[{{[(<<{{{[([(()())<<><>>])<([()()]((){}))<([][]){[]<>}>>]{<<{(){}}(<><>)>({()<>}<()[]})>}}}}[{{<<
-<[{[(({({<(<<<{}{}>{{}{}}>{([])({})}>{[{<>>(<>)]{[<>{}]<{}<>>}})[<({{}[]}<{}{}>)<([]())({}())>>({<[]
-(<[<({[{{(((({{}[]}{{}<>}){(<>[])})[[({}<>)[[]<>]]<[{}]{[][]}>])(<[(<>()){<>()}]<(<><>){(){}}>>
-[([{([{[<{<[<(<>{}){{}[]}>{([][]){()}}]{[<[]{}><<>{}>]{[(){}){[]{}}}}>([<[{}]<{}[]>>{<[][]>{()[]}}][{{<>()}{{
-<{{(({({[<(({({}[]){{}<>}}[(<>()){[]{}}]))[[<{()()}[{}{}]>(<{}{}>(<>[]))]<<{()()}<{}{}>><{<><>}<<>[]
-{{[[<[<[{[<{{[[]<>]<[]>}[({}{})(<>)]}>](<<((<>)<[]<>>)[<{}()><<>[]>]>[<{<>()}<(){}>>[[()<>]]]>(<[{
-({[<(<{<[<<<(<<>()><[]<>>)<<()<>>({}[])>>(<[()()]{<><>}>)>>]>(<<({[<{}[]>{()}]}<<{()<>}({}())>({[]<>}([]()))>
-<{<{{[({{(<{<<<><>><(){}>>[([][])([]{})]}<{([][]){{}}}<<[]()>([][])>>>[<{{[]()}[()<>]}<[<>{}]([]{})>>])
-{({[{(<[<<<<(([]<>)<{}{}>)>((({}{})<{}<>>)<<{}{}>>}>{{[<()()>[{}()]]}((<<>()>[(){}])<{[]<>}[<>{}]>)}>>{<<{
-((([<[[[<{{<<<{}[]><<>{}>>(([]<>)[[]])>((<{}[]><{}>)(({}[])[()[]]))}{{<(<>[])(<><>)>(<<>[]
-[[([{<(<(<[({[[][]]{()<>}}{{<>[]}<[][]>})]>)<{[((((){})([]<>))[<<><>>(<><>)]>[{<{}[]><[][]>
-[<<(<(({{{<((([]())[<>{}])<[[][]]{()()}>)><[<((){})<()()]>[<[]>[(){}]]]({([]())([]{})}([<>(
-(<{<<{<((({(<{(){}}[()<>]>{[[]<>][()[]]})<<{[][]}{{}[]}>[(<><>)<{}{}>]>}(<[{{}<>}{[]()}]({()[]}((
-<[[([<<[{{<(<[()[]]{<><>}>([<>[]]<{}[]>))[({{}()}<[]<>>)<(<>{})>]>{{{<<>{}>(<>)}<{<>()}[<>()]>}<[<<>()
-[[((<({<[{{<[[[]()][<>]](<()()>[{}<>])>{<(()<>)>([()<>]{()[]})}}{[[(()<>><[]<>>]]<{(<><>){{}<>}}
-[<{([{[{<<<(<[<><>]({}())>{([]<>][[]{}]})[<{[]<>}[<>{}]>[<[][]>]]>>({([(<><>){<>{}}][{{}[]}({}<>)
-{({{<[([{([<<{<>()}>[{<>[]}[{}[]]]>](<{{[]{}}[{}<>]}({<>[]}[{}[]])>[<([][])({}{})><<{}()>(()<>)
-(<({[<(<[<[{([[]{}][{}[]])([{}[]])}{({<>[]}{()[]})[[<><>](()<>)]}]><(({[()[]]}([{}()][{}{}]))<[(()<>)]>)[[<
-<(<(<<({({[<{<<><>>[()<>]}{<[]()><<><>>}>[(([][])<{}[]>)(({}{})<<>()>)]](<<(<><>){[]<>}>([[][]][<>()])>{<(
-[({<[[<{[[{[{{<>()}{{}[]}}](([{}[]}{[][]})<{<>[]}({}<>)>)}{[(([]{})<{}[]>)<<{}>{(){}}>]}]<[
-<[({<<[[({{{((<><>)<[]<>>)<<{}><{}<>>>}(([(){}]{()})[{[][]}[[]<>]])}}[[<[<()[]>[{}()]]><{<{}<>><<>[]>}{[[]
-<[{[[[[[<{[<([<>()]([]{}))<{[]{}}<[][]>>>([{[]<>}([]<>)]{[{}()][<>{}]}}]<[[(<><>)[{}{}]][(()(
-{<{{[<({{<[([{()()}[{}<>]]{({}())<(){}>})[[{(){}}<[]<>>}<(<>()){{}{}}>]]{{(([]{})[[]()])[{{}{}}[[]{}]]}{<[
-(([<([<<{[{{[({}{})][(<>{})]}}]{{([<<>{}>(<>())])}}}>[{<<(({{}<>}<<>[]>){({}())<{}()>})><(<[()<>]><{()<>}<
-[<[{[[[({[{[(((){}){(){}}){{<><>}{{}[]}}]<{({}()){<>{}}}>}<{[{[]{}}({}{})])>]}{(<(((()[]){{}[]})[<()<>
-({<<([{{{{({[{<>[]}[{}{}]]{<[]{}><{}{}>}}[<[<>()](<><>)><[{}{}]>])(<{[<>()]<<>()>}<(<>[])>>(([()
diff --git a/10/syntaxchecker.hs b/10/syntaxchecker.hs
deleted file mode 100644
index 129ee0c..0000000
--- a/10/syntaxchecker.hs
+++ /dev/null
@@ -1,95 +0,0 @@
-import           Data.List   (foldl', sort)
-
-main :: IO ()
-main = do
-  input <- getContents
-  let
-    code = lines input
-  (putStrLn . show . solution1) code
-  (putStrLn . show . solution2) code
-
-solution1 :: [String] -> Int
-solution1 = sum . map charScore . map (head . fst . resolveChunks)
-  where
-    charScore :: Char -> Int
-    charScore ')' = 3
-    charScore ']' = 57
-    charScore '}' = 1197
-    charScore '>' = 25137
-    charScore _   = 0
-
-solution2 :: [String] -> Int
-solution2 = middle . sort . map score . completed . nonCorrupt
-  where
-    completed = map (completeChunks . fst)
-    nonCorrupt = filter notCorrupt . map resolveChunks
-    score :: [Char] -> Int
-    score = foldl' (\s x -> s * 5 + (charScore x)) 0
-      where
-        charScore :: Char -> Int
-        charScore ')' = 1
-        charScore ']' = 2
-        charScore '}' = 3
-        charScore '>' = 4
-        charScore _   = undefined
-    notCorrupt :: ([Char], Bool) -> Bool
-    notCorrupt (_, corrupt) = not corrupt
-    middle :: [a] -> a
-    middle [] = undefined
-    middle l  = l !! (length l `quot` 2)
-
-completeChunks :: String -> String
-completeChunks = map close
-  where
-    close :: Char -> Char
-    close c
-      | c == '(' = ')'
-      | c == '[' = ']'
-      | c == '{' = '}'
-      | c == '<' = '>'
-      | otherwise = undefined
-
-resolveChunks :: String -> ([Char], Bool)
-resolveChunks = foldl' resolve ([], False)
-  where
-    resolve :: ([Char], Bool) -> Char -> ([Char], Bool)
-    resolve (stack, broken) c
-      | broken = (stack, broken)
-      | isOpen c = (c:stack, False)
-      | close c == head stack = (tail stack, False)
-      | close c /= head stack = (c:stack, True)
-      | otherwise = undefined
-
-    isOpen :: Char -> Bool
-    isOpen c
-      | c == '(' = True
-      | c == '[' = True
-      | c == '{' = True
-      | c == '<' = True
-      | otherwise = False
-
-    close :: Char -> Char
-    close c
-      | c == ')' = '('
-      | c == ']' = '['
-      | c == '}' = '{'
-      | c == '>' = '<'
-      | otherwise = undefined
-
--- Tests
-
-testInput = [
-  "[({(<(())[]>[[{[]{<()<>>",
-  "[(()[<>])]({[<{<<[]>>(",
-  "{([(<{}[<>[]}>{[]{[(<()>",
-  "(((({<>}<{<{<>}{[]{[]{}",
-  "[[<[([]))<([[{}[[()]]]",
-  "[{[{({}]{}}([{[{{{}}([]",
-  "{<[[]]>}<{[{[{[]{()[[[]",
-  "[<(<(<(<{}))><([]([]()",
-  "<{([([[(<>()){}]>(<<{{",
-  "<{([{{}}[<[[[<>{}]]]>[]]"
-  ]
-
-test1 = solution1 testInput -- 26397
-test2 = solution2 testInput -- 288957
diff --git a/11/input.txt b/11/input.txt
deleted file mode 100644
index cfbdc33..0000000
--- a/11/input.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-5421451741
-3877321568
-7583273864
-3451717778
-2651615156
-6377167526
-5182852831
-4766856676
-3437187583
-3633371586
diff --git a/11/octoflash.hs b/11/octoflash.hs
deleted file mode 100644
index eb16571..0000000
--- a/11/octoflash.hs
+++ /dev/null
@@ -1,93 +0,0 @@
-import           Data.Char   (digitToInt)
-
-main :: IO ()
-main = do
-  input <- getContents
-  let
-    octopodes = (map (map digitToInt) . lines) input
-  (putStrLn . show . solution1) octopodes
-  (putStrLn . show . solution2) octopodes
-
-solution1 :: [[Int]] -> Int
-solution1 m = snd (iterate flashSimulate (m, 0) !! 100)
-
-solution2 :: [[Int]] -> Int
-solution2 m = countUntil (all (all (==0)) . fst) flashSimulate (m, 0)
-
-flashSimulate :: ([[Int]], Int) -> ([[Int]], Int)
-flashSimulate (octopodes, flashes) =
-  (refreshOctopodes exhaustedOctopodes, flashes + countExhaustedOctopodes exhaustedOctopodes)
-  where
-    exhaustedOctopodes = flashStep octopodes
-    countExhaustedOctopodes = foldr (\l a -> length l + a) 0 . map (filter (> 9))
-    refreshOctopodes = map (map (\o -> if o > 9 then 0 else o))
-
-flashStep :: [[Int]] -> [[Int]]
-flashStep = propagateFlashes . map (map (+1))
-  where
-    propagateFlashes :: [[Int]] -> [[Int]]
-    propagateFlashes = until allExhausted flashOctopi
-      where
-        allExhausted :: [[Int]] -> Bool
-        allExhausted = all (all (/= 10))
-        flashOctopi :: [[Int]] -> [[Int]]
-        flashOctopi m = map (map (incrementFlashing m))
-          [[(x, y) | y <- [0..length (m !! x) - 1]] | x <- [0..length m - 1]]
-          where
-            incrementFlashing ::[[Int]] -> (Int, Int) -> Int
-            incrementFlashing m' o
-              | charge < 10 && newCharge > 10 = 10 -- Ensure we don't miss an increment
-              | otherwise = charge + numFlashingNeighbors o
-              where
-                newCharge = charge + numFlashingNeighbors o
-                charge = m' !!! o
-            numFlashingNeighbors :: (Int, Int) -> Int
-            numFlashingNeighbors = length . filter (\o -> (m !!! o) == 10) . (flip adjacent m)
-
-(!!!) :: [[Int]] -> (Int, Int) -> Int
-(!!!) m index = m !! (fst index) !! (snd index)
-
-countUntil :: (a -> Bool) -> (a -> a) -> a -> Int
-countUntil p f = call
-  where
-    call x
-      | p x = 0
-      | otherwise = call (f x) + 1
-
-adjacent :: (Int, Int) -> [[Int]] -> [(Int, Int)]
-adjacent (x, y) m = [(x+i, y+j) |
-                     i <- [-1..1],
-                     j <- [-1..1],
-                     -- (i, j) /= (0, 0),
-                     x+i >= 0,
-                     y+j >= 0,
-                     x+i < length m,
-                     y+j < length (m !! 0)]
-
--- Tests
-
-testInput1 = [
-  "5483143223",
-  "2745854711",
-  "5264556173",
-  "6141336146",
-  "6357385478",
-  "4167524645",
-  "2176841721",
-  "6882881134",
-  "4846848554",
-  "5283751526"
-  ]
-parsedTestInput1 = map (map digitToInt) testInput1
-
-testInput2 = [
-  "11111",
-  "19991",
-  "19191",
-  "19991",
-  "11111"
-  ]
-parsedTestInput2 = map (map digitToInt) testInput2
-
-test1 = solution1 parsedTestInput1
-test2 = solution2 parsedTestInput1
diff --git a/12/Parsing.hs b/12/Parsing.hs
deleted file mode 100644
index 8ad0f3f..0000000
--- a/12/Parsing.hs
+++ /dev/null
@@ -1,23 +0,0 @@
-module Parsing (
-  splitByString
-  ) where
-
-import           Data.List (isPrefixOf)
-
-splitByString :: String -> String -> [String]
-splitByString _ "" = []
-splitByString splitter string =
-  let (chunk, rest) = spanNextSplit string
-  in
-    chunk:(splitByString splitter rest)
-    where
-      spanNextSplit :: String -> (String, String)
-      spanNextSplit [] = ([], [])
-      spanNextSplit everything@(char:rest)
-        | splitter `isPrefixOf` rest =
-          ([char], (drop ((length splitter) + 1) everything))
-        | otherwise =
-          let
-            (start, end) = spanNextSplit rest
-          in
-            (char:start, end)
diff --git a/12/cavesearcher.hs b/12/cavesearcher.hs
deleted file mode 100644
index 45e1091..0000000
--- a/12/cavesearcher.hs
+++ /dev/null
@@ -1,122 +0,0 @@
-import           Data.Char       (isLower)
-import qualified Data.Map.Strict as Map
-import qualified Data.Set        as Set
-import           Parsing         (splitByString)
-
-main :: IO ()
-main = do
-  input <- getContents
-  let
-    caves = parseCaves input
-  (putStrLn . show . solution1) caves
-  (putStrLn . show . solution2) caves
-
-solution1 :: Map.Map String [String] -> Int
-solution1 = length . cavePaths
-
-solution2 :: Map.Map String [String] -> Int
-solution2 = length . cavePaths2
-
-parseCaves :: String -> Map.Map String [String]
-parseCaves = Map.fromListWith (++) . flatmap addReverse . map tupleFromList . map (splitByString "-") . lines
-  where
-    addReverse :: (String, [String]) -> [(String, [String])]
-    addReverse t@(a, b) = [t, (head b, [a])]
-    tupleFromList :: [String] -> (String, [String])
-    tupleFromList [] = undefined
-    tupleFromList (x:xs)
-      -- Since the second part is always expected to be a cave label
-      -- or "end", this should never be > 1
-      | length xs > 1 = undefined
-      | otherwise = (x, xs)
-
-cavePaths :: Map.Map String [String] -> [[String]]
-cavePaths caveMap = followSingle caveMap Set.empty "start"
-
-cavePaths2 :: Map.Map String [String] -> [[String]]
-cavePaths2 caveMap = followOneRepeat caveMap Set.empty "start"
-
-followSingle :: Map.Map String [String] -> Set.Set String -> String -> [[String]]
-followSingle caveMap visited node
-  | node == "end" = [[node]]
-  | otherwise =
-    let
-      v' = Set.insert node visited
-    in
-      map ((:) node) (flatmap (followSingle caveMap v') adjacent)
-  where
-    adjacent :: [String]
-    adjacent = filter (not . visitedSmall) (Map.findWithDefault [] node caveMap)
-    visitedSmall :: String -> Bool
-    visitedSmall n = all isLower n && n `elem` visited
-
-followOneRepeat :: Map.Map String [String] -> Set.Set String -> String -> [[String]]
-followOneRepeat caveMap visited node
-  | node == "end" = [[node]]
-  | all isLower node && node `elem` visited =
-    followSingle caveMap visited node
-  | otherwise =
-    let
-      v' = Set.insert node visited
-    in
-      map ((:) node) (flatmap (followOneRepeat caveMap v') adjacent)
-  where
-    adjacent :: [String]
-    adjacent = filter (/= "start") (Map.findWithDefault [] node caveMap)
-
-flatmap :: (t -> [a]) -> [t] -> [a]
-flatmap _ []     = []
-flatmap f (x:xs) = f x ++ flatmap f xs
-
--- Tests
-
-testInput1 = unlines [
-      "start-A",
-      "start-b",
-      "A-c",
-      "A-b",
-      "b-d",
-      "A-end",
-      "b-end"
-      ]
-
-testInput2 = unlines [
-  "dc-end",
-  "HN-start",
-  "start-kj",
-  "dc-start",
-  "dc-HN",
-  "LN-dc",
-  "HN-end",
-  "kj-sa",
-  "kj-HN",
-  "kj-dc"]
-
-testInput3 = unlines [
-  "fs-end",
-  "he-DX",
-  "fs-he",
-  "start-DX",
-  "pj-DX",
-  "end-zg",
-  "zg-sl",
-  "zg-pj",
-  "pj-he",
-  "RW-he",
-  "fs-DX",
-  "pj-RW",
-  "zg-RW",
-  "start-pj",
-  "he-WI",
-  "zg-he",
-  "pj-fs",
-  "start-RW"]
-
-parsedTestInput1 = parseCaves testInput1
-test1 = cavePaths parsedTestInput1
-test2 = cavePaths2 parsedTestInput1
-test3 = cavePaths2 (parseCaves testInput2)
-test4 = cavePaths2 (parseCaves testInput3)
-
-printPaths :: [[String]] -> IO ()
-printPaths = putStr . unlines . (map (foldr1 (\c a -> c++"->"++a)))
diff --git a/12/input.txt b/12/input.txt
deleted file mode 100644
index 4067b56..0000000
--- a/12/input.txt
+++ /dev/null
@@ -1,24 +0,0 @@
-yb-pi
-jg-ej
-yb-KN
-LD-start
-end-UF
-UF-yb
-yb-xd
-qx-yb
-xd-end
-jg-KN
-start-qx
-start-ej
-qx-LD
-jg-LD
-xd-LD
-ej-qx
-end-KN
-DM-xd
-jg-yb
-ej-LD
-qx-UF
-UF-jg
-qx-jg
-xd-UF
diff --git a/13/Parsing.hs b/13/Parsing.hs
deleted file mode 100644
index db81f77..0000000
--- a/13/Parsing.hs
+++ /dev/null
@@ -1,32 +0,0 @@
-module Parsing (
-  splitByString,
-  parseCoordinates
-  ) where
-
-import           Data.List (isPrefixOf)
-
-splitByString :: String -> String -> [String]
-splitByString _ "" = []
-splitByString splitter string =
-  let (chunk, rest) = spanNextSplit string
-  in
-    chunk:(splitByString splitter rest)
-    where
-      spanNextSplit :: String -> (String, String)
-      spanNextSplit [] = ([], [])
-      spanNextSplit everything@(char:rest)
-        | splitter `isPrefixOf` rest =
-          ([char], (drop ((length splitter) + 1) everything))
-        | otherwise =
-          let
-            (start, end) = spanNextSplit rest
-          in
-            (char:start, end)
-
-parseCoordinates :: String -> [(Int, Int)]
-parseCoordinates =
-  map (tuplify . map read . splitByString ",") . lines
-  where
-    tuplify :: [a] -> (a, a)
-    tuplify [a, b] = (a, b)
-    tuplify _      = error "Can't parse coordinates from non-2-sized lists"
diff --git a/13/input.txt b/13/input.txt
deleted file mode 100644
index 69e89a4..0000000
--- a/13/input.txt
+++ /dev/null
@@ -1,1035 +0,0 @@
-388,758
-82,197
-689,684
-140,677
-616,14
-206,661
-1110,215
-408,700
-830,773
-808,257
-1221,824
-7,632
-575,208
-792,847
-264,427
-555,443
-12,141
-1153,52
-350,105
-832,200
-1196,133
-371,427
-606,56
-1136,113
-50,803
-110,352
-773,572
-243,103
-213,835
-340,701
-114,761
-1149,831
-1150,873
-1293,42
-288,266
-246,252
-644,781
-75,254
-619,130
-1280,98
-704,254
-291,421
-199,309
-5,528
-95,586
-835,464
-647,822
-131,763
-52,872
-388,337
-387,173
-398,815
-221,25
-1163,240
-1206,448
-60,337
-990,570
-1295,206
-609,36
-224,396
-330,220
-480,513
-1278,856
-82,553
-48,56
-22,889
-1288,889
-534,42
-142,3
-167,801
-10,593
-1104,714
-1006,677
-766,266
-162,4
-1228,197
-765,0
-120,39
-977,528
-1101,808
-1176,514
-960,784
-42,359
-661,891
-1073,294
-798,386
-684,695
-676,310
-324,674
-510,525
-967,686
-1289,880
-586,872
-885,704
-858,487
-803,317
-687,355
-1046,147
-1113,700
-862,320
-3,60
-743,665
-1022,722
-1113,194
-49,112
-1111,197
-38,284
-1257,490
-221,869
-316,469
-15,240
-130,840
-689,418
-470,834
-689,847
-82,777
-592,355
-1,357
-950,89
-1240,805
-701,877
-537,572
-264,747
-735,215
-895,757
-917,654
-1218,714
-1190,437
-758,225
-721,486
-120,478
-373,262
-1034,243
-915,385
-1280,616
-398,761
-388,115
-1058,226
-1019,322
-134,254
-808,637
-276,131
-869,143
-1210,604
-338,301
-1109,691
-132,355
-472,525
-803,179
-562,77
-200,215
-990,324
-1263,642
-1113,343
-110,28
-1128,369
-652,873
-903,446
-462,276
-47,642
-1029,317
-718,355
-224,758
-523,579
-626,806
-305,96
-1049,38
-572,697
-231,756
-1062,817
-167,162
-858,266
-551,397
-576,77
-890,716
-202,855
-798,60
-227,219
-904,77
-606,640
-42,631
-954,619
-199,36
-1141,516
-92,180
-398,481
-639,602
-1242,694
-806,709
-840,219
-462,23
-706,68
-152,749
-1200,423
-554,290
-45,877
-1141,305
-644,749
-304,341
-798,743
-589,38
-162,61
-130,189
-1305,366
-932,378
-776,437
-454,679
-1218,77
-1034,875
-623,275
-360,89
-192,254
-256,514
-1036,135
-380,135
-262,31
-427,219
-304,105
-477,98
-922,337
-490,115
-1006,789
-950,486
-1261,334
-554,604
-743,89
-142,443
-497,141
-216,807
-1166,315
-586,22
-1197,507
-452,822
-534,437
-887,21
-808,325
-1180,189
-760,448
-1300,717
-663,710
-872,632
-1118,393
-758,669
-283,19
-1295,715
-445,506
-579,873
-755,443
-35,714
-557,190
-825,141
-890,357
-181,714
-579,469
-872,362
-1158,738
-1277,684
-206,350
-1241,338
-425,704
-393,486
-69,492
-704,702
-197,194
-1305,528
-375,642
-227,675
-989,753
-157,814
-907,229
-169,516
-427,667
-813,585
-856,215
-920,595
-676,445
-1143,610
-666,849
-142,71
-1190,478
-403,404
-288,432
-261,480
-324,220
-986,674
-1168,584
-773,632
-858,407
-830,369
-858,628
-706,602
-878,89
-661,305
-1241,492
-962,487
-522,539
-1019,473
-493,63
-907,665
-872,490
-70,626
-813,18
-80,700
-616,598
-954,863
-75,192
-912,305
-87,677
-616,180
-117,434
-1260,740
-606,254
-454,7
-199,137
-589,654
-1228,341
-811,38
-398,79
-94,37
-574,529
-1081,190
-79,740
-0,252
-1231,679
-830,781
-933,499
-721,78
-1094,418
-1111,309
-330,21
-45,240
-377,334
-288,682
-373,673
-721,856
-570,408
-602,501
-1228,553
-120,855
-480,121
-15,206
-572,562
-1089,25
-213,59
-738,102
-1064,866
-1108,520
-438,535
-323,529
-129,253
-1158,156
-537,460
-822,194
-192,200
-110,476
-10,85
-1046,299
-109,894
-980,220
-1283,467
-150,185
-329,724
-976,570
-1002,315
-1111,36
-830,121
-102,225
-962,407
-298,619
-182,91
-1017,418
-842,229
-288,880
-790,730
-1094,476
-684,88
-237,602
-825,826
-1014,796
-520,730
-75,425
-42,487
-567,142
-422,760
-1048,863
-209,684
-350,784
-1064,2
-1309,537
-237,826
-1111,757
-510,763
-977,590
-333,690
-202,39
-671,179
-820,844
-870,154
-261,38
-502,637
-869,591
-787,171
-982,179
-972,693
-893,294
-970,701
-579,453
-415,757
-830,829
-1200,418
-1183,445
-169,68
-262,863
-570,800
-462,254
-1153,814
-1062,301
-366,180
-589,856
-684,724
-403,665
-664,686
-798,823
-1228,777
-740,184
-1022,880
-512,732
-1129,602
-565,70
-738,197
-642,417
-298,863
-202,72
-599,816
-1098,814
-209,808
-848,276
-890,292
-972,85
-512,823
-32,632
-1158,290
-1170,677
-1063,446
-560,37
-858,72
-507,577
-1146,844
-982,4
-82,697
-256,305
-862,233
-1268,535
-398,849
-785,894
-1146,50
-234,740
-791,427
-202,520
-441,59
-134,871
-979,305
-1216,857
-78,525
-1126,893
-475,627
-552,3
-626,88
-468,665
-206,768
-1248,539
-1141,640
-1022,628
-1094,87
-825,533
-937,572
-507,403
-475,688
-1076,357
-462,871
-1168,151
-294,581
-671,878
-1181,103
-922,785
-356,479
-994,578
-1094,212
-1129,714
-649,891
-6,548
-944,722
-164,498
-291,572
-259,609
-82,341
-262,656
-214,147
-1216,417
-1298,589
-748,817
-410,556
-792,47
-688,301
-1145,495
-99,78
-209,86
-848,501
-232,477
-80,866
-1136,145
-880,808
-388,86
-330,674
-1101,388
-20,86
-212,894
-1111,137
-294,352
-808,290
-115,383
-668,365
-753,38
-994,757
-688,262
-691,578
-1016,352
-704,646
-1310,642
-1305,814
-903,448
-256,66
-869,255
-261,341
-1241,556
-441,303
-1084,403
-1108,498
-865,506
-65,253
-579,889
-647,374
-837,826
-1231,663
-1160,709
-616,374
-341,98
-288,714
-616,618
-31,171
-457,194
-775,203
-644,593
-1002,579
-830,513
-790,619
-589,266
-493,556
-487,284
-378,378
-623,355
-537,322
-738,117
-602,22
-1288,217
-803,184
-134,514
-622,133
-1262,56
-1059,192
-1208,808
-1029,770
-246,700
-32,128
-1310,252
-1190,39
-654,700
-885,477
-731,565
-1126,227
-678,285
-1153,466
-512,443
-110,184
-314,305
-539,460
-212,313
-666,101
-890,537
-587,138
-512,60
-174,113
-388,785
-756,604
-264,355
-1302,14
-247,441
-544,756
-1268,631
-273,222
-244,33
-951,453
-1141,68
-497,309
-1104,96
-206,96
-644,145
-556,415
-356,514
-1231,602
-510,131
-393,273
-1067,880
-674,333
-1086,808
-62,539
-1113,399
-1153,500
-647,72
-743,581
-1049,592
-129,791
-750,470
-933,334
-987,529
-1245,78
-504,207
-162,833
-589,553
-883,219
-321,141
-1113,495
-902,642
-1288,5
-1310,267
-216,164
-102,274
-1118,276
-92,525
-197,399
-783,893
-1108,479
-1174,159
-1126,360
-1290,808
-360,581
-1083,219
-574,642
-858,863
-1166,561
-1098,894
-398,753
-179,206
-441,751
-1163,715
-520,66
-1101,210
-770,366
-823,610
-721,408
-537,758
-869,751
-209,210
-922,86
-1230,642
-653,226
-1272,284
-1235,665
-346,579
-782,679
-144,315
-735,208
-338,85
-1160,687
-403,814
-622,486
-1078,477
-1216,865
-869,415
-216,642
-1002,333
-903,14
-1250,337
-726,268
-1268,359
-333,304
-825,753
-15,878
-1168,443
-490,844
-1235,254
-448,238
-1193,460
-243,14
-736,642
-1158,705
-97,486
-209,360
-89,742
-448,296
-572,341
-120,416
-1104,855
-765,894
-818,331
-216,58
-311,715
-237,376
-165,495
-677,798
-206,208
-838,707
-261,240
-933,789
-243,343
-535,243
-552,172
-99,667
-1193,322
-853,103
-321,761
-276,875
-604,763
-705,782
-197,551
-621,476
-169,254
-261,592
-1044,360
-494,873
-816,469
-1063,448
-430,136
-1300,289
-1272,724
-734,598
-438,252
-1063,292
-994,469
-1094,164
-676,893
-820,115
-986,220
-169,305
-525,558
-484,168
-1148,509
-304,553
-1268,855
-803,240
-562,714
-808,604
-907,404
-442,56
-69,338
-552,669
-1067,103
-1004,758
-462,393
-388,557
-28,247
-703,831
-1193,710
-348,39
-495,541
-1282,170
-848,871
-1062,632
-1141,204
-935,642
-281,770
-1029,184
-1310,4
-83,880
-1143,801
-1198,358
-109,0
-1067,14
-606,248
-1303,486
-393,592
-1183,449
-112,222
-570,352
-242,800
-338,177
-21,880
-653,21
-826,726
-1176,171
-644,301
-817,63
-119,243
-994,809
-402,220
-770,390
-117,710
-895,137
-646,686
-1200,476
-813,141
-644,849
-502,604
-1298,141
-320,324
-981,537
-644,101
-994,593
-181,826
-402,668
-706,131
-721,273
-291,473
-790,207
-169,640
-157,309
-1096,747
-771,831
-964,561
-53,84
-684,199
-633,798
-8,686
-740,408
-605,334
-490,442
-761,694
-209,460
-1143,732
-475,533
-887,362
-981,170
-817,556
-248,262
-1006,105
-1211,227
-688,593
-825,690
-549,694
-1190,855
-161,831
-706,378
-512,386
-835,516
-179,267
-1165,180
-264,299
-1037,490
-181,68
-206,180
-888,760
-440,740
-552,225
-276,763
-420,537
-232,29
-972,301
-960,609
-1304,548
-21,677
-114,133
-308,333
-15,715
-880,225
-333,133
-1034,763
-94,857
-833,770
-1022,14
-1168,162
-783,130
-1211,78
-1300,301
-32,766
-248,301
-606,838
-1037,222
-545,446
-293,399
-443,12
-1012,754
-912,761
-961,798
-1232,296
-1046,595
-785,641
-682,287
-1245,553
-1096,147
-485,578
-1088,112
-535,203
-62,355
-738,777
-1200,710
-735,740
-304,110
-766,660
-694,714
-735,154
-1180,840
-167,732
-329,805
-209,388
-420,178
-1118,514
-278,374
-1178,91
-1200,471
-555,451
-567,581
-688,133
-1036,140
-330,873
-549,200
-915,61
-1153,585
-557,710
-216,490
-457,103
-706,740
-704,640
-306,136
-1118,694
-340,193
-35,124
-721,553
-800,259
-960,105
-634,893
-157,85
-484,726
-539,63
-900,786
-10,301
-570,497
-1126,534
-706,826
-1278,390
-622,856
-136,47
-604,740
-438,642
-1096,292
-2,642
-1193,584
-1272,276
-1073,68
-1216,134
-279,194
-619,578
-813,813
-1148,833
-222,112
-908,220
-0,890
-769,507
-951,5
-1216,477
-540,504
-900,645
-2,252
-427,3
-487,162
-415,889
-152,829
-1104,544
-858,822
-1083,667
-823,93
-574,252
-68,246
-206,574
-234,357
-527,893
-1048,656
-1153,309
-601,404
-944,14
-869,59
-1062,262
-716,758
-452,844
-1054,33
-356,619
-621,418
-922,115
-1062,77
-1272,732
-251,254
-950,408
-755,451
-113,507
-1126,1
-247,448
-462,501
-406,525
-12,589
-731,192
-1118,619
-954,514
-708,393
-338,501
-420,716
-1223,752
-251,192
-114,528
-10,605
-359,441
-1260,803
-1022,714
-621,847
-1213,408
-1066,504
-644,641
-1131,267
-1231,154
-32,537
-579,329
-766,138
-1017,866
-798,732
-
-fold along x=655
-fold along y=447
-fold along x=327
-fold along y=223
-fold along x=163
-fold along y=111
-fold along x=81
-fold along y=55
-fold along x=40
-fold along y=27
-fold along y=13
-fold along y=6
diff --git a/13/paperfolder.hs b/13/paperfolder.hs
deleted file mode 100644
index 1e8a4e7..0000000
--- a/13/paperfolder.hs
+++ /dev/null
@@ -1,86 +0,0 @@
-import           Data.List (foldl', nub)
-import           Parsing   (parseCoordinates, splitByString)
-
-main :: IO ()
-main = do
-  input <- getContents
-  let
-    instructions = parseInstructions input
-  (putStrLn . show . solution1) instructions
-  (putStr . solution2) instructions
-
-solution1 :: ([(Int, Int)], [(Int, Int)]) -> Int
-solution1 (paper, folds) = (length . nub) (foldPaper paper (folds !! 0))
-
-solution2 :: ([(Int, Int)], [(Int, Int)]) -> String
-solution2 (paper, folds) = printPaper (foldl' (foldPaper) paper folds)
-
-foldPaper :: [(Int, Int)] -> (Int, Int) -> [(Int, Int)]
-foldPaper paper axis = map (fold axis) paper
-  where
-    fold :: (Int, Int) -> (Int, Int) -> (Int, Int)
-    fold (0, a) (x, y)
-      | y < a = (x, y)
-      | y > a = (x, flipCoord y a)
-    fold (a, 0) (x, y)
-      | x < a = (x, y)
-      | x > a = (flipCoord x a, y)
-    fold _ _ = undefined -- Only axis-folds are defined
-    flipCoord :: Int -> Int -> Int
-    flipCoord c a = a - (c - a)
-
-printPaper :: [(Int, Int)] -> String
-printPaper = unlines . coordsToPaper
-  where
-    coordsToPaper :: [(Int, Int)] -> [String]
-    coordsToPaper dots = [[if (x, y) `elem` dots then '█' else ' ' |
-                           x <- [0..maximum (map fst dots)]] |
-                          y <- [0..maximum (map snd dots)]]
-
-parseInstructions :: String -> ([(Int, Int)], [(Int, Int)])
-parseInstructions input =
-  (dots, folds)
-  where
-    split :: [String]
-    split = splitByString "\n\n" input
-    dots :: [(Int, Int)]
-    dots = (parseCoordinates . head) split
-    folds :: [(Int, Int)]
-    folds = (map (tuplify . splitByString "=") . lines . last) split
-    tuplify :: [String] -> (Int, Int)
-    tuplify [] = error "Can't turn an empty list into fold instructions"
-    tuplify (fold:axis)
-      | last fold == 'x' = (read (head axis), 0)
-      | last fold == 'y' = (0, read (head axis))
-      | otherwise = error "Fold instructions must go across x or y"
-
--- Tests
-
-testInput1 = unlines [
-  "6,10",
-  "0,14",
-  "9,10",
-  "0,3",
-  "10,4",
-  "4,11",
-  "6,0",
-  "6,12",
-  "4,1",
-  "0,13",
-  "10,12",
-  "3,4",
-  "3,0",
-  "8,4",
-  "1,10",
-  "2,14",
-  "8,10",
-  "9,0",
-  "",
-  "fold along y=7",
-  "fold along x=5"]
-
-testInput1Parsed = parseInstructions testInput1
-test1 = solution1 testInput1Parsed
-test2 = putStr (solution2 testInput1Parsed)
-
-testPrinted1 = putStr (printPaper (foldPaper (fst testInput1Parsed) (head (snd testInput1Parsed))))
diff --git a/14/Itertools.hs b/14/Itertools.hs
deleted file mode 100644
index 338d017..0000000
--- a/14/Itertools.hs
+++ /dev/null
@@ -1,14 +0,0 @@
-module Itertools (
-  flatmap,
-  windows
-  ) where
-
-windows :: Int -> [a] -> [[a]]
-windows _ [] = []
-windows i (x:xs)
-  | length xs < i-1 = []
-  | otherwise = (x:take (i-1) xs):windows i xs
-
-flatmap :: (t -> [a]) -> [t] -> [a]
-flatmap _ []     = []
-flatmap f (x:xs) = f x ++ flatmap f xs
diff --git a/14/Parsing.hs b/14/Parsing.hs
deleted file mode 100644
index db81f77..0000000
--- a/14/Parsing.hs
+++ /dev/null
@@ -1,32 +0,0 @@
-module Parsing (
-  splitByString,
-  parseCoordinates
-  ) where
-
-import           Data.List (isPrefixOf)
-
-splitByString :: String -> String -> [String]
-splitByString _ "" = []
-splitByString splitter string =
-  let (chunk, rest) = spanNextSplit string
-  in
-    chunk:(splitByString splitter rest)
-    where
-      spanNextSplit :: String -> (String, String)
-      spanNextSplit [] = ([], [])
-      spanNextSplit everything@(char:rest)
-        | splitter `isPrefixOf` rest =
-          ([char], (drop ((length splitter) + 1) everything))
-        | otherwise =
-          let
-            (start, end) = spanNextSplit rest
-          in
-            (char:start, end)
-
-parseCoordinates :: String -> [(Int, Int)]
-parseCoordinates =
-  map (tuplify . map read . splitByString ",") . lines
-  where
-    tuplify :: [a] -> (a, a)
-    tuplify [a, b] = (a, b)
-    tuplify _      = error "Can't parse coordinates from non-2-sized lists"
diff --git a/14/Reducers.hs b/14/Reducers.hs
deleted file mode 100644
index 8a3f149..0000000
--- a/14/Reducers.hs
+++ /dev/null
@@ -1,28 +0,0 @@
-module Reducers (
-  leastMostOcc,
-  leastMost,
-  most,
-  least
-  ) where
-
-import           Data.List (group, sortBy, sort)
-import           Data.Ord  (comparing)
-
-groupOccurrences :: (Ord a) => [a] -> [[a]]
-groupOccurrences = sortBy (comparing length) . group . sort
-
-leastMostOcc :: (Ord a) => [a] -> (Int, Int)
-leastMostOcc list = ((length . last) occ, (length . head) occ)
-  where
-    occ = groupOccurrences list
-
-leastMost :: (Ord a) => [a] -> (a, a)
-leastMost list = ((head . last) occ, (head . head) occ)
-  where
-    occ = groupOccurrences list
-
-least :: (Ord a) => [a] -> a
-least = fst . leastMost
-
-most :: (Ord a) => [a] -> a
-most = snd . leastMost
diff --git a/14/input.txt b/14/input.txt
deleted file mode 100644
index 3602070..0000000
--- a/14/input.txt
+++ /dev/null
@@ -1,102 +0,0 @@
-BSONBHNSSCFPSFOPHKPK
-
-PF -> P
-KO -> H
-CH -> K
-KN -> S
-SS -> K
-KB -> B
-VS -> V
-KV -> O
-KP -> B
-OF -> C
-HB -> C
-NP -> O
-NS -> V
-VO -> P
-VF -> H
-CK -> B
-PC -> O
-SK -> O
-KF -> H
-FV -> V
-PP -> H
-KS -> B
-FP -> N
-BV -> V
-SB -> F
-PB -> B
-ON -> F
-SF -> P
-VH -> F
-FC -> N
-CB -> H
-HP -> B
-NC -> B
-FH -> K
-BF -> P
-CN -> N
-NK -> H
-SC -> S
-PK -> V
-PV -> C
-KC -> H
-HN -> K
-NO -> H
-NN -> S
-VC -> P
-FF -> N
-OO -> H
-BK -> N
-FS -> V
-BO -> F
-SH -> S
-VK -> F
-OC -> F
-FN -> V
-OV -> K
-CF -> F
-NV -> V
-OP -> K
-PN -> K
-SO -> P
-PS -> S
-KK -> H
-HH -> K
-NH -> O
-FB -> K
-HS -> B
-BB -> V
-VB -> O
-BH -> H
-OK -> C
-CC -> B
-FK -> N
-SN -> V
-HK -> N
-KH -> F
-OS -> O
-FO -> P
-OH -> B
-CP -> S
-BN -> H
-OB -> B
-BP -> B
-CO -> K
-SP -> K
-BS -> P
-VV -> N
-VN -> O
-NF -> F
-CV -> B
-HC -> B
-HV -> S
-BC -> O
-HO -> H
-PO -> P
-CS -> B
-PH -> S
-SV -> V
-VP -> C
-NB -> K
-HF -> C
diff --git a/14/polymerization.hs b/14/polymerization.hs
deleted file mode 100644
index 5284420..0000000
--- a/14/polymerization.hs
+++ /dev/null
@@ -1,121 +0,0 @@
-import           Data.List       (maximumBy, minimumBy)
-import           Data.Map.Strict (Map, (!))
-import qualified Data.Map.Strict as Map
-import           Data.Ord        (comparing)
-import           Itertools       (flatmap, windows)
-import           Parsing         (splitByString)
-import           Reducers        (leastMostOcc)
-
-main :: IO ()
-main = do
-  input <- getContents
-  let
-    polymer = parsePolymer input
-  (putStrLn . show . solution1) polymer
-  (putStrLn . show . solution2) polymer
-
-parsePolymer :: String -> ([Char], Map [Char] Char)
-parsePolymer input = (template input, rules input)
-  where
-    template :: String -> String
-    template = head . splitByString "\n\n"
-    rules :: String -> Map [Char] Char
-    rules = Map.fromList . map tupelize . map (splitByString " -> ") . lines . last . splitByString "\n\n"
-    tupelize :: [String] -> ([Char], Char)
-    tupelize untupled = (head untupled, (head . last) untupled)
-
-solution1 :: ([Char], Map [Char] Char) -> Int
-solution1 (template, rules) = uncurry (-) (leastMostOcc (polymerizeN rules template 10))
-
-solution2 :: ([Char], Map [Char] Char) -> Int
-solution2 (template, rules) = ((snd . most) polyCounts) - ((snd . least) polyCounts)
-  where
-    polyCounts :: Map Char Int
-    polyCounts = polyCounter rules template 40
-    least = minimumBy (comparing snd) . Map.assocs
-    most = maximumBy (comparing snd) . Map.assocs
-
-polymerizeN :: Map [Char] Char -> [Char] -> Int -> [Char]
-polymerizeN rules template i = iterate (polymerize rules) template !! i
-
-polymerize :: Map [Char] Char -> [Char] -> [Char]
-polymerize rules template = step template
-  where
-    step :: [Char] -> [Char]
-    step []      = []
-    step [final] = [final]
-    step (x:xs)  = x:(rules ! [x, head xs]):(step xs)
-
--- Since we don't actually need to synthesize the polymer, but only
--- need to know how many of each elements occur, we can get around
--- having to create a ridiculously large list by operating on the rule
--- pairs instead.
---
--- E.g. NNCB -> NCNBCHB (see testInput1), in this case we turn:
---
---   - NN -> NC, CN
---   - NC -> NB, BC
---   - CB -> CH, HB
---
--- All we need to do is keep track of the counts of these
--- sub-sequences, not of the full polymer.
---
--- To get back to the individual elements, we then just need to
--- de-window it all again.
-polyCounter :: Map [Char] Char -> [Char] -> Int -> Map Char Int
-polyCounter rules template iterations = elCounts
-  where
-    initial :: Map [Char] Int
-    initial = (Map.fromListWith (+) . map (\e -> (e, 1)) . windows 2) template
-    step :: Map [Char] Int -> Map [Char] Int
-    step = Map.fromListWith (+) . flatmap resultingPolies . Map.assocs
-    resultingPolies :: ([Char], Int) -> [([Char], Int)]
-    resultingPolies (p, i) = [([head p, c], i), ([c, last p], i)]
-      where c = rules ! p
-    polyCounts :: Map [Char] Int
-    polyCounts = iterate step initial !! iterations
-
-    -- Because the windows are size 2, every element of a sub-binding is
-    -- counted twice (e.g. NBCBC -> NB, BC, CB, BC), except the first and
-    -- last element. We know the first and last elements (because we
-    -- operated on windows, they'll match the first and last of the
-    -- template), so we can un-window the whole batch by dividing their
-    -- number of occurrences by two, except for the first and last, where
-    -- we subtract the number by 1 first and add 1 back later.
-    elCounts :: Map Char Int
-    elCounts = Map.mapWithKey deWindow naiveSum
-      where
-        els :: ([Char], Int) -> [(Char, Int)]
-        els (p, i) = [(head p, i), (last p, i)]
-        naiveSum :: Map Char Int
-        naiveSum = (Map.fromListWith (+) . flatmap els . Map.assocs) polyCounts
-        deWindow :: Char -> Int -> Int
-        deWindow c i
-          | c == head template || c == last template = (i - 1) `quot` 2 + 1
-          | otherwise = i `quot` 2
-
--- Tests
-
-testInput1 = unlines [
-  "NNCB",
-  "",
-  "CH -> B",
-  "HH -> N",
-  "CB -> H",
-  "NH -> C",
-  "HB -> C",
-  "HC -> B",
-  "HN -> C",
-  "NN -> C",
-  "BH -> H",
-  "NC -> B",
-  "NB -> B",
-  "BN -> B",
-  "BB -> N",
-  "BC -> B",
-  "CC -> N",
-  "CN -> C"]
-
-parsedTestInput1 = parsePolymer testInput1
-test1 = solution1 parsedTestInput1 -- 1588
-test2 = solution2 parsedTestInput1 -- 2188189693529
diff --git a/9/Parsing.hs b/9/Parsing.hs
deleted file mode 100644
index 8ad0f3f..0000000
--- a/9/Parsing.hs
+++ /dev/null
@@ -1,23 +0,0 @@
-module Parsing (
-  splitByString
-  ) where
-
-import           Data.List (isPrefixOf)
-
-splitByString :: String -> String -> [String]
-splitByString _ "" = []
-splitByString splitter string =
-  let (chunk, rest) = spanNextSplit string
-  in
-    chunk:(splitByString splitter rest)
-    where
-      spanNextSplit :: String -> (String, String)
-      spanNextSplit [] = ([], [])
-      spanNextSplit everything@(char:rest)
-        | splitter `isPrefixOf` rest =
-          ([char], (drop ((length splitter) + 1) everything))
-        | otherwise =
-          let
-            (start, end) = spanNextSplit rest
-          in
-            (char:start, end)
diff --git a/9/input.txt b/9/input.txt
deleted file mode 100644
index 860ccaa..0000000
--- a/9/input.txt
+++ /dev/null
@@ -1,100 +0,0 @@
-9987675345698765453987654321234589999899878923493212345678999998656782467898999899878301234578998787
-9876543234789765322398743210123567898789767899986101239899789876543101567897898798763212355989987656
-3987784014897654310987654331235679965697644998765232345997654989765212799956999679854343466799976545
-2199875323998765421298776542346789434595433498754345456789543499876353489549876542975858977899876439
-1012965439899896432359987667457896546789322349987656987898932445987454578932987621986767898943989598
-2125976598798989943467898876589999858899910959898767898976101234598966689431298320987898999432399987
-3234987987656579894578989987679998769999899898769879999965422345679298995420139434598999896543459875
-4346799876545456789679877898789769878989798799656989899876563496799109989591298548999689789656598764
-5956998765434345698989765679895456989678679678943496789988689989898997979989987657987565698787989543
-6899898764321234567999876989954345696534598789432134679999799976987656765778998769766464989999865432
-7987679653210155789999997899875456789323999899521012345899899765698943254667999898954353578999654321
-9696598654323234589788998998986567898919894958933423456789999753459892123458998987893212467898765432
-8543498765434545679567899987987679987898743147894934567898989432398789334767987876789101298989876543
-7656789878545656789338989876598789986797654235679895678997878941987678975879896545698914345678987654
-9868998989656877892129678965439899975498754346998796789986867932954569986798765434567895458989998765
-8979987798787898921012567894321999874329985459876589899985457899873458987987654323469986567899869876
-7899876549898959999923456789432398765909876567987678999875322987654567898998773212378997698998754987
-6534997831999943987894567897543999899899987878998789789964201298765678919679654323456789799987632399
-5424598942689899876789678987659899988788999989019895699865362349986989103498795434567899899996549989
-4212349653498789765699989798798789877697898999999924789976457899798993212379986747698946999897998878
-5334569878989678934998995679987678954545987899789935689987567987649898763467897858789235798789887867
-6446878989876569976897893459876567893239876797689898789397679893234789654598998979999546999698785458
-7557989199987457898956789998984348994124965323486789895498798789123569875989109989898969898598654345
-8998994398796346899545699876543236789549876412345678979569987679023456989878992398767898767469643234
-9999689987654235695434689987652125678956987954456789768979876568994568999867989987659999955398759345
-7887578976543123489545679698983234789768998765677993457899765456789878997654878998767899843229898956
-6543469998768245678956789529865445899879999896798912349998987347899989989653467899879998732019987897
-7672398999875456989767895439876556789989989999899102356987798456789899878932356789989987643498976789
-8954987899986567899878976546989667993498979978976212469996549567895798969991245699899998754987685698
-9769876989987898901989997656898789101997768769895433498765439878934987656789346789788999869876564567
-9898765778998979312397899767999893249876753656789656569976524989423976546789498997697986998765473456
-3987654569789765434456976978999974756965432345678987678987734694319887635689989998456894219874321567
-2198733477678978645797895989989865669876543766799998789599848789998765212678979999367975323985432378
-3989821234568999756898934599878976798998754567898999897679959899899874323599867895459876434596543458
-9876432347679549887969423498969987897989865698997899979898767998798765435679756899567987546987654567
-9876543489789832998953210987658998996579878789876588965939989987659987546789645688979987657898785678
-3987654579898721239998723976547899987467989999995477894321098765545698687895436577898998898999896789
-2398766789989654359899644597656999876345697679654356965434197543434989798954323456987899939998987893
-1239887894678965498788987698987999765234789598765467896545976532129879899996534567896789123976798912
-0945998923567896997687898999298987653123696439876588987679876549098765945987965778945693239875459901
-9896789434678999876575999899399199762064594321987678998789989698987654326599878989238789459954345899
-6797898645789998767434598798989349872165689410198989769899898997898543212367989994345678998986254678
-5789949756894987654323497687878959989278796521239797653998767876799654302456999965456899987432123689
-4569439887893998799934598576967898995478897432345698992989545665698775212567899876697899876543234567
-5678921998969899987899974475459997898567998945456789989878932124569854323498976989989965987654345678
-6799990199656789876798863212349976987678999896897899879767893234698765434578965699878974598785458789
-9899989989543298765987652101267895999799998789998998968456789345999879545679854598767943459987569893
-3998979678932129894598543323458934889934987698999987654345895469876997656789765987659894567998678942
-1987667569892099989679656445667895679899876597896596543256896567989998789899876798547689978999789531
-9876553456789989878998767986898996798788995456789987752125789678998999897999987899534567899989898940
-8765432345679878967999899597959789987576789347899876543234589789987899975689999987656789929876967891
-8764321234698766556899995329345678987455678956789989684348678999876798764567898998769893212975456932
-9863210123459654345688989910258789876323589969894398765457789998765679923459987869878999109864349894
-9854525234598743234567979891345897995474567898989239878767899997654567895678996555989998919753239789
-9765434545987655455679865789457896986567678967878946989878959876543456789789789434599987898954398679
-9896565656898766767999954567978965497678989656567898998989245988652346799894698765679876767895976532
-9987879768999879879878323489989654398789893432349899987690159899721278967923989876798965456987987699
-8998989879988989998965412397898765219899762101234789996521998798754367899999878987987654347898998987
-7659395989876897987654323456789898323998753242345678989439887699865456899989769999876543236789019986
-8543214598765456798987654589896987536789894355456989879598754589876967999877658999997655345678998965
-7654323679876578969999865678945698545678976566567898769987653479989898998766546898998786457799987654
-8795498793997989657899976789234987657799987677678965657898794567998789987653234567899898568899998723
-9989989932398996546789989890123498968989998788789654346789887679899678996442123458901987678999899812
-9878879993989875237899999989254989979878999899898766869895998997676567894321015667892398789999798923
-7767767989878943123978999878969978998967899922939878998953219876565456976534124578943469999988697654
-6553459876767894234568986767898767987656789210125989987994101985432389997645234567894590129876598785
-5432345985458995679799875456989659876545456991234899876789919996676569987656545678965989239988439986
-4321359894346789789987654345678943965434345789546799765679898987787878998787656989879879998895321298
-5430198765497899894298763234567899876521234899987987654598787999898989109898767899998967897654210129
-6541679876989945999987654345678989987752345678999999766987656579999793212999878999987656789775323234
-6432589989877899998998765476989978998843459789998939878996545468989654329989999998798787894989876545
-7543458998965778987679976687898767898754678999987923989876432345678976498978989987659898943497987676
-8654567987854567896563987798998656899865789019876894599987321238789098987967878998743989932346798888
-9766779876543488997432398899987745679877892198765789998765450139989129876754568999974567895459999999
-9877898765632356789543459921096434567988943989654567899986521234678998765323467899865679976598897912
-9988987654521237989699567899987558978999659876543457899987634656899986544212456789877889987987656893
-9999996543210357678987998998998667989431968997652346998998785667901997432101348995998994398996545789
-8932987987631234589476789987689978999599878994321345997899996778929899546712467894239987469997434679
-7891098876546349679345678965578899998989989989935459876979897889298778994324578943190296599989323567
-6989129989865478993234567893456799987878998776896567965468789990199656989435678954989987989978934569
-5678949999976569310123689932345689876569899565789778984345688999987645678945789769979999878767897698
-4567898999987679453294594321017992985498765434698999993234567898765434899656899998768999765457898987
-7698987898799789564989695532399891996309899323456789832125678919876325999797999887657987654346789876
-8999876789654998679879989649989799876212987437899898761012348901985476789898998765431298743235689985
-9899965689543249998765679998767678965429876556945987652125667899876787899979459963210139852123798954
-8788754799932129879654587789656567896578987987899876543234799998989898998764349854321298764234567893
-7656543458794298965443445678932456789789598998901997654345678997693939789943298765432359879876899952
-6543252345679987654352237899751577899895459789212398897656889986542124599892109887545456989987896541
-8432101489989999875210128932967698998901345699924569998767994987431023999789213998676569995699965430
-7654312678999998996321239999878789767892396989895678989879993976545129897678954598789678934567976521
-8976433589998767987542356789999891557789989978789789467998989897685398789569899989899789325679897432
-9987544567899655698653468999987910345679878765678992345987878799896987667348798976949895434599789545
-9999655778999543219766567899876621234598765454567891249876567689929876543237667895435976565987679656
-8798789989988959309877678999765432545699654323479910134995456578912997632123456789523498878996598977
-6549891299876898912988989789876547686987543212567891239984323469329876321014567898654569989985456799
-1234932997764667893499995678987658798998654403459932398765012478998765432125678979866789699876345678
-0356799876543456994567894567898967899019873212378993987654139989219876843336789565977896579843234589
-1235789987532345789978943456899878978929764323456789398543248892101998765459895434598965498765445678
-2356897698421234567899432346789989767899875435668891239654356789432789887567976323699654329876786789
-3567896543210246788987541457892499848921986546879910129767568996545699998678988434789543210989897899
diff --git a/9/smokescreen.hs b/9/smokescreen.hs
deleted file mode 100644
index 4e10187..0000000
--- a/9/smokescreen.hs
+++ /dev/null
@@ -1,77 +0,0 @@
-import           Data.Char (digitToInt)
-import           Data.List (nub, sortBy)
-import           Data.Ord
-
-main :: IO ()
-main = do
-  input <- getContents
-  let
-    heightMap = parseHeights input
-  (putStrLn . show . solution1) heightMap
-  (putStrLn . show . solution2) heightMap
-
-solution1 :: [[Int]] -> Int
-solution1 heights = sum (map (\p -> heights !!! p + 1) (lowPoints heights))
-
-solution2 :: [[Int]] -> Int
-solution2 heights = product (take 3 (sortBy (comparing Down) (map length basins)))
-  where
-    basins :: [[(Int, Int)]]
-    basins = map (flip basin heights) (lowPoints heights)
-
-basin :: (Int, Int) -> [[Int]] -> [(Int, Int)]
-basin point heights
-  | null next = []
-  | otherwise = nub (point:(next)++flatmap (flip basin heights) next)
-    where
-      next = filter partOfBasin (adjacent point heights)
-      partOfBasin x =
-        let
-          xHeight = heights !!! x
-        in
-          xHeight > heights !!! point && xHeight /= 9
-
-flatmap :: (t -> [a]) -> [t] -> [a]
-flatmap _ []     = []
-flatmap f (x:xs) = f x ++ flatmap f xs
-
-lowPoints :: [[Int]] -> [(Int, Int)]
-lowPoints heights = filter (flip isLowPoint heights) (indices heights)
-  where
-    indices :: [[Int]] -> [(Int, Int)]
-    indices m = [(x, y) |
-                  x <- [0..length(m)-1],
-                  y <- [0..length(m !! 0)-1]]
-
-isLowPoint :: (Int, Int) -> [[Int]] -> Bool
-isLowPoint point m = all (> (m !!! point)) (map ((!!!) m) (adjacent point m))
-
-(!!!) :: [[Int]] -> (Int, Int) -> Int
-(!!!) m index = m !! (fst index) !! (snd index)
-
-adjacent :: (Int, Int) -> [[Int]] -> [(Int, Int)]
-adjacent (x, y) m =
-  [(i+x, j+y) |
-    i <- [-1..1],
-    j <- [-1..1],
-    abs i /= abs j,
-    i+x >= 0 && i+x < length(m),
-    j+y >= 0 && j+y < length(m !! 0)]
-
-parseHeights :: String -> [[Int]]
-parseHeights = map (map digitToInt) . lines
-
--- Tests
-
-testInput = unlines [
-  "2199943210",
-  "3987894921",
-  "9856789892",
-  "8767896789",
-  "9899965678"
-  ]
-
-testInputParsed = parseHeights testInput
-
-test1 = solution1 testInputParsed -- 15
-test2 = solution2 testInputParsed -- 1134