Day 5
authorNeil Smith <neil.git@njae.me.uk>
Tue, 5 Dec 2017 11:21:45 +0000 (11:21 +0000)
committerNeil Smith <neil.git@njae.me.uk>
Tue, 5 Dec 2017 11:21:45 +0000 (11:21 +0000)
advent-of-code.cabal
data/advent05.txt [new file with mode: 0644]
src/advent05/advent05.hs [new file with mode: 0644]
src/advent05/advent05.ipynb [new file with mode: 0644]
src/advent05/advent05vector.hs [new file with mode: 0644]

index f00fc9b8b7657b70905cd1b24abf6c8b39ef5e80..6808b0c80835dd23a529097a8647d6c68237f527 100644 (file)
@@ -52,7 +52,12 @@ executable advent04
   hs-source-dirs:      src/advent04
   main-is:             advent04.hs
   default-language:    Haskell2010
+  build-depends:       base >= 4.7 && < 5
+
+executable advent05
+  hs-source-dirs:      src/advent05
+  main-is:             advent05.hs
+  default-language:    Haskell2010
   build-depends:       base >= 4.7 && < 5
                      , containers
-                     , split
-                     
\ No newline at end of file
+                     , mtl
diff --git a/data/advent05.txt b/data/advent05.txt
new file mode 100644 (file)
index 0000000..0c0a0fa
--- /dev/null
@@ -0,0 +1,1003 @@
+1
+1
+1
+1
+0
+0
+0
+-4
+-1
+0
+-3
+-4
+0
+-9
+-3
+2
+-14
+0
+-17
+-12
+-15
+-7
+0
+-7
+-12
+-3
+-17
+-11
+-24
+-10
+-16
+-15
+-28
+-13
+-28
+-15
+-28
+-29
+-20
+0
+-10
+-30
+-13
+-24
+-34
+-42
+-25
+-36
+-38
+-35
+-23
+-11
+-4
+-16
+-15
+-10
+-31
+0
+-16
+-21
+-50
+-26
+-31
+-36
+-53
+-54
+-12
+-28
+1
+-16
+-65
+-69
+-4
+-47
+1
+-42
+-33
+-55
+-72
+-29
+-2
+-62
+-40
+-28
+0
+-42
+-78
+2
+-23
+-86
+-75
+-17
+-15
+-9
+0
+-24
+-36
+-91
+-64
+-65
+-98
+-30
+-21
+-80
+0
+-88
+-105
+-103
+-32
+-54
+-62
+-105
+-68
+-101
+-73
+-26
+-112
+-96
+-66
+-115
+-53
+-69
+-99
+-84
+-46
+-105
+-16
+-18
+-104
+-19
+-16
+-9
+-45
+-40
+-40
+-11
+-105
+-105
+-72
+-89
+-3
+-119
+-74
+-124
+-111
+-128
+-79
+-145
+-138
+-147
+-92
+-44
+-115
+-51
+-139
+-15
+-72
+-116
+-149
+-38
+-55
+-63
+-62
+-3
+-48
+-115
+-33
+-56
+-51
+-28
+-8
+-15
+-162
+-7
+-24
+-72
+-104
+-7
+-23
+-16
+-25
+-169
+-157
+-53
+-123
+-183
+-127
+-98
+-133
+-180
+-96
+-56
+-57
+-123
+-123
+0
+-35
+-174
+-91
+-167
+-121
+-67
+-47
+-201
+0
+-111
+-158
+-36
+-62
+-111
+-114
+-183
+-139
+-108
+-74
+-154
+-12
+-18
+-182
+-217
+-199
+-68
+-212
+-183
+-126
+-56
+-112
+-211
+-203
+-223
+-40
+0
+-225
+-101
+-24
+-91
+-94
+-80
+-190
+-6
+-234
+-2
+-222
+-208
+-46
+-163
+-136
+-45
+-17
+-141
+-18
+-67
+-224
+-39
+-135
+-91
+-91
+-146
+-158
+-70
+-33
+-232
+-54
+-45
+-80
+-124
+-221
+-130
+-236
+-112
+-238
+-11
+-34
+-110
+-198
+-15
+-252
+-230
+-118
+-230
+-193
+-119
+-162
+-214
+-206
+-158
+-199
+-141
+-167
+-9
+-140
+-185
+-126
+-106
+-293
+-142
+-290
+-78
+-137
+-274
+-186
+-88
+-167
+-287
+-218
+-300
+-5
+-81
+-108
+-287
+-276
+-235
+-189
+-116
+-16
+-232
+-32
+-189
+-78
+-8
+-72
+-219
+-12
+-63
+-7
+-114
+-170
+-125
+-162
+-19
+-140
+-152
+-3
+-127
+-314
+-158
+-301
+-153
+-62
+-7
+-94
+-182
+-61
+-6
+-285
+-260
+-123
+-298
+-131
+-66
+-155
+-347
+-181
+-71
+-143
+-232
+-146
+-100
+0
+-101
+-315
+-53
+-348
+-209
+-320
+-212
+-358
+-108
+-101
+-188
+-218
+-309
+-290
+-245
+-253
+-111
+-188
+-104
+-296
+-14
+-306
+-335
+-87
+-284
+-14
+-117
+-143
+-386
+-367
+-292
+-251
+-289
+-340
+-41
+-85
+-52
+-236
+-265
+-265
+-341
+-395
+-110
+-311
+-391
+-79
+-262
+-214
+-395
+-205
+-50
+-318
+-198
+-199
+-44
+-153
+-403
+-261
+-290
+-55
+-321
+-407
+-17
+-30
+-342
+-321
+-37
+-197
+-5
+-305
+-394
+-373
+-297
+-40
+-114
+-240
+-218
+-164
+-334
+-337
+-38
+-124
+-362
+-209
+-79
+-208
+-277
+-341
+-345
+-112
+-137
+-306
+-90
+-10
+-50
+-447
+-445
+-50
+-327
+-374
+-441
+-197
+-231
+-31
+-361
+-444
+-109
+-294
+-452
+-327
+-411
+-137
+-326
+-201
+-217
+-277
+-245
+-263
+-111
+-286
+-265
+-298
+-107
+-204
+-395
+-299
+-175
+-158
+-94
+-34
+2
+-55
+-113
+-278
+-74
+-380
+-167
+-429
+-261
+-57
+-95
+-215
+-392
+-121
+-460
+-250
+-393
+-41
+-183
+-123
+-367
+-387
+-66
+-431
+-399
+-295
+-449
+-10
+-461
+-392
+-277
+-302
+-460
+-197
+-307
+-229
+-296
+-415
+-313
+-334
+-172
+-303
+-439
+-479
+-364
+-156
+-287
+-315
+-265
+-153
+-134
+-238
+-88
+1
+-306
+-399
+-197
+-363
+-156
+-370
+-313
+-365
+-510
+-91
+-464
+-177
+-550
+-95
+-49
+-108
+-24
+-289
+-229
+-547
+0
+-538
+-164
+-202
+-190
+-92
+-302
+-416
+-42
+-148
+-192
+-246
+-118
+-144
+-264
+-497
+-276
+-350
+-318
+-219
+-301
+-398
+-12
+-292
+-395
+-565
+-102
+-118
+-424
+-3
+-473
+-94
+-413
+-145
+-38
+-97
+-485
+-363
+-309
+-250
+-506
+-345
+-346
+-447
+-319
+-330
+-198
+-255
+-353
+-260
+-370
+-22
+-91
+-345
+-333
+-315
+-593
+-450
+-37
+-380
+-543
+-5
+-556
+-164
+-135
+-513
+-56
+-166
+-474
+-14
+-84
+-561
+-596
+-454
+-429
+-457
+-69
+-59
+-597
+-598
+-391
+-260
+-596
+-384
+-267
+-34
+-158
+-531
+-243
+-495
+-165
+-190
+-466
+-574
+-344
+-365
+-277
+-329
+-64
+-616
+-123
+-551
+-537
+-412
+-333
+-589
+-212
+-376
+-290
+-366
+-363
+-477
+-39
+-37
+-495
+-317
+-554
+-675
+-442
+-427
+-407
+-515
+-169
+-113
+-395
+-561
+-358
+-214
+-20
+-424
+-74
+-311
+-110
+-353
+-112
+-217
+-181
+-496
+-336
+-311
+-585
+-407
+-383
+-663
+-266
+-591
+-235
+-266
+-406
+-347
+-268
+-281
+-449
+-569
+-8
+-178
+-62
+-139
+-89
+-72
+-487
+-352
+-164
+-244
+-640
+-139
+-639
+-330
+-348
+-390
+-260
+-632
+-171
+-343
+-700
+-21
+-653
+-250
+-20
+-587
+-357
+-151
+-536
+-287
+-614
+-582
+-564
+-136
+-613
+-130
+-717
+-54
+-35
+-205
+-49
+-711
+-538
+-342
+-222
+-579
+-300
+-641
+-240
+-198
+-76
+-550
+-73
+-528
+-465
+-485
+-327
+-433
+-325
+-441
+-575
+-661
+-126
+-588
+-315
+-651
+-692
+-189
+-656
+-533
+-627
+-459
+-244
+-737
+-422
+-647
+-324
+-759
+-592
+-305
+-281
+-360
+-79
+-271
+-52
+-129
+-416
+-39
+-497
+-147
+-755
+-398
+-382
+-217
+-301
+-581
+-345
+-310
+-68
+-90
+-128
+-303
+-416
+-348
+-745
+-204
+-795
+-482
+-537
+-315
+-662
+-432
+-464
+-239
+-19
+-216
+-230
+-240
+-612
+-129
+-655
+-197
+-369
+-89
+-573
+-180
+-229
+-264
+-268
+-401
+-820
+-412
+-99
+-666
+-360
+-814
+-348
+-755
+-772
+-296
+-851
+-818
+-394
+-161
+-77
+-109
+-362
+-273
+-688
+-574
+-50
+-137
+-550
+-380
+-462
+-851
+-611
+-237
+-853
+-11
+-383
+-767
+-349
+-170
+-389
+-747
+-247
+-462
+-839
+-87
+-852
+-672
+-796
+-839
+-788
+-78
+-151
+-507
+-414
+-363
+-750
+-521
+-468
+-418
+-251
+-803
+-802
+-269
+-766
+-520
+-301
+-156
+-488
+-130
+-100
+-191
+-45
+-352
+-774
+-506
+-306
+-517
+-220
+-62
+-523
+-111
+-157
+-516
+-541
+-888
+-514
+-223
+-902
+-159
+-255
+-699
+-901
+-893
+-273
+-602
+-850
+-382
+-207
+-528
+-566
+-834
+-695
+-25
+-166
+-650
+-569
+-667
+-771
+-809
+-922
+-858
+-53
+-703
+-552
+-584
+-190
+-193
+-146
+-218
+-503
+-252
+-432
+-93
+-180
+-277
+-250
+-610
+-194
+-415
+-67
+-793
+-413
+-930
+-785
+-890
+-417
+-501
+-109
+-839
+-916
+-860
+-467
+-741
+-645
+-795
+-769
+-665
+-974
+-318
+-334
+-963
+-674
+-432
+-402
+-702
+-724
+-524
+-753
+-146
+-719
+-953
\ No newline at end of file
diff --git a/src/advent05/advent05.hs b/src/advent05/advent05.hs
new file mode 100644 (file)
index 0000000..dc057ef
--- /dev/null
@@ -0,0 +1,65 @@
+{-# LANGUAGE NegativeLiterals #-}
+{-# LANGUAGE FlexibleContexts #-}
+
+import qualified Data.IntMap.Strict as M
+import Data.IntMap.Strict ((!))
+import Control.Monad.State.Lazy
+
+data Machine = Machine { location :: Int
+                       , steps :: Int
+                       , memory :: M.IntMap Int
+                       } deriving (Show, Eq)
+
+main :: IO ()
+main = do 
+        text <- readFile "data/advent05.txt"
+        let locations = map (readJump) $ lines text
+        let m0 = makeMachine locations
+        print $ evalState stepAll m0
+        print $ evalState stepAllB m0
+
+
+readJump :: String -> Int
+readJump = read
+
+makeMachine :: [Int] -> Machine
+makeMachine locations = Machine {location = 0, steps = 0,
+    memory = M.fromList $ zip [0..] locations}
+
+stepAll :: State Machine Int
+stepAll = do
+            m0 <- get
+            if M.member (location m0) (memory m0)
+            then do stepOnce
+                    stepAll
+            else return (steps m0)
+
+stepAllB :: State Machine Int
+stepAllB = do
+            m0 <- get
+            if M.member (location m0) (memory m0)
+            then do stepOnceB
+                    stepAllB
+            else return (steps m0)
+
+stepOnce :: State Machine ()
+stepOnce = 
+    do m0 <- get
+       let mem = memory m0
+       let loc = location m0
+       let loc' = mem!loc + loc
+       let steps' = steps m0 + 1
+       let mem' = M.insert loc (mem!loc + 1) mem
+       put m0 {location = loc', steps = steps', memory = mem'}
+
+stepOnceB :: State Machine ()
+stepOnceB = 
+    do m0 <- get
+       let mem = memory m0
+       let loc = location m0
+       let loc' = mem!loc + loc
+       let steps' = steps m0 + 1
+       let newVal = if mem!loc >= 3 then (mem!loc - 1) else (mem!loc + 1)
+       let mem' = M.insert loc newVal mem
+       put m0 {location = loc', steps = steps', memory = mem'} 
+
diff --git a/src/advent05/advent05.ipynb b/src/advent05/advent05.ipynb
new file mode 100644 (file)
index 0000000..98d805e
--- /dev/null
@@ -0,0 +1,267 @@
+{
+ "cells": [
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "{-# LANGUAGE NegativeLiterals #-}\n",
+    "{-# LANGUAGE FlexibleContexts #-}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import qualified Data.IntMap.Strict as M\n",
+    "import Data.IntMap.Strict ((!))\n",
+    "import Control.Monad.State.Lazy"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "data Machine = Machine { location :: Int\n",
+    "                       , steps :: Int\n",
+    "                       , memory :: M.IntMap Int\n",
+    "                       } deriving (Show, Eq)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "makeMachine :: [Int] -> Machine\n",
+    "makeMachine locations = Machine {location = 0, steps = 0,\n",
+    "    memory = M.fromList $ zip [0..] locations}"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "fromList [(0,0),(1,3),(2,0),(3,1),(4,-3)]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "m0 = M.fromList $ zip [0..] [0, 3,  0,  1,  -3]\n",
+    "m0"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "Machine {location = 0, steps = 0, memory = fromList [(0,0),(1,3),(2,0),(3,1),(4,-3)]}"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "m0 = makeMachine [0, 3,  0,  1,  -3]\n",
+    "m0"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "stepOnce :: State Machine ()\n",
+    "stepOnce = \n",
+    "    do m0 <- get\n",
+    "       let mem = memory m0\n",
+    "       let loc = location m0\n",
+    "       let loc' = mem!loc + loc\n",
+    "       let steps' = steps m0 + 1\n",
+    "       let mem' = M.insert loc (mem!loc + 1) mem\n",
+    "       put m0 {location = loc', steps = steps', memory = mem'}\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 34,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "stepOnceB :: State Machine ()\n",
+    "stepOnceB = \n",
+    "    do m0 <- get\n",
+    "       let mem = memory m0\n",
+    "       let loc = location m0\n",
+    "       let loc' = mem!loc + loc\n",
+    "       let steps' = steps m0 + 1\n",
+    "       let newVal = if mem!loc >= 3 then (mem!loc - 1) else (mem!loc + 1)\n",
+    "       let mem' = M.insert loc newVal mem\n",
+    "       put m0 {location = loc', steps = steps', memory = mem'}\n"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 35,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "stepAllB :: State Machine Int\n",
+    "stepAllB = do\n",
+    "            m0 <- get\n",
+    "            if M.member (location m0) (memory m0)\n",
+    "            then do stepOnceB\n",
+    "                    stepAllB\n",
+    "            else return (steps m0)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 36,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "5"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "evalState stepAll m0"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 37,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "10"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "evalState stepAllB m0"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 28,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "readJump :: String -> Int\n",
+    "readJump = read"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 38,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "main :: IO ()\n",
+    "main = do \n",
+    "        text <- readFile \"../../data/advent05.txt\"\n",
+    "        let locations = map (readJump) $ lines text\n",
+    "        let m0 = makeMachine locations\n",
+    "        print $ evalState stepAll m0\n",
+    "        print $ evalState stepAllB m0"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 39,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "315613\n",
+       "22570529"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "main"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 29,
+   "metadata": {
+    "scrolled": true
+   },
+   "outputs": [
+    {
+     "data": {
+      "text/plain": [
+       "[1,1,1,1,0,0,0,-4,-1,0,-3,-4,0,-9,-3,2,-14,0,-17,-12,-15,-7,0,-7,-12,-3,-17,-11,-24,-10,-16,-15,-28,-13,-28,-15,-28,-29,-20,0,-10,-30,-13,-24,-34,-42,-25,-36,-38,-35,-23,-11,-4,-16,-15,-10,-31,0,-16,-21,-50,-26,-31,-36,-53,-54,-12,-28,1,-16,-65,-69,-4,-47,1,-42,-33,-55,-72,-29,-2,-62,-40,-28,0,-42,-78,2,-23,-86,-75,-17,-15,-9,0,-24,-36,-91,-64,-65,-98,-30,-21,-80,0,-88,-105,-103,-32,-54,-62,-105,-68,-101,-73,-26,-112,-96,-66,-115,-53,-69,-99,-84,-46,-105,-16,-18,-104,-19,-16,-9,-45,-40,-40,-11,-105,-105,-72,-89,-3,-119,-74,-124,-111,-128,-79,-145,-138,-147,-92,-44,-115,-51,-139,-15,-72,-116,-149,-38,-55,-63,-62,-3,-48,-115,-33,-56,-51,-28,-8,-15,-162,-7,-24,-72,-104,-7,-23,-16,-25,-169,-157,-53,-123,-183,-127,-98,-133,-180,-96,-56,-57,-123,-123,0,-35,-174,-91,-167,-121,-67,-47,-201,0,-111,-158,-36,-62,-111,-114,-183,-139,-108,-74,-154,-12,-18,-182,-217,-199,-68,-212,-183,-126,-56,-112,-211,-203,-223,-40,0,-225,-101,-24,-91,-94,-80,-190,-6,-234,-2,-222,-208,-46,-163,-136,-45,-17,-141,-18,-67,-224,-39,-135,-91,-91,-146,-158,-70,-33,-232,-54,-45,-80,-124,-221,-130,-236,-112,-238,-11,-34,-110,-198,-15,-252,-230,-118,-230,-193,-119,-162,-214,-206,-158,-199,-141,-167,-9,-140,-185,-126,-106,-293,-142,-290,-78,-137,-274,-186,-88,-167,-287,-218,-300,-5,-81,-108,-287,-276,-235,-189,-116,-16,-232,-32,-189,-78,-8,-72,-219,-12,-63,-7,-114,-170,-125,-162,-19,-140,-152,-3,-127,-314,-158,-301,-153,-62,-7,-94,-182,-61,-6,-285,-260,-123,-298,-131,-66,-155,-347,-181,-71,-143,-232,-146,-100,0,-101,-315,-53,-348,-209,-320,-212,-358,-108,-101,-188,-218,-309,-290,-245,-253,-111,-188,-104,-296,-14,-306,-335,-87,-284,-14,-117,-143,-386,-367,-292,-251,-289,-340,-41,-85,-52,-236,-265,-265,-341,-395,-110,-311,-391,-79,-262,-214,-395,-205,-50,-318,-198,-199,-44,-153,-403,-261,-290,-55,-321,-407,-17,-30,-342,-321,-37,-197,-5,-305,-394,-373,-297,-40,-114,-240,-218,-164,-334,-337,-38,-124,-362,-209,-79,-208,-277,-341,-345,-112,-137,-306,-90,-10,-50,-447,-445,-50,-327,-374,-441,-197,-231,-31,-361,-444,-109,-294,-452,-327,-411,-137,-326,-201,-217,-277,-245,-263,-111,-286,-265,-298,-107,-204,-395,-299,-175,-158,-94,-34,2,-55,-113,-278,-74,-380,-167,-429,-261,-57,-95,-215,-392,-121,-460,-250,-393,-41,-183,-123,-367,-387,-66,-431,-399,-295,-449,-10,-461,-392,-277,-302,-460,-197,-307,-229,-296,-415,-313,-334,-172,-303,-439,-479,-364,-156,-287,-315,-265,-153,-134,-238,-88,1,-306,-399,-197,-363,-156,-370,-313,-365,-510,-91,-464,-177,-550,-95,-49,-108,-24,-289,-229,-547,0,-538,-164,-202,-190,-92,-302,-416,-42,-148,-192,-246,-118,-144,-264,-497,-276,-350,-318,-219,-301,-398,-12,-292,-395,-565,-102,-118,-424,-3,-473,-94,-413,-145,-38,-97,-485,-363,-309,-250,-506,-345,-346,-447,-319,-330,-198,-255,-353,-260,-370,-22,-91,-345,-333,-315,-593,-450,-37,-380,-543,-5,-556,-164,-135,-513,-56,-166,-474,-14,-84,-561,-596,-454,-429,-457,-69,-59,-597,-598,-391,-260,-596,-384,-267,-34,-158,-531,-243,-495,-165,-190,-466,-574,-344,-365,-277,-329,-64,-616,-123,-551,-537,-412,-333,-589,-212,-376,-290,-366,-363,-477,-39,-37,-495,-317,-554,-675,-442,-427,-407,-515,-169,-113,-395,-561,-358,-214,-20,-424,-74,-311,-110,-353,-112,-217,-181,-496,-336,-311,-585,-407,-383,-663,-266,-591,-235,-266,-406,-347,-268,-281,-449,-569,-8,-178,-62,-139,-89,-72,-487,-352,-164,-244,-640,-139,-639,-330,-348,-390,-260,-632,-171,-343,-700,-21,-653,-250,-20,-587,-357,-151,-536,-287,-614,-582,-564,-136,-613,-130,-717,-54,-35,-205,-49,-711,-538,-342,-222,-579,-300,-641,-240,-198,-76,-550,-73,-528,-465,-485,-327,-433,-325,-441,-575,-661,-126,-588,-315,-651,-692,-189,-656,-533,-627,-459,-244,-737,-422,-647,-324,-759,-592,-305,-281,-360,-79,-271,-52,-129,-416,-39,-497,-147,-755,-398,-382,-217,-301,-581,-345,-310,-68,-90,-128,-303,-416,-348,-745,-204,-795,-482,-537,-315,-662,-432,-464,-239,-19,-216,-230,-240,-612,-129,-655,-197,-369,-89,-573,-180,-229,-264,-268,-401,-820,-412,-99,-666,-360,-814,-348,-755,-772,-296,-851,-818,-394,-161,-77,-109,-362,-273,-688,-574,-50,-137,-550,-380,-462,-851,-611,-237,-853,-11,-383,-767,-349,-170,-389,-747,-247,-462,-839,-87,-852,-672,-796,-839,-788,-78,-151,-507,-414,-363,-750,-521,-468,-418,-251,-803,-802,-269,-766,-520,-301,-156,-488,-130,-100,-191,-45,-352,-774,-506,-306,-517,-220,-62,-523,-111,-157,-516,-541,-888,-514,-223,-902,-159,-255,-699,-901,-893,-273,-602,-850,-382,-207,-528,-566,-834,-695,-25,-166,-650,-569,-667,-771,-809,-922,-858,-53,-703,-552,-584,-190,-193,-146,-218,-503,-252,-432,-93,-180,-277,-250,-610,-194,-415,-67,-793,-413,-930,-785,-890,-417,-501,-109,-839,-916,-860,-467,-741,-645,-795,-769,-665,-974,-318,-334,-963,-674,-432,-402,-702,-724,-524,-753,-146,-719,-953]"
+      ]
+     },
+     "metadata": {},
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "txt <- readFile  \"../../data/advent05.txt\"\n",
+    "map readJump $ lines txt"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {},
+   "outputs": [],
+   "source": []
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Haskell",
+   "language": "haskell",
+   "name": "haskell"
+  },
+  "language_info": {
+   "codemirror_mode": "ihaskell",
+   "file_extension": ".hs",
+   "name": "haskell",
+   "version": "8.0.2"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/src/advent05/advent05vector.hs b/src/advent05/advent05vector.hs
new file mode 100644 (file)
index 0000000..dc057ef
--- /dev/null
@@ -0,0 +1,65 @@
+{-# LANGUAGE NegativeLiterals #-}
+{-# LANGUAGE FlexibleContexts #-}
+
+import qualified Data.IntMap.Strict as M
+import Data.IntMap.Strict ((!))
+import Control.Monad.State.Lazy
+
+data Machine = Machine { location :: Int
+                       , steps :: Int
+                       , memory :: M.IntMap Int
+                       } deriving (Show, Eq)
+
+main :: IO ()
+main = do 
+        text <- readFile "data/advent05.txt"
+        let locations = map (readJump) $ lines text
+        let m0 = makeMachine locations
+        print $ evalState stepAll m0
+        print $ evalState stepAllB m0
+
+
+readJump :: String -> Int
+readJump = read
+
+makeMachine :: [Int] -> Machine
+makeMachine locations = Machine {location = 0, steps = 0,
+    memory = M.fromList $ zip [0..] locations}
+
+stepAll :: State Machine Int
+stepAll = do
+            m0 <- get
+            if M.member (location m0) (memory m0)
+            then do stepOnce
+                    stepAll
+            else return (steps m0)
+
+stepAllB :: State Machine Int
+stepAllB = do
+            m0 <- get
+            if M.member (location m0) (memory m0)
+            then do stepOnceB
+                    stepAllB
+            else return (steps m0)
+
+stepOnce :: State Machine ()
+stepOnce = 
+    do m0 <- get
+       let mem = memory m0
+       let loc = location m0
+       let loc' = mem!loc + loc
+       let steps' = steps m0 + 1
+       let mem' = M.insert loc (mem!loc + 1) mem
+       put m0 {location = loc', steps = steps', memory = mem'}
+
+stepOnceB :: State Machine ()
+stepOnceB = 
+    do m0 <- get
+       let mem = memory m0
+       let loc = location m0
+       let loc' = mem!loc + loc
+       let steps' = steps m0 + 1
+       let newVal = if mem!loc >= 3 then (mem!loc - 1) else (mem!loc + 1)
+       let mem' = M.insert loc newVal mem
+       put m0 {location = loc', steps = steps', memory = mem'} 
+