Skip to content

Commit

Permalink
cleanup 12
Browse files Browse the repository at this point in the history
  • Loading branch information
glguy committed Dec 12, 2023
1 parent 8c7d660 commit f656b9d
Showing 1 changed file with 36 additions and 23 deletions.
59 changes: 36 additions & 23 deletions solutions/src/2023/12.hs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
{-# Language QuasiQuotes #-}
{-# OPTIONS_GHC -w #-}
{-|
Module : Main
Description : Day 12 solution
Expand All @@ -9,12 +8,25 @@ Maintainer : emertens@gmail.com
<https://adventofcode.com/2023/day/12>
>>> :{
:main +
"???.### 1,1,3
.??..??...?##. 1,1,3
?#?#?#?#?#?#?#? 1,3,1,6
????.#...#... 4,1,1
????.######..#####. 1,6,5
?###???????? 3,2,1
"
:}
21
525152
-}
module Main where
module Main (main) where

import Advent (format)
import Advent (format, arrIx)
import Data.Array (Ix(range), (!), listArray)
import Data.List (intercalate)
import Data.Array

-- |
--
Expand Down Expand Up @@ -42,24 +54,25 @@ ways groups springs = answersA ! (0,0)
answersB = ((0,0),(groupsN,springsN))
answersA = listArray answersB [go i j | (i,j) <- range answersB]

go groupI springI
| groupI == groupsN =
if all (\i -> springsA ! i `elem` ".?") [springI .. springsN - 1]
then 1 else 0

| springI == springsN = 0
go groupI springI =
case arrIx springsA springI of
Just '.' -> answersA ! (groupI, springI + 1)
Just '#' -> startGroup groupI (springI + 1)
Just '?' -> startGroup groupI (springI + 1)
+ answersA ! (groupI, springI + 1)
_ | groupI == groupsN -> 1
| otherwise -> 0

| otherwise =
case springsA ! springI of
'.' -> answersA ! (groupI, springI + 1)
'#' -> startGroup (groupI + 1) ((groupsA ! groupI) - 1) (springI + 1)
'?' -> startGroup (groupI + 1) ((groupsA ! groupI) - 1) (springI + 1)
+ answersA ! (groupI, springI + 1)
_ -> error "bad diagram"
startGroup groupI springI =
case arrIx groupsA groupI of
Nothing -> 0
Just n -> goGroup (groupI + 1) (n - 1) springI

startGroup groupI n springI
| springI == springsN = if n == 0 && groupI == groupsN then 1 else 0
| n == 0, springsA ! springI `elem` ".?" = answersA ! (groupI, springI + 1)
| n == 0 = 0
| '.' == springsA ! springI = 0
| otherwise = startGroup groupI (n-1) (springI + 1)
goGroup groupI n springI =
case arrIx springsA springI of
Nothing | n == 0, groupI == groupsN -> 1
Just '.' | n == 0 -> answersA ! (groupI, springI + 1)
Just '?' | n == 0 -> answersA ! (groupI, springI + 1)
| otherwise -> goGroup groupI (n-1) (springI + 1)
Just '#' | n > 0 -> goGroup groupI (n-1) (springI + 1)
_ -> 0

0 comments on commit f656b9d

Please sign in to comment.