1
0
Fork 0

Skipping 3 for a while

main
Bill Ewanick 2023-12-09 12:17:57 -05:00
parent 13f2a77803
commit 0760edeabc
1 changed files with 68 additions and 6 deletions

View File

@ -1,25 +1,87 @@
-- https://adventofcode.com/2023/day/3 -- https://adventofcode.com/2023/day/3
{-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE OverloadedStrings #-}
import Data.Text (Text) import Data.Bifunctor
import qualified Data.Text as T import Data.List
import qualified Data.Text.IO as T
import Data.Char
import Data.Text (Text)
import qualified Data.Text as T
import qualified Data.Text.IO as T
import Debug.Trace (trace)
main :: IO () main :: IO ()
main = do main = do
entries <- T.lines <$> T.readFile "src/advent_of_code/2023/input3" entries <- T.lines <$> T.readFile "src/advent_of_code/2023/input3"
putStrLn "Advent of Code 2023 - Day 3"
putStrLn "Advent of Code 2023 - Day 3"
putStrLn ("Part 1: " <> show (solveP1 entries)) putStrLn ("Part 1: " <> show (solveP1 entries))
putStrLn ("Part 2: " <> show (solveP2 entries)) -- putStrLn ("Part 2: " <> show (solveP2 entries))
-- --
-- Part 1 -- Part 1
-- --
allCoords :: Int -> [(Int, Int)]
allCoords n = [ (x,y) | x <- [0..n-1], y <- [0..n-1]]
getSymbolSet :: [Text] -> String
getSymbolSet = nub . concatMap
(filter (\str
-> not (isDigit str)
&& (/= '.') str
) . T.unpack)
nextCoord :: [(Int, Int)]
nextCoord = [ (x,y) | x <- [-1,0,1], y <- [-1,0,1] ]
adjacentCoords :: Int -> (Int, Int) -> [(Int, Int)]
adjacentCoords l (x,y) =
filter (and . tupleToList . bimap gtl gtl)
. filter (and . tupleToList . bimap gtz gtz)
$ map (bimap (+x) (+y)) nextCoord
where
gtz = (>=0)
gtl = (< l)
tupleToList (a, b) = [a,b]
pointer :: [Text] -> String -> (Int, Int) -> Int
pointer txt symbolSet (x,y) = numberAt symbolSet x $ txt !! y
numberAt :: String -> Int -> Text -> Int
numberAt symbolSet n txt = if not $ check (T.head h')
then 0
else sumPair . bimap
(T.takeWhileEnd check)
(T.takeWhile check)
$ (h,h')
where
isElem = flip elem symbolSet
check a = a /= '.' && not (isElem a)
(h,h') = T.splitAt n txt
sumPair :: (Text, Text) -> Int
sumPair (a,b) = read str'
where
str = T.unpack $ T.concat [a,b]
str' = if null str then "0" else str
-- attachCoords :: [Text] -> [((Int, Int), Char)]
-- attachCoords = concat . zipWith (\col -> map (\(r,c) -> ((r,col),c))) [0..] . map (zip [0..] . T.unpack)
attachCoords :: [Text] -> [[((Int, Int), Char)]]
attachCoords = zipWith (\col -> map (\(r,c) -> ((r,col),c))) [0..] . map (zip [0..] . T.unpack)
solveP1 = id solveP1 = id
getAllNumbers :: [Text] -> [Int]
getAllNumbers = map (read . T.unpack) . concatMap (filter (not . T.null) . T.split (not . isDigit))
test = groupBy (\((i,_),c) ((j,_),c')
-> trace ("\n" <> show c <> show i <> ", " <> show c' <> show j <> "\n")
i == j-1
) $ concatMap (filter (\(_,c)-> isDigit c)) $ attachCoords example
-- --
-- Part 2 -- Part 2
-- --
@ -31,7 +93,7 @@ solveP2 = id
-- Examples -- Examples
-- --
example :: [[Char]] example :: [Text]
example = example =
[ "467..114.." [ "467..114.."
, "...*......" , "...*......"