2019-12-12 20:45:35 +01:00
module Main where
import Data.List.Split
import qualified Data.Map.Strict as M
import qualified Data.Vector as V
2019-12-12 22:06:32 +01:00
import Intcode
2019-12-13 10:45:20 +01:00
import Helpers
2019-12-12 20:45:35 +01:00
import Linear.V2
data RoboState =
RoboState
{ hull :: M . Map ( V2 Int ) Integer
, position :: V2 Int
, direction :: V2 Int
2019-12-12 22:06:32 +01:00
}
deriving ( Show )
2019-12-12 20:45:35 +01:00
main :: IO ()
main = do
content <- readFile " input "
let program = V . fromList $ concatMap ( map read . splitOn " , " ) ( lines content )
let run x =
runIntcode
2019-12-12 22:06:32 +01:00
( TM
{ tape = tapePreprocess program
, pointer = 0
, pointerOffset = 0
, output = []
, input = Just x
, state = Continue
}
, RoboState { hull = M . empty , position = V2 0 0 , direction = V2 0 1 } )
2019-12-12 20:45:35 +01:00
print $ length $ hull $ snd $ run 0
2019-12-13 10:45:20 +01:00
putStrLn $ drawMap ( M . singleton 1 '•' ) $ M . filter ( == 1 ) $ hull $ snd $ run 1
2019-12-12 22:06:32 +01:00
2019-12-12 20:45:35 +01:00
runIntcode :: ( TuringMachine , RoboState ) -> ( TuringMachine , RoboState )
2019-12-12 22:06:32 +01:00
runIntcode ( tm , rb ) =
2019-12-12 20:45:35 +01:00
case state tmNew of
2019-12-12 22:06:32 +01:00
Continue -> runIntcode ( tmNew , rb )
AwaitInput -> runIntcode $ updateState ( tmNew , rb )
_ -> ( tmNew , rb )
2019-12-12 20:45:35 +01:00
where
tmNew = execSteps tm
updateState :: ( TuringMachine , RoboState ) -> ( TuringMachine , RoboState )
updateState ( tm , rb ) = ( tmNew , rbNew )
2019-12-12 22:06:32 +01:00
where
hullNew = M . insert ( position rb ) ( output tm !! 1 ) ( hull rb )
dirNew =
if head ( output tm ) == 0
then perp $ direction rb
else iterate perp ( direction rb ) !! 3
posNew = position rb + dirNew
floorNext = M . findWithDefault 0 posNew ( hull rb )
rbNew = rb { hull = hullNew , position = posNew , direction = dirNew }
tmNew = tm { input = Just floorNext , output = [] }