Day 2
parent
8e98a80ff0
commit
c3d62c3c5e
@ -0,0 +1,106 @@
|
||||
name: aoc2022
|
||||
version: 0.1.0.0
|
||||
-- synopsis:
|
||||
-- description:
|
||||
homepage: https://git.raptorpond.com/henine/AoC2022
|
||||
license: MIT
|
||||
license-file: LICENSE
|
||||
author: henine
|
||||
maintainer: example@example.com
|
||||
copyright: 2022 HeNine
|
||||
category: Misc
|
||||
build-type: Simple
|
||||
cabal-version: >=1.10
|
||||
|
||||
-- Day 1
|
||||
|
||||
test-suite day01aoctest
|
||||
type: exitcode-stdio-1.0
|
||||
hs-source-dirs: src/day01/test, src/day01
|
||||
main-is: AoCTest.hs
|
||||
other-modules: Day1Lib
|
||||
build-depends: base
|
||||
, HUnit
|
||||
, split
|
||||
ghc-options: -threaded -rtsopts -with-rtsopts=-N
|
||||
default-language: Haskell2010
|
||||
|
||||
executable day011
|
||||
hs-source-dirs: src/day01
|
||||
main-is: Main1.hs
|
||||
other-modules:
|
||||
Day1Lib
|
||||
default-language: Haskell2010
|
||||
build-depends: base >= 4.7 && < 5, split
|
||||
ghc-options: -Wall
|
||||
-Wcompat
|
||||
-Widentities
|
||||
-Wincomplete-record-updates
|
||||
-Wincomplete-uni-patterns
|
||||
-Wmissing-export-lists
|
||||
-Wmissing-home-modules
|
||||
-Wpartial-fields
|
||||
-Wredundant-constraints
|
||||
|
||||
executable day012
|
||||
hs-source-dirs: src/day01
|
||||
main-is: Main2.hs
|
||||
other-modules:
|
||||
Day1Lib
|
||||
default-language: Haskell2010
|
||||
build-depends: base >= 4.7 && < 5, split
|
||||
ghc-options: -Wall
|
||||
-Wcompat
|
||||
-Widentities
|
||||
-Wincomplete-record-updates
|
||||
-Wincomplete-uni-patterns
|
||||
-Wmissing-export-lists
|
||||
-Wmissing-home-modules
|
||||
-Wpartial-fields
|
||||
-Wredundant-constraints
|
||||
|
||||
-- Day 2
|
||||
|
||||
test-suite day02aoctest
|
||||
type: exitcode-stdio-1.0
|
||||
hs-source-dirs: src/day02/test, src/day02
|
||||
main-is: AoCTest.hs
|
||||
other-modules: Day2Lib
|
||||
build-depends: base
|
||||
, HUnit
|
||||
ghc-options: -threaded -rtsopts -with-rtsopts=-N
|
||||
default-language: Haskell2010
|
||||
|
||||
executable day021
|
||||
hs-source-dirs: src/day02
|
||||
main-is: Main1.hs
|
||||
other-modules:
|
||||
Day2Lib
|
||||
default-language: Haskell2010
|
||||
build-depends: base >= 4.7 && < 5, split
|
||||
ghc-options: -Wall
|
||||
-Wcompat
|
||||
-Widentities
|
||||
-Wincomplete-record-updates
|
||||
-Wincomplete-uni-patterns
|
||||
-Wmissing-export-lists
|
||||
-Wmissing-home-modules
|
||||
-Wpartial-fields
|
||||
-Wredundant-constraints
|
||||
|
||||
executable day022
|
||||
hs-source-dirs: src/day02
|
||||
main-is: Main2.hs
|
||||
other-modules:
|
||||
Day2Lib
|
||||
default-language: Haskell2010
|
||||
build-depends: base >= 4.7 && < 5, split
|
||||
ghc-options: -Wall
|
||||
-Wcompat
|
||||
-Widentities
|
||||
-Wincomplete-record-updates
|
||||
-Wincomplete-uni-patterns
|
||||
-Wmissing-export-lists
|
||||
-Wmissing-home-modules
|
||||
-Wpartial-fields
|
||||
-Wredundant-constraints
|
@ -0,0 +1,3 @@
|
||||
A Y
|
||||
B X
|
||||
C Z
|
File diff suppressed because it is too large
Load Diff
@ -1,48 +0,0 @@
|
||||
name: day01
|
||||
version: 0.1.0.0
|
||||
-- synopsis:
|
||||
-- description:
|
||||
homepage: https://github.com/githubuser/day01#readme
|
||||
license: MIT
|
||||
license-file: ../LICENSE
|
||||
author: Author name here
|
||||
maintainer: example@example.com
|
||||
copyright: 2022 Author name here
|
||||
category: Web
|
||||
build-type: Simple
|
||||
cabal-version: >=1.10
|
||||
|
||||
|
||||
executable day011
|
||||
hs-source-dirs: src
|
||||
main-is: Main1.hs
|
||||
other-modules:
|
||||
Lib
|
||||
default-language: Haskell2010
|
||||
build-depends: base >= 4.7 && < 5, split
|
||||
ghc-options: -Wall
|
||||
-Wcompat
|
||||
-Widentities
|
||||
-Wincomplete-record-updates
|
||||
-Wincomplete-uni-patterns
|
||||
-Wmissing-export-lists
|
||||
-Wmissing-home-modules
|
||||
-Wpartial-fields
|
||||
-Wredundant-constraints
|
||||
|
||||
executable day012
|
||||
hs-source-dirs: src
|
||||
main-is: Main2.hs
|
||||
other-modules:
|
||||
Lib
|
||||
default-language: Haskell2010
|
||||
build-depends: base >= 4.7 && < 5, split
|
||||
ghc-options: -Wall
|
||||
-Wcompat
|
||||
-Widentities
|
||||
-Wincomplete-record-updates
|
||||
-Wincomplete-uni-patterns
|
||||
-Wmissing-export-lists
|
||||
-Wmissing-home-modules
|
||||
-Wpartial-fields
|
||||
-Wredundant-constraints
|
@ -1,6 +0,0 @@
|
||||
module Lib (parseBackpacks) where
|
||||
|
||||
import Data.List.Split
|
||||
|
||||
parseBackpacks :: String -> [[Int]]
|
||||
parseBackpacks input = [map read b | b <- splitOn [""] $ lines input]
|
@ -1,14 +0,0 @@
|
||||
module Main (main) where
|
||||
|
||||
-- import Debug.Trace
|
||||
|
||||
import Lib
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
input <- getContents
|
||||
let backpacks = parseBackpacks input
|
||||
max_backpack = maximum [sum b | b <- backpacks]
|
||||
print $ max_backpack
|
||||
return ()
|
||||
|
@ -1,14 +0,0 @@
|
||||
module Main (main) where
|
||||
|
||||
-- import Debug.Trace
|
||||
import Data.List (sort)
|
||||
|
||||
import Lib
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
input <- getContents
|
||||
let backpacks = parseBackpacks input
|
||||
top_3 = sum $ take 3 $ reverse $ sort [sum b | b <- backpacks]
|
||||
print $ top_3
|
||||
return ()
|
@ -0,0 +1,15 @@
|
||||
module Day1Lib (parseBackpacks, processInput1, processInput2) where
|
||||
|
||||
import Data.List (sort)
|
||||
import Data.List.Split
|
||||
|
||||
parseBackpacks :: String -> [[Int]]
|
||||
parseBackpacks input = [map read b | b <- splitOn [""] $ lines input]
|
||||
|
||||
-- ################
|
||||
|
||||
processInput1 :: String -> Int
|
||||
processInput1 = maximum . (map sum) . parseBackpacks
|
||||
|
||||
processInput2 :: String -> Int
|
||||
processInput2 = sum . (take 3) . reverse . sort . (map sum) . parseBackpacks
|
@ -0,0 +1,12 @@
|
||||
module Main (main) where
|
||||
|
||||
-- import Debug.Trace
|
||||
|
||||
import Day1Lib
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
input <- getContents
|
||||
print $ processInput1 input
|
||||
return ()
|
||||
|
@ -0,0 +1,11 @@
|
||||
module Main (main) where
|
||||
|
||||
-- import Debug.Trace
|
||||
|
||||
import Day1Lib (processInput2)
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
input <- getContents
|
||||
print $ processInput2 input
|
||||
return ()
|
@ -0,0 +1,42 @@
|
||||
import System.IO
|
||||
import Test.HUnit
|
||||
|
||||
import Day1Lib (processInput1, processInput2)
|
||||
|
||||
testCases1 =
|
||||
[ ("data/input010.txt", 24000),
|
||||
("data/input011.txt", 69912)
|
||||
]
|
||||
|
||||
testCase1 (file, result) = do
|
||||
withFile
|
||||
file
|
||||
ReadMode
|
||||
( \handle -> do
|
||||
contents <- hGetContents handle
|
||||
assertEqual "input test" result $ processInput1 contents
|
||||
)
|
||||
|
||||
testCases2 =
|
||||
[ ("data/input010.txt", 45000),
|
||||
("data/input011.txt", 208180)
|
||||
]
|
||||
|
||||
testCase2 (file, result) = do
|
||||
withFile
|
||||
file
|
||||
ReadMode
|
||||
( \handle -> do
|
||||
contents <- hGetContents handle
|
||||
assertEqual "input test" result $ processInput2 contents
|
||||
)
|
||||
|
||||
tests =
|
||||
TestList $
|
||||
[TestCase (testCase1 c) | c <- testCases1]
|
||||
++ [TestCase (testCase2 c) | c <- testCases2]
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
runTestTT tests
|
||||
return ()
|
@ -0,0 +1,61 @@
|
||||
module Day2Lib
|
||||
( Opponent (..),
|
||||
Me (..),
|
||||
Trick (..),
|
||||
Hint (..),
|
||||
assembleNaiveTrick,
|
||||
evaluateTrick,
|
||||
evaluateWin,
|
||||
evaluateMe,
|
||||
parseHint,
|
||||
assembleTrick,
|
||||
--
|
||||
processInput1,
|
||||
processInput2,
|
||||
)
|
||||
where
|
||||
|
||||
data Opponent = A | B | C deriving (Show, Read, Eq, Enum)
|
||||
|
||||
data Me = X | Y | Z deriving (Show, Read, Eq, Enum)
|
||||
|
||||
data Hand = R | P | S deriving (Show, Eq, Enum)
|
||||
|
||||
newtype Hint = Hint (Opponent, Me) deriving (Show, Eq)
|
||||
|
||||
newtype Trick = Trick (Hand, Hand) deriving (Show, Eq)
|
||||
|
||||
parseHint :: String -> (Opponent, Me)
|
||||
parseHint (o : _ : m : []) = (read [o], read [m])
|
||||
|
||||
opponentHand :: Opponent -> Hand
|
||||
opponentHand = toEnum . fromEnum
|
||||
|
||||
naiveResponse :: Hand -> Me -> Hand
|
||||
naiveResponse _ m = toEnum $ fromEnum m
|
||||
|
||||
findResponse :: Hand -> Me -> Hand
|
||||
findResponse o m = toEnum ((fromEnum o + fromEnum m - 1) `mod` 3)
|
||||
|
||||
assembleTrick :: Hint -> Trick
|
||||
assembleTrick (Hint (o, m)) = Trick (opponentHand o, findResponse (opponentHand o) m)
|
||||
|
||||
assembleNaiveTrick :: Hint -> Trick
|
||||
assembleNaiveTrick (Hint (o, m)) = Trick (opponentHand o, naiveResponse (opponentHand o) m)
|
||||
|
||||
evaluateTrick :: Trick -> Int
|
||||
evaluateTrick t = evaluateWin t + evaluateMe t
|
||||
|
||||
evaluateMe :: Trick -> Int
|
||||
evaluateMe (Trick (_, m)) = fromEnum m + 1
|
||||
|
||||
evaluateWin :: Trick -> Int
|
||||
evaluateWin (Trick (o, m)) = 6 - (fromEnum o - fromEnum m + 1) `mod` 3 * 3
|
||||
|
||||
-- ######################################
|
||||
|
||||
processInput1 :: String -> Int
|
||||
processInput1 = sum . (map $ evaluateTrick . assembleNaiveTrick . Hint . parseHint) . lines
|
||||
|
||||
processInput2 :: String -> Int
|
||||
processInput2 = sum . (map $ evaluateTrick . assembleTrick . Hint . parseHint) . lines
|
@ -0,0 +1,10 @@
|
||||
module Main (main) where
|
||||
|
||||
import Day2Lib
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
input <- getContents
|
||||
|
||||
print $ processInput1 input
|
||||
return ()
|
@ -0,0 +1,10 @@
|
||||
module Main (main) where
|
||||
|
||||
import Day2Lib (processInput2)
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
input <- getContents
|
||||
|
||||
print $ processInput2 input
|
||||
return ()
|
@ -0,0 +1,42 @@
|
||||
import System.IO
|
||||
import Test.HUnit
|
||||
|
||||
import Day2Lib (processInput1, processInput2)
|
||||
|
||||
testCases1 =
|
||||
[ ("data/input020.txt", 15),
|
||||
("data/input021.txt", 14264)
|
||||
]
|
||||
|
||||
testCase1 (file, result) = do
|
||||
withFile
|
||||
file
|
||||
ReadMode
|
||||
( \handle -> do
|
||||
contents <- hGetContents handle
|
||||
assertEqual "input test" result $ processInput1 contents
|
||||
)
|
||||
|
||||
testCases2 =
|
||||
[ ("data/input020.txt", 12),
|
||||
("data/input021.txt", 12382)
|
||||
]
|
||||
|
||||
testCase2 (file, result) = do
|
||||
withFile
|
||||
file
|
||||
ReadMode
|
||||
( \handle -> do
|
||||
contents <- hGetContents handle
|
||||
assertEqual "input test" result $ processInput2 contents
|
||||
)
|
||||
|
||||
tests =
|
||||
TestList $
|
||||
[TestCase (testCase1 c) | c <- testCases1]
|
||||
++ [TestCase (testCase2 c) | c <- testCases2]
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
runTestTT tests
|
||||
return ()
|
Loading…
Reference in New Issue