aboutsummaryrefslogtreecommitdiff
path: root/Puzzle24.hs
blob: d4578334156f527dd47465b3f3652fdb8d9538ce (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
-- Author: Yuchen Pei (me@ypei.me)
-- Acknowledgements:
-- https://www.reddit.com/r/adventofcode/comments/7lte5z/2017_day_24_solutions/drs1eml/
-- https://stackoverflow.com/a/4708372/4063224
import Data.List (delete, concatMap)
import Data.List.Split (splitOn)

extBridge :: [Int] -> [[Int]] -> [[Int]]
extBridge xs ys
  | null zs = [xs]
  | otherwise = concatMap f zs
    where x = head xs
          zs = filter (elem x) ys
          f [y, z] = extBridge (if y == x then (z:y:xs) else (y:z:xs)) (delete [y, z] ys)

parseInput :: [Char] -> [[Int]]
parseInput xs = (fmap read . splitOn "/") <$> splitOn "\n" xs

solve1 :: [Char] -> Int
solve1 = maximum . fmap sum . (extBridge [0]) . parseInput

solve2 :: [Char] -> Int
solve2 = snd . maximum . fmap (\xs -> (length xs, sum xs)) . (extBridge [0]) . parseInput

input0 = "0/2\n2/2\n2/3\n3/4\n3/5\n0/1\n10/1\n9/10"

input = "50/41\n19/43\n17/50\n32/32\n22/44\n9/39\n49/49\n50/39\n49/10\n37/28\n33/44\n14/14\n14/40\n8/40\n10/25\n38/26\n23/6\n4/16\n49/25\n6/39\n0/50\n19/36\n37/37\n42/26\n17/0\n24/4\n0/36\n6/9\n41/3\n13/3\n49/21\n19/34\n16/46\n22/33\n11/6\n22/26\n16/40\n27/21\n31/46\n13/2\n24/7\n37/45\n49/2\n32/11\n3/10\n32/49\n36/21\n47/47\n43/43\n27/19\n14/22\n13/43\n29/0\n33/36\n2/6"