2020 day 8 part 1
This commit is contained in:
parent
b18c8dffec
commit
96e92a3aa8
2 changed files with 715 additions and 0 deletions
641
2020/day08/input
Normal file
641
2020/day08/input
Normal file
|
@ -0,0 +1,641 @@
|
|||
acc +3
|
||||
jmp +599
|
||||
nop +311
|
||||
jmp +605
|
||||
acc -3
|
||||
acc +50
|
||||
acc -6
|
||||
jmp +461
|
||||
jmp -4
|
||||
acc -7
|
||||
jmp +1
|
||||
acc +19
|
||||
acc -18
|
||||
jmp +485
|
||||
nop +182
|
||||
jmp +174
|
||||
acc +41
|
||||
acc +10
|
||||
nop +570
|
||||
jmp +428
|
||||
acc +18
|
||||
acc +33
|
||||
jmp +197
|
||||
jmp +202
|
||||
acc +43
|
||||
acc -19
|
||||
acc -12
|
||||
jmp +453
|
||||
acc +8
|
||||
jmp +55
|
||||
acc +5
|
||||
nop +482
|
||||
acc -11
|
||||
jmp +475
|
||||
acc -5
|
||||
acc +38
|
||||
acc -16
|
||||
nop +111
|
||||
jmp +230
|
||||
acc +41
|
||||
acc -4
|
||||
jmp +16
|
||||
nop +147
|
||||
jmp -15
|
||||
nop -28
|
||||
jmp +96
|
||||
acc +34
|
||||
acc +27
|
||||
jmp -25
|
||||
jmp +8
|
||||
acc +8
|
||||
nop +28
|
||||
jmp +515
|
||||
jmp +247
|
||||
jmp +474
|
||||
nop +392
|
||||
jmp +57
|
||||
nop +271
|
||||
acc +20
|
||||
jmp +514
|
||||
acc +22
|
||||
jmp +337
|
||||
acc +47
|
||||
acc +43
|
||||
acc +42
|
||||
nop +263
|
||||
jmp +144
|
||||
acc +26
|
||||
acc +49
|
||||
acc +22
|
||||
jmp +170
|
||||
nop +502
|
||||
acc +26
|
||||
acc -3
|
||||
jmp +96
|
||||
acc -9
|
||||
nop +213
|
||||
acc +1
|
||||
jmp +111
|
||||
nop +189
|
||||
jmp +533
|
||||
acc -18
|
||||
acc -15
|
||||
jmp +209
|
||||
nop +464
|
||||
jmp +463
|
||||
acc +16
|
||||
acc +39
|
||||
acc +36
|
||||
jmp +499
|
||||
acc +42
|
||||
jmp +1
|
||||
jmp +444
|
||||
acc +33
|
||||
acc -5
|
||||
nop +513
|
||||
acc +17
|
||||
jmp +377
|
||||
jmp +410
|
||||
acc -5
|
||||
jmp +312
|
||||
jmp +235
|
||||
acc -4
|
||||
acc +32
|
||||
acc +40
|
||||
jmp +477
|
||||
jmp +388
|
||||
jmp +112
|
||||
acc +45
|
||||
acc +36
|
||||
jmp -68
|
||||
nop +296
|
||||
jmp +496
|
||||
acc -19
|
||||
acc +1
|
||||
acc -8
|
||||
jmp +1
|
||||
jmp +479
|
||||
jmp +195
|
||||
acc -13
|
||||
acc +50
|
||||
acc +30
|
||||
jmp +167
|
||||
jmp +217
|
||||
acc +17
|
||||
acc +8
|
||||
jmp +22
|
||||
acc +46
|
||||
acc -5
|
||||
jmp +53
|
||||
jmp +152
|
||||
acc +29
|
||||
acc +1
|
||||
acc +24
|
||||
jmp +278
|
||||
acc +20
|
||||
jmp +95
|
||||
acc +15
|
||||
jmp +1
|
||||
acc +36
|
||||
jmp +286
|
||||
acc +44
|
||||
acc +33
|
||||
jmp +117
|
||||
acc +12
|
||||
acc +16
|
||||
jmp +1
|
||||
jmp +284
|
||||
acc -15
|
||||
nop +478
|
||||
acc -17
|
||||
jmp +13
|
||||
nop +274
|
||||
nop +217
|
||||
nop +91
|
||||
jmp -113
|
||||
nop -58
|
||||
acc +11
|
||||
acc +28
|
||||
nop +301
|
||||
jmp +132
|
||||
acc -7
|
||||
acc +18
|
||||
jmp +173
|
||||
acc +39
|
||||
nop +435
|
||||
jmp +388
|
||||
acc +15
|
||||
acc +50
|
||||
jmp +152
|
||||
acc -8
|
||||
acc -10
|
||||
acc +15
|
||||
acc +39
|
||||
jmp +166
|
||||
acc +14
|
||||
jmp +310
|
||||
nop +371
|
||||
acc +26
|
||||
jmp +161
|
||||
acc +37
|
||||
jmp -147
|
||||
acc -12
|
||||
acc +37
|
||||
nop -78
|
||||
jmp +11
|
||||
acc +5
|
||||
nop -130
|
||||
jmp +182
|
||||
acc +23
|
||||
acc +17
|
||||
jmp -14
|
||||
acc +42
|
||||
acc +16
|
||||
acc +40
|
||||
jmp -39
|
||||
nop +325
|
||||
acc +15
|
||||
jmp +70
|
||||
acc +39
|
||||
acc +13
|
||||
nop +211
|
||||
jmp +210
|
||||
acc -18
|
||||
nop +384
|
||||
acc +28
|
||||
jmp -98
|
||||
acc +21
|
||||
acc +12
|
||||
jmp +217
|
||||
acc +22
|
||||
acc +4
|
||||
acc +12
|
||||
jmp +421
|
||||
acc +26
|
||||
nop +298
|
||||
acc +1
|
||||
acc +43
|
||||
jmp -15
|
||||
acc +39
|
||||
nop +217
|
||||
nop +31
|
||||
acc +17
|
||||
jmp -189
|
||||
jmp -68
|
||||
acc -14
|
||||
jmp +287
|
||||
nop +62
|
||||
acc +20
|
||||
acc +50
|
||||
jmp -5
|
||||
acc +26
|
||||
acc -14
|
||||
acc +24
|
||||
acc -2
|
||||
jmp -181
|
||||
acc +12
|
||||
nop -89
|
||||
acc +13
|
||||
jmp -50
|
||||
acc +39
|
||||
jmp +233
|
||||
nop -214
|
||||
acc +47
|
||||
jmp +216
|
||||
acc +21
|
||||
acc +30
|
||||
nop +347
|
||||
acc +34
|
||||
jmp -240
|
||||
nop -196
|
||||
jmp +345
|
||||
acc +48
|
||||
acc +43
|
||||
acc +4
|
||||
nop +266
|
||||
jmp +72
|
||||
acc +7
|
||||
acc +43
|
||||
jmp +1
|
||||
acc +44
|
||||
acc +1
|
||||
acc +21
|
||||
jmp +358
|
||||
acc +20
|
||||
acc +28
|
||||
acc +48
|
||||
jmp +266
|
||||
acc +14
|
||||
acc +30
|
||||
jmp +167
|
||||
nop +18
|
||||
acc +17
|
||||
nop +125
|
||||
acc +14
|
||||
jmp -111
|
||||
nop +332
|
||||
acc -12
|
||||
nop -177
|
||||
jmp +355
|
||||
acc -8
|
||||
jmp -125
|
||||
acc +6
|
||||
jmp -185
|
||||
nop +270
|
||||
acc +32
|
||||
acc +19
|
||||
acc -9
|
||||
jmp +339
|
||||
jmp -13
|
||||
nop +23
|
||||
jmp -109
|
||||
acc -4
|
||||
acc +23
|
||||
acc +39
|
||||
nop +305
|
||||
jmp +130
|
||||
nop -57
|
||||
acc +46
|
||||
jmp +301
|
||||
jmp +1
|
||||
jmp +150
|
||||
acc -6
|
||||
nop -184
|
||||
acc +18
|
||||
jmp -123
|
||||
acc +11
|
||||
acc +40
|
||||
jmp -304
|
||||
acc +16
|
||||
acc +26
|
||||
nop -307
|
||||
jmp +3
|
||||
jmp -194
|
||||
jmp -224
|
||||
acc +8
|
||||
acc +22
|
||||
acc +1
|
||||
acc -1
|
||||
jmp +73
|
||||
jmp +41
|
||||
acc +40
|
||||
jmp +80
|
||||
acc +0
|
||||
acc +39
|
||||
acc +6
|
||||
acc +45
|
||||
jmp -186
|
||||
acc +32
|
||||
acc -5
|
||||
jmp -99
|
||||
acc +47
|
||||
acc +17
|
||||
acc +1
|
||||
acc +0
|
||||
jmp +265
|
||||
jmp +264
|
||||
nop +114
|
||||
acc +13
|
||||
jmp -108
|
||||
nop -278
|
||||
acc +29
|
||||
acc -14
|
||||
jmp -297
|
||||
acc +20
|
||||
acc +37
|
||||
nop +175
|
||||
acc -4
|
||||
jmp +9
|
||||
acc -11
|
||||
nop +136
|
||||
acc +2
|
||||
jmp -37
|
||||
acc +48
|
||||
acc +9
|
||||
acc -7
|
||||
jmp +36
|
||||
acc -15
|
||||
jmp -118
|
||||
acc -9
|
||||
jmp -68
|
||||
acc +26
|
||||
nop -1
|
||||
acc +9
|
||||
jmp -15
|
||||
acc +21
|
||||
acc +13
|
||||
acc -2
|
||||
acc -17
|
||||
jmp -365
|
||||
acc +5
|
||||
acc +8
|
||||
jmp +255
|
||||
acc +16
|
||||
nop -312
|
||||
acc -14
|
||||
jmp -19
|
||||
acc +32
|
||||
acc +37
|
||||
acc +9
|
||||
jmp +1
|
||||
jmp -302
|
||||
jmp +1
|
||||
acc +5
|
||||
acc +45
|
||||
acc +42
|
||||
jmp +61
|
||||
acc +20
|
||||
acc +36
|
||||
jmp +156
|
||||
acc -9
|
||||
jmp +117
|
||||
acc -1
|
||||
nop -389
|
||||
jmp +242
|
||||
acc +9
|
||||
acc -18
|
||||
jmp -5
|
||||
jmp -77
|
||||
acc +17
|
||||
acc +30
|
||||
jmp +172
|
||||
acc -1
|
||||
acc +11
|
||||
acc -6
|
||||
jmp -334
|
||||
jmp +215
|
||||
acc +3
|
||||
acc +24
|
||||
jmp +13
|
||||
jmp +1
|
||||
jmp -369
|
||||
acc +49
|
||||
acc -6
|
||||
acc -14
|
||||
acc -6
|
||||
jmp -234
|
||||
acc +13
|
||||
acc +9
|
||||
acc +11
|
||||
nop +78
|
||||
jmp +115
|
||||
nop -332
|
||||
nop +177
|
||||
jmp +109
|
||||
jmp +157
|
||||
nop -372
|
||||
acc +25
|
||||
jmp +166
|
||||
nop +171
|
||||
jmp -253
|
||||
acc +27
|
||||
acc -11
|
||||
acc -4
|
||||
acc +34
|
||||
jmp +98
|
||||
jmp -240
|
||||
acc +41
|
||||
nop -381
|
||||
acc -4
|
||||
nop -270
|
||||
jmp -328
|
||||
acc +31
|
||||
acc +11
|
||||
acc -2
|
||||
nop -163
|
||||
jmp +148
|
||||
jmp +1
|
||||
nop -91
|
||||
jmp -197
|
||||
jmp +132
|
||||
acc +31
|
||||
nop +109
|
||||
acc +43
|
||||
jmp -319
|
||||
acc -19
|
||||
acc +49
|
||||
acc +38
|
||||
acc +48
|
||||
jmp +86
|
||||
acc -1
|
||||
acc -11
|
||||
acc +2
|
||||
jmp -355
|
||||
acc -3
|
||||
acc +11
|
||||
acc +39
|
||||
jmp -110
|
||||
acc +10
|
||||
nop -465
|
||||
nop -121
|
||||
jmp -110
|
||||
acc +0
|
||||
jmp -5
|
||||
nop -278
|
||||
nop -199
|
||||
nop +118
|
||||
acc +6
|
||||
jmp -47
|
||||
jmp +129
|
||||
acc +26
|
||||
jmp -391
|
||||
acc -15
|
||||
acc +8
|
||||
nop -86
|
||||
jmp +115
|
||||
nop -94
|
||||
acc -7
|
||||
acc +14
|
||||
jmp -183
|
||||
acc -16
|
||||
acc +15
|
||||
acc +23
|
||||
jmp -178
|
||||
jmp +1
|
||||
jmp -365
|
||||
jmp +1
|
||||
jmp -320
|
||||
acc +42
|
||||
nop -289
|
||||
acc +21
|
||||
acc -17
|
||||
jmp -440
|
||||
acc +0
|
||||
acc +5
|
||||
acc +35
|
||||
acc +20
|
||||
jmp +29
|
||||
acc -1
|
||||
acc +20
|
||||
acc +44
|
||||
jmp +50
|
||||
jmp -61
|
||||
acc -2
|
||||
acc +41
|
||||
acc -5
|
||||
jmp -410
|
||||
acc +13
|
||||
nop -315
|
||||
acc -2
|
||||
jmp -46
|
||||
acc +20
|
||||
acc +9
|
||||
acc +38
|
||||
nop -279
|
||||
jmp -113
|
||||
acc +48
|
||||
jmp +86
|
||||
jmp -151
|
||||
jmp +1
|
||||
acc -18
|
||||
nop -291
|
||||
jmp -101
|
||||
jmp +49
|
||||
nop -378
|
||||
jmp -445
|
||||
acc +36
|
||||
acc +41
|
||||
nop -286
|
||||
acc -19
|
||||
jmp -142
|
||||
nop -393
|
||||
acc +0
|
||||
acc -3
|
||||
jmp +10
|
||||
acc +17
|
||||
jmp -327
|
||||
jmp -219
|
||||
acc -5
|
||||
nop -123
|
||||
acc +49
|
||||
acc +36
|
||||
jmp -145
|
||||
jmp -496
|
||||
jmp +48
|
||||
acc +10
|
||||
jmp +11
|
||||
jmp -97
|
||||
acc -8
|
||||
acc +22
|
||||
jmp +53
|
||||
jmp -316
|
||||
acc +32
|
||||
acc -15
|
||||
acc +27
|
||||
acc +33
|
||||
jmp -266
|
||||
jmp -10
|
||||
acc +48
|
||||
acc -10
|
||||
acc +7
|
||||
acc +5
|
||||
jmp +28
|
||||
acc -15
|
||||
acc -19
|
||||
acc -8
|
||||
nop -150
|
||||
jmp -388
|
||||
acc +14
|
||||
acc +45
|
||||
acc -11
|
||||
jmp -451
|
||||
acc +42
|
||||
acc -8
|
||||
jmp -104
|
||||
nop -228
|
||||
acc +0
|
||||
jmp -327
|
||||
acc +19
|
||||
acc -7
|
||||
jmp +1
|
||||
jmp -291
|
||||
acc -8
|
||||
jmp -495
|
||||
jmp -61
|
||||
jmp -392
|
||||
acc +1
|
||||
jmp -227
|
||||
acc -10
|
||||
jmp -286
|
||||
jmp -397
|
||||
jmp -539
|
||||
jmp -215
|
||||
acc +15
|
||||
acc +36
|
||||
acc -12
|
||||
acc +5
|
||||
jmp -147
|
||||
acc +28
|
||||
acc -15
|
||||
acc +19
|
||||
jmp +16
|
||||
jmp -493
|
||||
acc +7
|
||||
acc +40
|
||||
acc +23
|
||||
nop -122
|
||||
jmp -567
|
||||
acc -4
|
||||
acc +23
|
||||
jmp -218
|
||||
jmp -13
|
||||
acc -18
|
||||
acc -10
|
||||
acc -13
|
||||
nop -541
|
||||
jmp -105
|
||||
acc +14
|
||||
acc +40
|
||||
acc +0
|
||||
jmp -614
|
||||
acc +3
|
||||
acc +14
|
||||
jmp -357
|
||||
jmp -510
|
||||
jmp -416
|
||||
acc +12
|
||||
nop -245
|
||||
acc +26
|
||||
acc +15
|
||||
jmp +1
|
74
2020/day08/part1.hs
Normal file
74
2020/day08/part1.hs
Normal file
|
@ -0,0 +1,74 @@
|
|||
import Control.Monad
|
||||
import Control.Monad.Trans.State
|
||||
import Data.Bifunctor
|
||||
import Data.IntMap.Strict (IntMap)
|
||||
import qualified Data.IntMap.Strict as IntMap
|
||||
import Data.Set (Set)
|
||||
import qualified Data.Set as Set
|
||||
|
||||
type Instruction = (String, Int)
|
||||
type Instructions = IntMap Instruction
|
||||
data VMState = VMState {
|
||||
accumulator :: Int,
|
||||
pointer :: Int,
|
||||
visited :: Set Int,
|
||||
instructions :: Instructions
|
||||
} deriving (Eq, Show)
|
||||
data VMResult = Continue | Halt deriving (Eq, Show)
|
||||
type VM = State VMState
|
||||
|
||||
main = do
|
||||
input <- readFile "input"
|
||||
print . fst . runState vmRun $ VMState {
|
||||
accumulator = 0,
|
||||
instructions = readInstructions $ input,
|
||||
pointer = 0,
|
||||
visited = Set.empty
|
||||
}
|
||||
|
||||
vmRun :: VM Int
|
||||
vmRun = do
|
||||
result <- vmStep
|
||||
case result of
|
||||
Continue -> vmRun
|
||||
Halt -> gets accumulator
|
||||
|
||||
vmStep :: VM VMResult
|
||||
vmStep = do
|
||||
halt <- shouldHalt
|
||||
instruction <- nextInstruction
|
||||
unless halt $ let (opcode, value) = instruction in case opcode of
|
||||
"acc" -> modify $ \s -> s { accumulator = accumulator s + value }
|
||||
"jmp" -> modify $ \s -> s { pointer = pointer s + value - 1 }
|
||||
otherwise -> pass
|
||||
modify incrementPointer
|
||||
return $ if halt then Halt else Continue
|
||||
|
||||
shouldHalt :: VM Bool
|
||||
shouldHalt = do
|
||||
pointer <- gets pointer
|
||||
visited <- gets visited
|
||||
return $ Set.member pointer visited
|
||||
|
||||
incrementPointer :: VMState -> VMState
|
||||
incrementPointer vms = vms {
|
||||
pointer = pointer vms + 1,
|
||||
visited = pointer vms `Set.insert` visited vms
|
||||
}
|
||||
|
||||
nextInstruction :: VM Instruction
|
||||
nextInstruction = do
|
||||
pointer <- gets pointer
|
||||
instructions <- gets instructions
|
||||
return $ IntMap.findWithDefault ("err", 0) pointer instructions
|
||||
|
||||
-- Oh yeah, parse those lines, you can do it!
|
||||
readInstructions :: String -> Instructions
|
||||
readInstructions = IntMap.fromDistinctAscList . zip [0..] . map ((second $ read . cond ((=='+') . head) tail . tail) . break (== ' ')) . lines
|
||||
|
||||
-- Conditionally execute a transformation
|
||||
cond :: (a -> Bool) -> (a -> a) -> a -> a
|
||||
cond predicate f a = if predicate a then f a else a
|
||||
|
||||
pass :: Monad m => m ()
|
||||
pass = return ()
|
Loading…
Reference in a new issue