haskell: 2023 12 a

This commit is contained in:
Maciej Jur 2023-12-16 23:46:21 +01:00
parent fd94b34bb5
commit 942cb7d32e
Signed by: kamov
GPG key ID: 191CBFF5F72ECAFD
5 changed files with 1049 additions and 6 deletions

1000
2023/.inputs/12 Normal file

File diff suppressed because it is too large Load diff

View file

@ -29,6 +29,7 @@ library
Day09
Day10
Day11
Day12
Day15
other-modules:

View file

@ -12,7 +12,8 @@ import Utils (readInput)
--import qualified Day08
--import qualified Day09
--import qualified Day10
import qualified Day11
--import qualified Day11
import qualified Day12
--import qualified Day15
@ -43,5 +44,6 @@ main = do
--run 08 Day08.parse Day08.solveA Day08.solveB
--run 09 Day09.parse Day09.solveA Day09.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

View file

@ -13,7 +13,7 @@ data Cell
= U -- ? unknown
| O -- . operational
| D -- # damaged
deriving Show
deriving (Show, Eq)
type Row = ([Cell], [Int])
@ -43,11 +43,34 @@ parse = first errorBundlePretty . runParser rows ""
rows = many row <* eof
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 = length . concatMap (uncurry arrange)
-- >>> 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])]
-- >>> solveA <$> parse input
-- Right 21

View file

@ -14,6 +14,7 @@ import qualified Day08
import qualified Day09
import qualified Day10
import qualified Day11
import qualified Day12
import qualified Day15
@ -297,6 +298,21 @@ day11 =
\.......#..\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 =
let parsed = Day15.parse input
@ -320,6 +336,7 @@ tests = TestList
, TestLabel "09" day09
, TestLabel "10" day10
, TestLabel "11" day11
, TestLabel "12" day12
, TestLabel "15" day15
]