Day 12 in the worst way possible
This commit is contained in:
110
day12/Commons.hs
Normal file
110
day12/Commons.hs
Normal file
@@ -0,0 +1,110 @@
|
||||
module Commons where
|
||||
|
||||
import GHC.IO.Handle (isEOF)
|
||||
import Data.List.Utils (split)
|
||||
|
||||
|
||||
data Spring = Operational | Damaged | Unknown deriving (Eq, Show)
|
||||
data Row = Row { springs :: [Spring], groups :: [Int] }
|
||||
|
||||
|
||||
parseSprings :: String -> [Spring]
|
||||
parseSprings [] = []
|
||||
parseSprings ('.': t) = Operational: parseSprings t
|
||||
parseSprings ('#': t) = Damaged: parseSprings t
|
||||
parseSprings ('?': t) = Unknown: parseSprings t
|
||||
|
||||
parse :: IO [Row]
|
||||
parse = do done <- isEOF
|
||||
if done
|
||||
then return []
|
||||
else do line <- getLine
|
||||
let rawSprings: rawGroups: _ = split " " line
|
||||
springs = parseSprings rawSprings
|
||||
groups = map read $ split "," rawGroups
|
||||
otherRows <- parse
|
||||
return $ Row {springs = springs, groups = groups}: otherRows
|
||||
|
||||
|
||||
isPossiblyDamaged :: [Spring] -> Bool
|
||||
isPossiblyDamaged [] = True
|
||||
isPossiblyDamaged (Operational: t) = False
|
||||
isPossiblyDamaged (_: t) = isPossiblyDamaged t
|
||||
|
||||
getNPossibleArrangements :: [Int] -> [Spring] -> Int
|
||||
getNPossibleArrangements [] (Damaged: t) = 0
|
||||
getNPossibleArrangements [] (_: t) = getNPossibleArrangements [] t
|
||||
getNPossibleArrangements (1: h: t) (Unknown: Unknown: Unknown: Unknown: Damaged: tsprings)
|
||||
| h == 1 = 3 * getNPossibleArrangements (h: t) (Damaged: tsprings)
|
||||
+ getNPossibleArrangements t (Damaged: tsprings)
|
||||
+ getNPossibleArrangements (1: h: t) (Damaged: tsprings)
|
||||
| h == 2 = 2 * getNPossibleArrangements (h: t) (Unknown: Damaged: tsprings)
|
||||
+ getNPossibleArrangements (h: t) (Damaged: tsprings)
|
||||
+ getNPossibleArrangements (1: h: t) (Damaged: tsprings)
|
||||
| h > 2 = getNPossibleArrangements (h: t) (Damaged: tsprings)
|
||||
+ getNPossibleArrangements (h: t) (Unknown: Damaged: tsprings)
|
||||
+ getNPossibleArrangements (h: t) (Unknown: Unknown: Damaged: tsprings)
|
||||
+ getNPossibleArrangements (1: h: t) (Damaged: tsprings)
|
||||
getNPossibleArrangements (1: h: t) (Unknown: Unknown: Unknown: Damaged: tsprings)
|
||||
| h == 1 = 2 * getNPossibleArrangements (h: t) (Damaged: tsprings)
|
||||
+ getNPossibleArrangements (1: h: t) (Damaged: tsprings)
|
||||
| h > 1 = getNPossibleArrangements (h: t) (Damaged: tsprings)
|
||||
+ getNPossibleArrangements (h: t) (Unknown: Damaged: tsprings)
|
||||
+ getNPossibleArrangements (1: h: t) (Damaged: tsprings)
|
||||
getNPossibleArrangements (1: t) (Unknown: Unknown: Damaged: tsprings)
|
||||
= getNPossibleArrangements t (Damaged: tsprings)
|
||||
+ getNPossibleArrangements (1: t) (Damaged: tsprings)
|
||||
getNPossibleArrangements (1: h: t) (Unknown: Unknown: Unknown: Unknown: Operational: tsprings)
|
||||
| h == 1 = 4 * getNPossibleArrangements (h: t) tsprings + 3 * getNPossibleArrangements t tsprings
|
||||
+ getNPossibleArrangements (1: h: t) tsprings
|
||||
| h == 2 = 4 * getNPossibleArrangements (h: t) tsprings + getNPossibleArrangements t tsprings
|
||||
+ getNPossibleArrangements (1: h: t) tsprings
|
||||
| h > 2 = 4 * getNPossibleArrangements (h: t) tsprings + getNPossibleArrangements (1: h: t) tsprings
|
||||
getNPossibleArrangements (1: h: t) (Unknown: Unknown: Unknown: Operational: tsprings)
|
||||
| h == 1 = 3 * getNPossibleArrangements (h: t) tsprings + getNPossibleArrangements t tsprings
|
||||
+ getNPossibleArrangements (1: h: t) tsprings
|
||||
| h > 1 = 3 * getNPossibleArrangements (h: t) tsprings + getNPossibleArrangements (1: h: t) tsprings
|
||||
getNPossibleArrangements (1: t) (Unknown: Unknown: Operational: tsprings)
|
||||
= (2 * getNPossibleArrangements t tsprings) + getNPossibleArrangements (1: t) tsprings
|
||||
getNPossibleArrangements (2: t) (Unknown: Unknown: Unknown: Operational: tsprings)
|
||||
= (2 * getNPossibleArrangements t tsprings) + getNPossibleArrangements (2: t) tsprings
|
||||
getNPossibleArrangements (1: 1: 1: t) (Unknown: Unknown: Unknown: Unknown: Unknown: Unknown: tsprings)
|
||||
= getNPossibleArrangements t tsprings
|
||||
+ 3 * getNPossibleArrangements (1: t) (Unknown: tsprings)
|
||||
+ 3 * getNPossibleArrangements (1: t) tsprings
|
||||
+ 4 * getNPossibleArrangements (1: 1: t) (Unknown: tsprings)
|
||||
+ getNPossibleArrangements (1: 1: t) tsprings
|
||||
+ getNPossibleArrangements (1: 1: 1: t) (Unknown: tsprings)
|
||||
getNPossibleArrangements (1: 1: t) (Unknown: Unknown: Unknown: Unknown: Unknown: tsprings)
|
||||
= 2 * getNPossibleArrangements t tsprings
|
||||
+ getNPossibleArrangements t (Unknown: tsprings)
|
||||
+ getNPossibleArrangements (1: t) tsprings
|
||||
+ 3 * getNPossibleArrangements (1: t) (Unknown: tsprings)
|
||||
+ getNPossibleArrangements (1: 1: t) (Unknown: tsprings)
|
||||
getNPossibleArrangements (1: 1: t) (Unknown: Unknown: Unknown: Unknown: tsprings)
|
||||
= getNPossibleArrangements t tsprings
|
||||
+ 2 * getNPossibleArrangements (1: t) (Unknown: tsprings)
|
||||
+ getNPossibleArrangements (1: t) tsprings
|
||||
+ getNPossibleArrangements (1: 1: t) (Unknown: tsprings)
|
||||
getNPossibleArrangements (1: t) (Unknown: Unknown: Unknown: tsprings)
|
||||
= getNPossibleArrangements t (Unknown: tsprings)
|
||||
+ getNPossibleArrangements t tsprings
|
||||
+ getNPossibleArrangements (1: t) (Unknown: tsprings)
|
||||
getNPossibleArrangements (h: t) (hsprings: tsprings)
|
||||
| hsprings == Operational = getNPossibleArrangements (h: t) tsprings
|
||||
| hsprings == Unknown = getNPossibleArrangements (h: t) (Operational: tsprings)
|
||||
+ getNPossibleArrangements (h: t) (Damaged: tsprings)
|
||||
| hsprings == Damaged = let (hs, ts) = splitAt (h - 1) tsprings
|
||||
nGroups = length t + sum t - 1
|
||||
in if length hs == h - 1 && isPossiblyDamaged hs && length ts >= nGroups
|
||||
then case (ts, t) of
|
||||
([], _) -> getNPossibleArrangements t []
|
||||
(Unknown: Unknown: Operational: tts, hh: _)
|
||||
-> if hh > 1 then getNPossibleArrangements t tts
|
||||
else getNPossibleArrangements t (tail ts)
|
||||
(Unknown: tts, _) -> getNPossibleArrangements t tts
|
||||
(Operational: tts, _) -> getNPossibleArrangements t tts
|
||||
(Damaged: _, _) -> 0
|
||||
else 0
|
||||
getNPossibleArrangements [] [] = 1
|
||||
getNPossibleArrangements _ [] = 0
|
||||
12
day12/Main.hs
Normal file
12
day12/Main.hs
Normal file
@@ -0,0 +1,12 @@
|
||||
module Main where
|
||||
|
||||
import Commons
|
||||
import qualified Part1
|
||||
import qualified Part2
|
||||
|
||||
|
||||
main = do rows <- parse
|
||||
let part1Res = sum $ Part1.getAll rows
|
||||
print part1Res
|
||||
let part2Res = sum $ Part2.getAll rows
|
||||
print part2Res
|
||||
7
day12/Part1.hs
Normal file
7
day12/Part1.hs
Normal file
@@ -0,0 +1,7 @@
|
||||
module Part1 where
|
||||
|
||||
import Commons
|
||||
|
||||
|
||||
getAll :: [Row] -> [Int]
|
||||
getAll = map (\ row -> getNPossibleArrangements (groups row) (springs row))
|
||||
14
day12/Part2.hs
Normal file
14
day12/Part2.hs
Normal file
@@ -0,0 +1,14 @@
|
||||
module Part2 where
|
||||
|
||||
import Commons
|
||||
|
||||
|
||||
combineSprings :: [Spring] -> [Spring]
|
||||
combineSprings springs = springs ++ (Unknown: springs) ++ (Unknown: springs) ++ (Unknown: springs)
|
||||
++ (Unknown: springs)
|
||||
|
||||
combineGroups :: [Int] -> [Int]
|
||||
combineGroups groups = groups ++ groups ++ groups ++ groups ++ groups
|
||||
|
||||
getAll :: [Row] -> [Int]
|
||||
getAll = map (\ row -> getNPossibleArrangements (combineGroups (groups row)) (combineSprings (springs row)))
|
||||
Reference in New Issue
Block a user