-- |-- Module : AOC.Challenge.Day12-- License : BSD3---- Stability : experimental-- Portability : non-portable---- Day 12. See "AOC.Solver" for the types used in this module!moduleAOC.Challenge.Day12(day12a,day12b)whereimportAOC.Common.Point(Point,Dir(..),dirPoint,rotPoint,mannDist)importAOC.Solver((:~>)(..))importControl.DeepSeq(NFData)importData.Group(pow)importData.List(foldl')importData.Map(Map)importGHC.Generics(Generic)importLinear(V2(..),(*^))importText.Read(readMaybe)importqualifiedData.MapasMdataInstr=ForwardInt|TurnDir|MovePointderiving(Int -> Instr -> ShowS
[Instr] -> ShowS
Instr -> String
(Int -> Instr -> ShowS)
-> (Instr -> String) -> ([Instr] -> ShowS) -> Show Instr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Instr] -> ShowS
$cshowList :: [Instr] -> ShowS
show :: Instr -> String
$cshow :: Instr -> String
showsPrec :: Int -> Instr -> ShowS
$cshowsPrec :: Int -> Instr -> ShowS
Show,Instr -> Instr -> Bool
(Instr -> Instr -> Bool) -> (Instr -> Instr -> Bool) -> Eq Instr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Instr -> Instr -> Bool
$c/= :: Instr -> Instr -> Bool
== :: Instr -> Instr -> Bool
$c== :: Instr -> Instr -> Bool
Eq,(forall x. Instr -> Rep Instr x)
-> (forall x. Rep Instr x -> Instr) -> Generic Instr
forall x. Rep Instr x -> Instr
forall x. Instr -> Rep Instr x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Instr x -> Instr
$cfrom :: forall x. Instr -> Rep Instr x
Generic)instanceNFDataInstrmkInstr::MapChar(Int->Instr)mkInstr :: Map Char (Int -> Instr)
mkInstr=[(Char, Int -> Instr)] -> Map Char (Int -> Instr)
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList[(Char
'F',Int -> Instr
Forward),(Char
'L',Dir -> Instr
Turn(Dir -> Instr) -> (Int -> Dir) -> Int -> Instr
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Dir -> Int -> Dir
forall m x. (Group m, Integral x) => m -> x -> m
powDir
West(Int -> Dir) -> (Int -> Int) -> Int -> Dir
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div`Int
90)),(Char
'R',Dir -> Instr
Turn(Dir -> Instr) -> (Int -> Dir) -> Int -> Instr
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Dir -> Int -> Dir
forall m x. (Group m, Integral x) => m -> x -> m
powDir
East(Int -> Dir) -> (Int -> Int) -> Int -> Dir
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Int -> Int -> Int
forall a. Integral a => a -> a -> a
`div`Int
90)),(Char
'N',Point -> Instr
Move(Point -> Instr) -> (Int -> Point) -> Int -> Instr
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Int -> Point -> Point
forall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^Dir -> Point
forall a. Num a => Dir -> V2 a
dirPointDir
North)),(Char
'S',Point -> Instr
Move(Point -> Instr) -> (Int -> Point) -> Int -> Instr
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Int -> Point -> Point
forall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^Dir -> Point
forall a. Num a => Dir -> V2 a
dirPointDir
South)),(Char
'E',Point -> Instr
Move(Point -> Instr) -> (Int -> Point) -> Int -> Instr
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Int -> Point -> Point
forall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^Dir -> Point
forall a. Num a => Dir -> V2 a
dirPointDir
East)),(Char
'W',Point -> Instr
Move(Point -> Instr) -> (Int -> Point) -> Int -> Instr
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Int -> Point -> Point
forall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^Dir -> Point
forall a. Num a => Dir -> V2 a
dirPointDir
West))]parseInstr::String->MaybeInstrparseInstr :: String -> Maybe Instr
parseInstr[]=Maybe Instr
forall a. Maybe a
NothingparseInstr(Char
c:String
n)=Char -> Map Char (Int -> Instr) -> Maybe (Int -> Instr)
forall k a. Ord k => k -> Map k a -> Maybe a
M.lookupChar
cMap Char (Int -> Instr)
mkInstrMaybe (Int -> Instr) -> Maybe Int -> Maybe Instr
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*>String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybeString
nday12a::[Instr]:~>Pointday12a :: [Instr] :~> Point
day12a=MkSol :: forall a b.
(String -> Maybe a)
-> ((?dyno::DynoMap) => a -> Maybe b) -> (b -> String) -> a :~> b
MkSol{sParse :: String -> Maybe [Instr]
sParse=(String -> Maybe Instr) -> [String] -> Maybe [Instr]
forall (t :: * -> *) (f :: * -> *) a b.
(Traversable t, Applicative f) =>
(a -> f b) -> t a -> f (t b)
traverseString -> Maybe Instr
parseInstr([String] -> Maybe [Instr])
-> (String -> [String]) -> String -> Maybe [Instr]
forall b c a. (b -> c) -> (a -> b) -> a -> c
.String -> [String]
lines,sShow :: Point -> String
sShow=Int -> String
forall a. Show a => a -> String
show(Int -> String) -> (Point -> Int) -> Point -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Point -> Point -> Int
forall (f :: * -> *) a.
(Foldable f, Num a, Num (f a)) =>
f a -> f a -> a
mannDistPoint
0,sSolve :: (?dyno::DynoMap) => [Instr] -> Maybe Point
sSolve=Point -> Maybe Point
forall a. a -> Maybe a
Just(Point -> Maybe Point)
-> ([Instr] -> Point) -> [Instr] -> Maybe Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Dir, Point) -> Point
forall a b. (a, b) -> b
snd((Dir, Point) -> Point)
-> ([Instr] -> (Dir, Point)) -> [Instr] -> Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
.((Dir, Point) -> Instr -> (Dir, Point))
-> (Dir, Point) -> [Instr] -> (Dir, Point)
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl'(Dir, Point) -> Instr -> (Dir, Point)
go(Dir
East,Point
0)}wherego::(Dir,Point)->Instr->(Dir,Point)go :: (Dir, Point) -> Instr -> (Dir, Point)
go(!Dir
dir,!Point
p)=\caseForwardInt
n->(Dir
dir,Point
pPoint -> Point -> Point
forall a. Num a => a -> a -> a
+Int
nInt -> Point -> Point
forall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^Dir -> Point
forall a. Num a => Dir -> V2 a
dirPointDir
dir)TurnDir
d->(Dir
dirDir -> Dir -> Dir
forall a. Semigroup a => a -> a -> a
<>Dir
d,Point
p)MovePoint
r->(Dir
dir,Point
pPoint -> Point -> Point
forall a. Num a => a -> a -> a
+Point
r)day12b::[Instr]:~>Pointday12b :: [Instr] :~> Point
day12b=MkSol :: forall a b.
(String -> Maybe a)
-> ((?dyno::DynoMap) => a -> Maybe b) -> (b -> String) -> a :~> b
MkSol{sParse :: String -> Maybe [Instr]
sParse=([Instr] :~> Point) -> String -> Maybe [Instr]
forall a b. (a :~> b) -> String -> Maybe a
sParse[Instr] :~> Point
day12a,sShow :: Point -> String
sShow=Int -> String
forall a. Show a => a -> String
show(Int -> String) -> (Point -> Int) -> Point -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Point -> Point -> Int
forall (f :: * -> *) a.
(Foldable f, Num a, Num (f a)) =>
f a -> f a -> a
mannDistPoint
0,sSolve :: (?dyno::DynoMap) => [Instr] -> Maybe Point
sSolve=Point -> Maybe Point
forall a. a -> Maybe a
Just(Point -> Maybe Point)
-> ([Instr] -> Point) -> [Instr] -> Maybe Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
.(Point, Point) -> Point
forall a b. (a, b) -> a
fst((Point, Point) -> Point)
-> ([Instr] -> (Point, Point)) -> [Instr] -> Point
forall b c a. (b -> c) -> (a -> b) -> a -> c
.((Point, Point) -> Instr -> (Point, Point))
-> (Point, Point) -> [Instr] -> (Point, Point)
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl'(Point, Point) -> Instr -> (Point, Point)
go(Point
0,Int -> Int -> Point
forall a. a -> a -> V2 a
V2Int
10Int
1)}wherego::(Point,Point)->Instr->(Point,Point)go :: (Point, Point) -> Instr -> (Point, Point)
go(!Point
shp,!Point
wp)=\caseForwardInt
n->(Point
shpPoint -> Point -> Point
forall a. Num a => a -> a -> a
+Int
nInt -> Point -> Point
forall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^Point
wp,Point
wp)TurnDir
d->(Point
shp,Dir -> Point -> Point
forall a. Num a => Dir -> V2 a -> V2 a
rotPointDir
dPoint
wp)MovePoint
r->(Point
shp,Point
wpPoint -> Point -> Point
forall a. Num a => a -> a -> a
+Point
r)