Day 11, parts 1 & 2 (combined): Initial solution.
This commit is contained in:
parent
8ba8d417ea
commit
e57cc6b791
|
|
@ -0,0 +1,45 @@
|
|||
#! /usr/bin/env stack
|
||||
-- stack --resolver lts-12.20 --install-ghc script --optimize
|
||||
{-# LANGUAGE ViewPatterns #-}
|
||||
module Main where
|
||||
|
||||
import Control.Applicative
|
||||
import Data.Function (on)
|
||||
|
||||
import qualified Data.Array as A
|
||||
import qualified Data.List as L
|
||||
|
||||
type Point = (Int, Int)
|
||||
type Size = Int
|
||||
type Total = Int
|
||||
|
||||
gridSerialNum = 6548
|
||||
main = do
|
||||
let ((p1X, p1Y), (p1Sz, p1Total)) = solution [3]
|
||||
let ((p2X, p2Y), (p2Sz, p2Total)) = solution [1..300]
|
||||
putStrLn $ "Part1: " ++ show (p1X, p1Y) ++ " Total: " ++ show p1Total
|
||||
putStrLn $ "Part2: " ++ show (p2X, p2Y, p2Sz) ++ " Total: " ++ show p2Total
|
||||
|
||||
fnArray bounds f = A.listArray bounds [ f ix | ix <- A.range bounds ]
|
||||
|
||||
powerLevels = fnArray ((1,1),(300,300)) $ \(x,y) ->
|
||||
let rackID = x + 10
|
||||
hundreds n = (n `div` 100) `mod` 10
|
||||
in hundreds ((rackID * y + gridSerialNum) * rackID) - 5
|
||||
|
||||
totals =
|
||||
let lookup sz pt = snd (totals sz A.! pt)
|
||||
quarter sz (x,y) = sum [ lookup sz (x', y') | x' <- [x,x+sz]
|
||||
, y' <- [y,y+sz] ]
|
||||
totalsArr = fnArray (1,300) $ \sz ->
|
||||
fnArray ((1,1),(301-sz,301-sz)) $ \(x,y) ->
|
||||
if sz == 1 then (sz, powerLevels A.! (x, y)) else
|
||||
if even sz then (sz, quarter (sz `div` 2) (x, y)) else
|
||||
(sz, lookup (sz-1) (x, y)
|
||||
+ sum [ powerLevels A.! (x', y+sz-1) | x' <- [x..x+sz-2] ]
|
||||
+ sum [ powerLevels A.! (x+sz-1, y') | y' <- [y..y+sz-1] ])
|
||||
in \sz -> totalsArr A.! sz
|
||||
|
||||
solution :: [Size] -> (Point, (Size, Total))
|
||||
solution = L.maximumBy (compare `on` snd . snd)
|
||||
. L.concatMap (A.assocs . totals)
|
||||
Loading…
Reference in New Issue