lwhjp, 5 months ago Haskell This was fun and (fairly) easy! Off-by-one errors are a likely source of bugs here. <span style="color:#323232;">import Control.Monad </span><span style="color:#323232;">import Data.List </span><span style="color:#323232;">import Data.List.Split </span><span style="color:#323232;">import Data.Maybe </span><span style="color:#323232;"> </span><span style="color:#323232;">score d pat = ((100 *) <$> search pat) `mplus` search (transpose pat) </span><span style="color:#323232;"> where </span><span style="color:#323232;"> search pat' = find ((d ==) . rdiff pat') [1 .. length pat' - 1] </span><span style="color:#323232;"> rdiff pat' i = </span><span style="color:#323232;"> let (a, b) = splitAt i pat' </span><span style="color:#323232;"> in length $ filter (uncurry (/=)) $ zip (concat $ reverse a) (concat b) </span><span style="color:#323232;"> </span><span style="color:#323232;">main = do </span><span style="color:#323232;"> input <- splitOn [""] . lines <$> readFile "input13" </span><span style="color:#323232;"> let go d = print . sum . map (fromJust . score d) $ input </span><span style="color:#323232;"> go 0 </span><span style="color:#323232;"> go 1 </span> Line-seconds score: 0.102 😉
This was fun and (fairly) easy! Off-by-one errors are a likely source of bugs here.
<span style="color:#323232;">import Control.Monad </span><span style="color:#323232;">import Data.List </span><span style="color:#323232;">import Data.List.Split </span><span style="color:#323232;">import Data.Maybe </span><span style="color:#323232;"> </span><span style="color:#323232;">score d pat = ((100 *) <$> search pat) `mplus` search (transpose pat) </span><span style="color:#323232;"> where </span><span style="color:#323232;"> search pat' = find ((d ==) . rdiff pat') [1 .. length pat' - 1] </span><span style="color:#323232;"> rdiff pat' i = </span><span style="color:#323232;"> let (a, b) = splitAt i pat' </span><span style="color:#323232;"> in length $ filter (uncurry (/=)) $ zip (concat $ reverse a) (concat b) </span><span style="color:#323232;"> </span><span style="color:#323232;">main = do </span><span style="color:#323232;"> input <- splitOn [""] . lines <$> readFile "input13" </span><span style="color:#323232;"> let go d = print . sum . map (fromJust . score d) $ input </span><span style="color:#323232;"> go 0 </span><span style="color:#323232;"> go 1 </span>
Line-seconds score: 0.102 😉
0.102