day4: Complete second puzzle
Yes, this is more than mildly horrible. But it's late and this works.
This commit is contained in:
parent
9f2834701a
commit
812c45125c
18
4/bingo.hs
18
4/bingo.hs
|
@ -1,5 +1,5 @@
|
||||||
import Control.Exception (assert)
|
import Control.Exception (assert)
|
||||||
import Data.List (elemIndices, groupBy, minimumBy, transpose)
|
import Data.List (elemIndices, groupBy, maximumBy, minimumBy, transpose)
|
||||||
import Data.Maybe (isJust, listToMaybe)
|
import Data.Maybe (isJust, listToMaybe)
|
||||||
import Data.Ord (comparing)
|
import Data.Ord (comparing)
|
||||||
import Debug.Trace (traceShowId)
|
import Debug.Trace (traceShowId)
|
||||||
|
@ -7,10 +7,14 @@ import Debug.Trace (traceShowId)
|
||||||
main = do
|
main = do
|
||||||
bingoInput <- getContents
|
bingoInput <- getContents
|
||||||
putStrLn (solution1 bingoInput)
|
putStrLn (solution1 bingoInput)
|
||||||
|
putStrLn (solution2 bingoInput)
|
||||||
|
|
||||||
solution1 :: String -> String
|
solution1 :: String -> String
|
||||||
solution1 = show . scoreBingo . shortestBingo . parseBingos
|
solution1 = show . scoreBingo . shortestBingo . parseBingos
|
||||||
|
|
||||||
|
solution2 :: String -> String
|
||||||
|
solution2 = show . scoreBingo . longestBingo . parseBingos
|
||||||
|
|
||||||
parseBingos :: String -> ([Int], [[[Int]]])
|
parseBingos :: String -> ([Int], [[[Int]]])
|
||||||
parseBingos input = (calls, cards)
|
parseBingos input = (calls, cards)
|
||||||
where
|
where
|
||||||
|
@ -27,6 +31,15 @@ parseBingos input = (calls, cards)
|
||||||
chunksToNumbers :: [[String]] -> [[[Int]]]
|
chunksToNumbers :: [[String]] -> [[[Int]]]
|
||||||
chunksToNumbers = map linesToNumbers
|
chunksToNumbers = map linesToNumbers
|
||||||
|
|
||||||
|
longestBingo :: ([Int], [[[Int]]]) -> ([Int], [Int])
|
||||||
|
longestBingo (calls, cards) =
|
||||||
|
maximumBy (comparing bingoLength) solvedBingos
|
||||||
|
where
|
||||||
|
bingoLength :: ([Int], [Int]) -> Int
|
||||||
|
bingoLength (start, _) = length start
|
||||||
|
solvedBingos :: [([Int], [Int])]
|
||||||
|
solvedBingos = map (uncurry solveBingo) (zip (repeat calls) cards)
|
||||||
|
|
||||||
shortestBingo :: ([Int], [[[Int]]]) -> ([Int], [Int])
|
shortestBingo :: ([Int], [[[Int]]]) -> ([Int], [Int])
|
||||||
shortestBingo (calls, cards) =
|
shortestBingo (calls, cards) =
|
||||||
minimumBy (comparing bingoLength) solvedBingos
|
minimumBy (comparing bingoLength) solvedBingos
|
||||||
|
@ -99,6 +112,9 @@ testInput1 = unlines [
|
||||||
test1 :: String
|
test1 :: String
|
||||||
test1 = assert ((solution1 testInput1) == "4512") "success"
|
test1 = assert ((solution1 testInput1) == "4512") "success"
|
||||||
|
|
||||||
|
test2 :: String
|
||||||
|
test2 = assert ((solution2 testInput1) == "1924") "success"
|
||||||
|
|
||||||
isSublistTest1 = isSublist [0, 1, 2] [0, 1, 2, 3]
|
isSublistTest1 = isSublist [0, 1, 2] [0, 1, 2, 3]
|
||||||
isSublistTest2 = isSublist [0, 1, 2] [0, 1, 3]
|
isSublistTest2 = isSublist [0, 1, 2] [0, 1, 3]
|
||||||
isSublistTest3 = isSublist [0, 1, 3] [0, 1, 3]
|
isSublistTest3 = isSublist [0, 1, 3] [0, 1, 3]
|
||||||
|
|
Loading…
Reference in a new issue