1
1
module AOC2017.Day25 (day25a , day25b ) where
2
2
3
- import AOC2017.Types (Challenge )
3
+ import AOC2017.Types (Challenge )
4
4
import AOC2017.Util
5
- import AOC2017.Util.Tape
6
5
import Control.Lens
7
- import Control.Monad.Trans.Maybe
8
- import Control.Monad.Trans.State
9
- import Control.Monad.Trans.Writer
10
- import Data.Foldable
11
- import qualified Data.IntMap as IM
12
- import qualified Data.IntSet as IS
13
- import qualified Data.Map as M
14
- import qualified Data.Set as S
15
- import qualified Text.Megaparsec as P
16
- import qualified Text.Megaparsec.Char as P
6
+ import qualified Data.IntSet as IS
17
7
18
8
data St = SA | SB | SC | SD | SE | SF
19
9
20
10
data Dir = DL | DR
21
11
22
12
type Rule = (Bool , Dir , St )
23
13
24
- type TapeState = (Tape Bool , St )
25
-
14
+ type TapeState = (Int , IS. IntSet , St )
26
15
27
16
rule :: St -> (Rule , Rule )
28
17
rule = \ case
@@ -34,19 +23,21 @@ rule = \case
34
23
SF -> ((True , DR , SA ), (False , DL , SE ))
35
24
36
25
step :: TapeState -> TapeState
37
- step (! t0, ! st0) = (t1, st1)
26
+ step (! i0, ! t0, ! st0) = (i1, t1, st1)
38
27
where
39
- t1 = t0 & tFocus .~ newFoc
40
- & case dirTurn of
41
- DL -> moveLeftD False
42
- DR -> moveRightD False
28
+ i1 = case dirTurn of
29
+ DL -> i0 - 1
30
+ DR -> i0 + 1
31
+ t1 = t0 & if newFoc
32
+ then IS. insert i0
33
+ else IS. delete i0
43
34
(newFoc, dirTurn, st1)
44
- | t0 ^. tFocus = snd (rule st0)
45
- | otherwise = fst (rule st0)
35
+ | i0 `IS.member` t0 = snd (rule st0)
36
+ | otherwise = fst (rule st0)
46
37
47
38
day25a :: Challenge
48
- day25a _ = show . length . filter id . toList . fst
49
- $ iterate step (Tape [] False [] , SA ) !!! 12964419
39
+ day25a _ = show . IS. size . view _2
40
+ $ iterate step (0 , IS. empty , SA ) !!! 12964419
50
41
51
42
day25b :: Challenge
52
- day25b = undefined
43
+ day25b _ = " Merry Christmas! "
0 commit comments