haskell: 2023 12 a
This commit is contained in:
parent
fd94b34bb5
commit
942cb7d32e
1000
2023/.inputs/12
Normal file
1000
2023/.inputs/12
Normal file
File diff suppressed because it is too large
Load diff
|
@ -29,6 +29,7 @@ library
|
||||||
Day09
|
Day09
|
||||||
Day10
|
Day10
|
||||||
Day11
|
Day11
|
||||||
|
Day12
|
||||||
Day15
|
Day15
|
||||||
|
|
||||||
other-modules:
|
other-modules:
|
||||||
|
|
|
@ -12,7 +12,8 @@ import Utils (readInput)
|
||||||
--import qualified Day08
|
--import qualified Day08
|
||||||
--import qualified Day09
|
--import qualified Day09
|
||||||
--import qualified Day10
|
--import qualified Day10
|
||||||
import qualified Day11
|
--import qualified Day11
|
||||||
|
import qualified Day12
|
||||||
--import qualified Day15
|
--import qualified Day15
|
||||||
|
|
||||||
|
|
||||||
|
@ -43,5 +44,6 @@ main = do
|
||||||
--run 08 Day08.parse Day08.solveA Day08.solveB
|
--run 08 Day08.parse Day08.solveA Day08.solveB
|
||||||
--run 09 Day09.parse Day09.solveA Day09.solveB
|
--run 09 Day09.parse Day09.solveA Day09.solveB
|
||||||
--run 10 Day10.parse Day10.solveA Day10.solveB
|
--run 10 Day10.parse Day10.solveA Day10.solveB
|
||||||
run 11 Day11.parse Day11.solveA Day11.solveB
|
--run 11 Day11.parse Day11.solveA Day11.solveB
|
||||||
|
run 12 Day12.parse Day12.solveA Day12.solveB
|
||||||
--run 15 Day15.parse Day15.solveA Day15.solveB
|
--run 15 Day15.parse Day15.solveA Day15.solveB
|
||||||
|
|
|
@ -13,7 +13,7 @@ data Cell
|
||||||
= U -- ? unknown
|
= U -- ? unknown
|
||||||
| O -- . operational
|
| O -- . operational
|
||||||
| D -- # damaged
|
| D -- # damaged
|
||||||
deriving Show
|
deriving (Show, Eq)
|
||||||
|
|
||||||
type Row = ([Cell], [Int])
|
type Row = ([Cell], [Int])
|
||||||
|
|
||||||
|
@ -43,11 +43,34 @@ parse = first errorBundlePretty . runParser rows ""
|
||||||
rows = many row <* eof
|
rows = many row <* eof
|
||||||
|
|
||||||
arrange :: [Cell] -> [Int] -> [[Cell]]
|
arrange :: [Cell] -> [Int] -> [[Cell]]
|
||||||
arrange = _
|
arrange [] [] = [[]]
|
||||||
|
arrange [] _ = []
|
||||||
|
arrange cs []
|
||||||
|
| D `notElem` cs = [map (const O) cs]
|
||||||
|
| otherwise = []
|
||||||
|
arrange cs@(c:cr) ns@(n:nr)
|
||||||
|
| canFill && canSkip = tryFill <> trySkip
|
||||||
|
| canFill = tryFill
|
||||||
|
| canSkip = trySkip
|
||||||
|
| otherwise = []
|
||||||
|
where
|
||||||
|
(window, rest) = splitAt n cs
|
||||||
|
fill :: [Cell] -> [Cell]
|
||||||
|
fill = (replicate n D ++)
|
||||||
|
canSkip :: Bool
|
||||||
|
canSkip = c /= D
|
||||||
|
trySkip :: [[Cell]]
|
||||||
|
trySkip = map (O:) (arrange cr ns)
|
||||||
|
canFill :: Bool
|
||||||
|
canFill = O `notElem` window && n == length window && (null rest || head rest /= D)
|
||||||
|
tryFill :: [[Cell]]
|
||||||
|
tryFill
|
||||||
|
| null rest = map fill (arrange rest nr)
|
||||||
|
| otherwise = map (fill . (O:)) (arrange (tail rest) nr)
|
||||||
|
|
||||||
solveA :: [Row] -> Int
|
solveA :: [Row] -> Int
|
||||||
solveA = length . concatMap (uncurry arrange)
|
solveA = length . concatMap (uncurry arrange)
|
||||||
|
|
||||||
-- >>> parse input
|
-- >>> solveA <$> parse input
|
||||||
-- Right [([U,U,U,O,D,D,D],[1,1,3]),([O,U,U,O,O,U,U,O,O,O,U,D,D,O],[1,1,3]),([U,D,U,D,U,D,U,D,U,D,U,D,U,D,U],[1,3,1,6]),([U,U,U,U,O,D,O,O,O,D,O,O,O],[4,1,1]),([U,U,U,U,O,D,D,D,D,D,D,O,O,D,D,D,D,D,O],[1,6,5]),([U,D,D,D,U,U,U,U,U,U,U,U],[3,2,1])]
|
-- Right 21
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ import qualified Day08
|
||||||
import qualified Day09
|
import qualified Day09
|
||||||
import qualified Day10
|
import qualified Day10
|
||||||
import qualified Day11
|
import qualified Day11
|
||||||
|
import qualified Day12
|
||||||
import qualified Day15
|
import qualified Day15
|
||||||
|
|
||||||
|
|
||||||
|
@ -297,6 +298,21 @@ day11 =
|
||||||
\.......#..\n\
|
\.......#..\n\
|
||||||
\#...#.....\n"
|
\#...#.....\n"
|
||||||
|
|
||||||
|
day12 :: Test
|
||||||
|
day12 =
|
||||||
|
let parsed = Day12.parse input
|
||||||
|
in TestList
|
||||||
|
[ TestCase $ assertEqual "A" (Right 21) (Day12.solveA <$> parsed)
|
||||||
|
]
|
||||||
|
where
|
||||||
|
input =
|
||||||
|
"???.### 1,1,3\n\
|
||||||
|
\.??..??...?##. 1,1,3\n\
|
||||||
|
\?#?#?#?#?#?#?#? 1,3,1,6\n\
|
||||||
|
\????.#...#... 4,1,1\n\
|
||||||
|
\????.######..#####. 1,6,5\n\
|
||||||
|
\?###???????? 3,2,1\n"
|
||||||
|
|
||||||
day15 :: Test
|
day15 :: Test
|
||||||
day15 =
|
day15 =
|
||||||
let parsed = Day15.parse input
|
let parsed = Day15.parse input
|
||||||
|
@ -320,6 +336,7 @@ tests = TestList
|
||||||
, TestLabel "09" day09
|
, TestLabel "09" day09
|
||||||
, TestLabel "10" day10
|
, TestLabel "10" day10
|
||||||
, TestLabel "11" day11
|
, TestLabel "11" day11
|
||||||
|
, TestLabel "12" day12
|
||||||
, TestLabel "15" day15
|
, TestLabel "15" day15
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue