day 4: alternate solution
Signed-off-by: Amneesh Singh <natto@weirdnatto.in>
This commit is contained in:
		@@ -43,3 +43,9 @@ executable day4
 | 
				
			|||||||
  hs-source-dirs: src
 | 
					  hs-source-dirs: src
 | 
				
			||||||
  main-is:        Day4.hs
 | 
					  main-is:        Day4.hs
 | 
				
			||||||
  build-depends:  libaoc
 | 
					  build-depends:  libaoc
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					executable day4alt
 | 
				
			||||||
 | 
					  import:         common
 | 
				
			||||||
 | 
					  hs-source-dirs: src
 | 
				
			||||||
 | 
					  main-is:        Day4Alt.hs
 | 
				
			||||||
 | 
					  build-depends:  libaoc
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -1,6 +1,6 @@
 | 
				
			|||||||
module AoC where
 | 
					module AoC where
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import Data.List (transpose)
 | 
					import Data.List (tails, transpose)
 | 
				
			||||||
import Text.Parsec (ParseError)
 | 
					import Text.Parsec (ParseError)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
-- extract Right value after parsing
 | 
					-- extract Right value after parsing
 | 
				
			||||||
@@ -27,3 +27,7 @@ findSubstrings sub str = findSubstrings' sub str 0
 | 
				
			|||||||
    findSubstrings' sub str@(x : xs) idx
 | 
					    findSubstrings' sub str@(x : xs) idx
 | 
				
			||||||
      | take (length sub) str == sub = idx : findSubstrings' sub xs (idx + 1)
 | 
					      | take (length sub) str == sub = idx : findSubstrings' sub xs (idx + 1)
 | 
				
			||||||
      | otherwise = findSubstrings' sub xs (idx + 1)
 | 
					      | otherwise = findSubstrings' sub xs (idx + 1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					-- get all subarrays of size n
 | 
				
			||||||
 | 
					subArrays :: Int -> [[a]] -> [[[a]]]
 | 
				
			||||||
 | 
					subArrays n xss = [[take n t | t <- tails xs] | xs <- xss]
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										36
									
								
								src/Day4Alt.hs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								src/Day4Alt.hs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					module Main where
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import qualified AoC as A (diagonals, subArrays)
 | 
				
			||||||
 | 
					import Data.List (isPrefixOf, tails, transpose)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					part1 :: [[Char]] -> Int
 | 
				
			||||||
 | 
					part1 grid =
 | 
				
			||||||
 | 
					  (sum . concatMap countXmas)
 | 
				
			||||||
 | 
					    [ grid,
 | 
				
			||||||
 | 
					      transpose grid,
 | 
				
			||||||
 | 
					      A.diagonals grid,
 | 
				
			||||||
 | 
					      A.diagonals $ map reverse grid
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  where
 | 
				
			||||||
 | 
					    countXmas :: [[Char]] -> [Int]
 | 
				
			||||||
 | 
					    countXmas = map (length . filter ((||) <$> isPrefixOf "XMAS" <*> isPrefixOf "SAMX") . tails)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					part2 :: [[Char]] -> Int
 | 
				
			||||||
 | 
					part2 grid =
 | 
				
			||||||
 | 
					  let groups = concat $ A.subArrays 3 $ transpose $ A.subArrays 3 grid
 | 
				
			||||||
 | 
					   in length $ filter check groups
 | 
				
			||||||
 | 
					  where
 | 
				
			||||||
 | 
					    check :: [[Char]] -> Bool
 | 
				
			||||||
 | 
					    check
 | 
				
			||||||
 | 
					      [ [a, _, b],
 | 
				
			||||||
 | 
					        [_, 'A', _],
 | 
				
			||||||
 | 
					        [c, _, d]
 | 
				
			||||||
 | 
					        ] = elem [a, d] ["MS", "SM"] && elem [b, c] ["MS", "SM"]
 | 
				
			||||||
 | 
					    check _ = False
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					main :: IO ()
 | 
				
			||||||
 | 
					main =
 | 
				
			||||||
 | 
					  do
 | 
				
			||||||
 | 
					    raw <- lines <$> readFile "./inputs/day4.in"
 | 
				
			||||||
 | 
					    putStr "Part 1: " >> print (part1 raw)
 | 
				
			||||||
 | 
					    putStr "Part 2: " >> print (part2 raw)
 | 
				
			||||||
		Reference in New Issue
	
	Block a user