From be9d88184c51ec58249df4bb904496ed539833e3 Mon Sep 17 00:00:00 2001 From: Gattix Date: Sun, 17 Dec 2023 11:31:11 +0100 Subject: [PATCH] day15: not working to be discarded, but cool enough to keep around in git I guess --- 2023/day15/day15.hs | 41 ++++++++++++++++++++++++++--------------- 1 file changed, 26 insertions(+), 15 deletions(-) diff --git a/2023/day15/day15.hs b/2023/day15/day15.hs index 5c99b9c..4c6dd47 100644 --- a/2023/day15/day15.hs +++ b/2023/day15/day15.hs @@ -1,16 +1,14 @@ -{-# LANGUAGE LambdaCase #-} - -import Debug.Trace -import Data.List -import Text.Read import Control.Arrow +import Data.Function +import Data.List import Data.List.Split -import qualified Data.Map as M +import Data.Maybe +import Text.Read type HASH = (String, Maybe Int) main :: IO () -main = interact $ show . parse . init +main = interact $ show . genBuckets . parse . init parse :: String -> [HASH] parse = map (second (readMaybe . tail) . break (`elem` "=-")) . splitOn "," @@ -21,12 +19,25 @@ day15a = sum . map (foldl' hashAlg 0) . splitOn "," hashAlg :: Int -> Char -> Int hashAlg x y = (17 * (fromEnum y + x)) `mod` 256 -removeHash :: [HASH] -> HASH -> [HASH] -removeHash hs (s,n) = undefined +removeHashes :: [String] -> [HASH] -> [HASH] +removeHashes _ [] = [] +removeHashes rs ((label, Nothing):xs) = removeHashes (label : rs) xs +removeHashes rs ((label, Just x):xs) + | label `elem` rs = removeHashes (delete label rs) xs + | otherwise = (label, Just x) : removeHashes rs xs - -f1 n (x,_) = foldl hashAlg 0 x == n -f2 s (x,_) = x==s - - --- input <- lines <$> readFile "testinput" +genBuckets :: [HASH] -> Int +genBuckets input = + sum + [ sum $ zipWith (*) [1 ..] $ map ((* (succ x)) . fromJust . snd) (sorted x) + | x <- [0 .. 255] + ] + where + filterBucket x f = + nubBy ((==) `on` fst) $ + f $ removeHashes [] (reverse $ filter (f1 x) input) + sorted x = + sortOn + (\y -> fst y `elemIndex` (map fst (filterBucket x reverse))) + (filterBucket x id) + f1 n (x, _) = foldl hashAlg 0 x == n