day 8. best one yet
parent
3429f8b1c2
commit
0d1acd3f49
@ -0,0 +1,63 @@
|
||||
(* Common util. Should probably put this in a module or something.. *)
|
||||
let get_one_line file =
|
||||
try Some (input_line file) with
|
||||
End_of_file -> None
|
||||
|
||||
let get_lines file =
|
||||
let rec input lines =
|
||||
match get_one_line file with
|
||||
Some line -> input (line :: lines)
|
||||
| None -> List.rev lines
|
||||
in input []
|
||||
|
||||
let read_file file =
|
||||
let channel = open_in(file) in
|
||||
get_lines channel
|
||||
|
||||
(* --- *)
|
||||
|
||||
type operation = Nop | Acc | Jmp
|
||||
type instruction = { op: operation; arg: int }
|
||||
let op_of_string = function | "nop" -> Nop | "acc" -> Acc | "jmp" -> Jmp
|
||||
|
||||
let read_instruction = function |
|
||||
op :: arg :: [] -> { op = op_of_string op; arg = int_of_string arg }
|
||||
|
||||
let rec walk line_num acc lines_touched instructions =
|
||||
if List.length instructions < line_num + 1 (* at the end of the list *)
|
||||
then string_of_int acc (* success! *)
|
||||
else let { op; arg } = List.nth instructions line_num in (* match on the instruction *)
|
||||
if List.mem line_num lines_touched (* if we've already been on this line *)
|
||||
then raise (Failure (string_of_int acc)) (* raise a Failure of acc *)
|
||||
else match op with (* otherwise match on the op *)
|
||||
| Nop -> walk (line_num + 1) acc (line_num :: lines_touched) instructions
|
||||
| Acc -> walk (line_num + 1) (acc + arg) (line_num :: lines_touched) instructions
|
||||
| Jmp -> walk (line_num + arg) acc (line_num :: lines_touched) instructions
|
||||
|
||||
let swap_instruction ins line_num = (* swap the Nop and Jmp at the given line number *)
|
||||
List.mapi (fun i x ->
|
||||
if line_num = i then match x with (* if this is our line *)
|
||||
| { op = Jmp; arg } -> { op = Nop; arg }
|
||||
| { op = Nop; arg } -> { op = Jmp; arg }
|
||||
| a -> a (* if it is any other op, don't change it *)
|
||||
else x (* if it isn't our line number, don't change it *)
|
||||
) ins
|
||||
|
||||
let rec walk_and_fix line_num instructions =
|
||||
let new_instructions = swap_instruction instructions line_num in (* swap nop and jmp *)
|
||||
try walk 0 0 [] new_instructions (* just return the acc this returns, if it doesn't raise *)
|
||||
with Failure acc -> walk_and_fix (line_num + 1) instructions (* Infinite loop detected. recurse! *)
|
||||
|
||||
let () =
|
||||
let ins = read_file "day8.txt"
|
||||
|> List.map @@ String.split_on_char ' '
|
||||
|> List.map read_instruction
|
||||
in
|
||||
|
||||
try walk 0 0 [] ins
|
||||
|> Printf.printf "Complete! Wait this shouldn't have completed.. %s";
|
||||
with Failure acc -> (* catch infinite loop *)
|
||||
Printf.printf "Infinite loop detected. Last acc: %s\n" acc;
|
||||
|
||||
walk_and_fix 0 ins
|
||||
|> Printf.printf "Infinite loop fixed! Last acc: %s\n";
|
@ -0,0 +1,625 @@
|
||||
acc +17
|
||||
acc +37
|
||||
acc -13
|
||||
jmp +173
|
||||
nop +100
|
||||
acc -7
|
||||
jmp +447
|
||||
nop +283
|
||||
acc +41
|
||||
acc +32
|
||||
jmp +1
|
||||
jmp +585
|
||||
jmp +1
|
||||
acc -5
|
||||
nop +71
|
||||
acc +49
|
||||
acc -18
|
||||
jmp +527
|
||||
jmp +130
|
||||
jmp +253
|
||||
acc +11
|
||||
acc -11
|
||||
jmp +390
|
||||
jmp +597
|
||||
jmp +1
|
||||
acc +6
|
||||
acc +0
|
||||
jmp +588
|
||||
acc -17
|
||||
jmp +277
|
||||
acc +2
|
||||
nop +163
|
||||
jmp +558
|
||||
acc +38
|
||||
jmp +369
|
||||
acc +13
|
||||
jmp +536
|
||||
acc +38
|
||||
acc +39
|
||||
acc +6
|
||||
jmp +84
|
||||
acc +11
|
||||
nop +517
|
||||
acc +48
|
||||
acc +47
|
||||
jmp +1
|
||||
acc +42
|
||||
acc +0
|
||||
acc +2
|
||||
acc +24
|
||||
jmp +335
|
||||
acc +44
|
||||
acc +47
|
||||
jmp +446
|
||||
nop +42
|
||||
nop +74
|
||||
acc +45
|
||||
jmp +548
|
||||
jmp +66
|
||||
acc +1
|
||||
jmp +212
|
||||
acc +18
|
||||
jmp +1
|
||||
acc +4
|
||||
acc -16
|
||||
jmp +366
|
||||
acc +0
|
||||
jmp +398
|
||||
acc +45
|
||||
jmp +93
|
||||
acc +40
|
||||
acc +38
|
||||
acc +21
|
||||
nop +184
|
||||
jmp -46
|
||||
nop -9
|
||||
jmp +53
|
||||
acc +46
|
||||
acc +36
|
||||
jmp +368
|
||||
acc +16
|
||||
acc +8
|
||||
acc -9
|
||||
acc -4
|
||||
jmp +328
|
||||
acc -15
|
||||
acc -5
|
||||
acc +21
|
||||
jmp +435
|
||||
acc -5
|
||||
acc +36
|
||||
jmp +362
|
||||
acc +26
|
||||
jmp +447
|
||||
jmp +1
|
||||
jmp +412
|
||||
acc +11
|
||||
acc +41
|
||||
nop -32
|
||||
acc +17
|
||||
jmp -63
|
||||
jmp +1
|
||||
nop +393
|
||||
jmp +62
|
||||
acc +18
|
||||
acc +30
|
||||
nop +417
|
||||
jmp +74
|
||||
acc +29
|
||||
acc +23
|
||||
jmp +455
|
||||
jmp +396
|
||||
jmp +395
|
||||
acc +33
|
||||
nop +137
|
||||
nop +42
|
||||
jmp +57
|
||||
jmp +396
|
||||
acc +7
|
||||
acc +0
|
||||
jmp +354
|
||||
acc +15
|
||||
acc +50
|
||||
jmp -12
|
||||
jmp +84
|
||||
nop +175
|
||||
acc +5
|
||||
acc -2
|
||||
jmp -82
|
||||
acc +1
|
||||
acc +26
|
||||
jmp +288
|
||||
nop -113
|
||||
nop +366
|
||||
acc +45
|
||||
jmp +388
|
||||
acc +21
|
||||
acc +38
|
||||
jmp +427
|
||||
acc +33
|
||||
jmp -94
|
||||
nop -118
|
||||
nop +411
|
||||
jmp +472
|
||||
nop +231
|
||||
nop +470
|
||||
acc +48
|
||||
jmp -124
|
||||
jmp +1
|
||||
acc +5
|
||||
acc +37
|
||||
acc +42
|
||||
jmp +301
|
||||
acc -11
|
||||
acc -17
|
||||
acc +14
|
||||
jmp +357
|
||||
acc +6
|
||||
acc +20
|
||||
acc +13
|
||||
jmp +361
|
||||
jmp -65
|
||||
acc +29
|
||||
jmp +26
|
||||
jmp +329
|
||||
acc +32
|
||||
acc +32
|
||||
acc +17
|
||||
jmp -102
|
||||
acc -6
|
||||
acc +33
|
||||
acc +9
|
||||
jmp +189
|
||||
acc +3
|
||||
jmp -128
|
||||
jmp -142
|
||||
acc +24
|
||||
acc -5
|
||||
jmp +403
|
||||
acc +28
|
||||
jmp +310
|
||||
acc +34
|
||||
acc +4
|
||||
acc +33
|
||||
acc +18
|
||||
jmp +227
|
||||
acc -8
|
||||
acc -15
|
||||
jmp +112
|
||||
jmp +54
|
||||
acc +21
|
||||
acc +23
|
||||
acc +20
|
||||
jmp +320
|
||||
acc +13
|
||||
jmp -77
|
||||
acc +15
|
||||
nop +310
|
||||
nop +335
|
||||
jmp +232
|
||||
acc -3
|
||||
nop +50
|
||||
acc +41
|
||||
jmp +112
|
||||
nop -10
|
||||
acc +29
|
||||
acc +27
|
||||
jmp +52
|
||||
acc +40
|
||||
nop -132
|
||||
acc -16
|
||||
acc +27
|
||||
jmp +309
|
||||
acc -8
|
||||
nop +147
|
||||
acc +20
|
||||
acc +46
|
||||
jmp +202
|
||||
acc +27
|
||||
jmp -43
|
||||
jmp +1
|
||||
acc +33
|
||||
acc -13
|
||||
jmp +300
|
||||
acc +1
|
||||
jmp -202
|
||||
acc -17
|
||||
acc +0
|
||||
acc +34
|
||||
jmp -5
|
||||
nop +335
|
||||
acc -16
|
||||
acc -17
|
||||
jmp -120
|
||||
acc -19
|
||||
acc -13
|
||||
acc +4
|
||||
jmp +368
|
||||
jmp +21
|
||||
acc +39
|
||||
acc +39
|
||||
acc -18
|
||||
jmp -157
|
||||
nop +280
|
||||
acc +33
|
||||
nop -37
|
||||
jmp +32
|
||||
acc -16
|
||||
acc +18
|
||||
acc +46
|
||||
jmp -121
|
||||
acc -19
|
||||
jmp +195
|
||||
acc +28
|
||||
jmp +124
|
||||
jmp +331
|
||||
jmp -228
|
||||
jmp -146
|
||||
jmp +85
|
||||
jmp +60
|
||||
acc +20
|
||||
acc -9
|
||||
jmp +303
|
||||
jmp -122
|
||||
jmp +111
|
||||
acc +32
|
||||
acc +0
|
||||
acc +39
|
||||
acc +29
|
||||
jmp -31
|
||||
nop +320
|
||||
jmp -63
|
||||
jmp +223
|
||||
nop -149
|
||||
acc -12
|
||||
acc -11
|
||||
acc +32
|
||||
jmp +309
|
||||
jmp -13
|
||||
acc -19
|
||||
jmp -123
|
||||
acc +21
|
||||
acc +18
|
||||
acc +49
|
||||
jmp +175
|
||||
acc -14
|
||||
nop -129
|
||||
acc -2
|
||||
acc +31
|
||||
jmp +79
|
||||
acc +23
|
||||
acc +50
|
||||
acc +39
|
||||
acc +7
|
||||
jmp -235
|
||||
jmp -166
|
||||
acc +9
|
||||
jmp +293
|
||||
acc -11
|
||||
jmp +76
|
||||
acc +44
|
||||
acc +3
|
||||
acc +37
|
||||
jmp +123
|
||||
nop -104
|
||||
jmp -157
|
||||
acc +14
|
||||
acc +10
|
||||
acc +28
|
||||
jmp +25
|
||||
acc +37
|
||||
jmp +188
|
||||
jmp -49
|
||||
acc -11
|
||||
jmp -90
|
||||
acc -8
|
||||
jmp +197
|
||||
acc +5
|
||||
jmp +115
|
||||
acc +44
|
||||
jmp -228
|
||||
nop -2
|
||||
acc +46
|
||||
jmp +130
|
||||
nop +183
|
||||
nop +106
|
||||
acc +27
|
||||
acc +37
|
||||
jmp -309
|
||||
acc +28
|
||||
acc -4
|
||||
acc -12
|
||||
acc +38
|
||||
jmp +93
|
||||
acc +8
|
||||
acc +23
|
||||
acc -9
|
||||
acc +6
|
||||
jmp -42
|
||||
acc +10
|
||||
acc +35
|
||||
acc +4
|
||||
jmp -231
|
||||
acc +19
|
||||
acc +7
|
||||
acc +23
|
||||
acc +11
|
||||
jmp -90
|
||||
acc +0
|
||||
nop +158
|
||||
nop -150
|
||||
acc +33
|
||||
jmp +107
|
||||
acc +48
|
||||
acc -2
|
||||
jmp -104
|
||||
acc +6
|
||||
nop -57
|
||||
nop +172
|
||||
acc -11
|
||||
jmp -7
|
||||
acc +6
|
||||
acc +50
|
||||
acc -9
|
||||
acc +12
|
||||
jmp -171
|
||||
acc +3
|
||||
jmp +26
|
||||
acc +42
|
||||
acc +31
|
||||
acc +20
|
||||
acc +32
|
||||
jmp -48
|
||||
acc +13
|
||||
jmp -6
|
||||
jmp +178
|
||||
acc +47
|
||||
jmp -153
|
||||
acc +28
|
||||
nop +74
|
||||
jmp -162
|
||||
acc -15
|
||||
nop -104
|
||||
acc -9
|
||||
jmp -227
|
||||
acc +49
|
||||
acc -19
|
||||
acc +41
|
||||
jmp -318
|
||||
acc +9
|
||||
acc +12
|
||||
acc +7
|
||||
jmp +34
|
||||
jmp +137
|
||||
nop -143
|
||||
acc -8
|
||||
acc +5
|
||||
acc +31
|
||||
jmp -20
|
||||
jmp -237
|
||||
acc +39
|
||||
acc +0
|
||||
jmp -298
|
||||
acc +45
|
||||
acc -19
|
||||
acc +11
|
||||
jmp -151
|
||||
acc +40
|
||||
acc +27
|
||||
nop +150
|
||||
nop -391
|
||||
jmp -341
|
||||
acc +1
|
||||
acc +11
|
||||
acc +18
|
||||
nop -234
|
||||
jmp +77
|
||||
nop +104
|
||||
jmp -65
|
||||
acc +32
|
||||
jmp -27
|
||||
nop -317
|
||||
nop +159
|
||||
acc +14
|
||||
acc -10
|
||||
jmp -348
|
||||
acc +29
|
||||
jmp +32
|
||||
acc +48
|
||||
acc -19
|
||||
jmp +17
|
||||
jmp -201
|
||||
jmp -224
|
||||
nop +26
|
||||
acc -7
|
||||
acc +23
|
||||
acc +46
|
||||
jmp -6
|
||||
acc +22
|
||||
acc +39
|
||||
acc +9
|
||||
acc +23
|
||||
jmp -30
|
||||
jmp -243
|
||||
acc +47
|
||||
acc -15
|
||||
jmp -298
|
||||
jmp -393
|
||||
jmp +1
|
||||
acc +3
|
||||
nop -24
|
||||
acc +7
|
||||
jmp -59
|
||||
acc -6
|
||||
acc +26
|
||||
jmp -102
|
||||
acc +34
|
||||
acc +24
|
||||
jmp -207
|
||||
acc +36
|
||||
acc +40
|
||||
acc +41
|
||||
jmp +1
|
||||
jmp -306
|
||||
jmp +57
|
||||
jmp +1
|
||||
nop +99
|
||||
acc +28
|
||||
jmp -391
|
||||
acc +50
|
||||
jmp -359
|
||||
acc -5
|
||||
jmp +9
|
||||
jmp -355
|
||||
acc +5
|
||||
acc +2
|
||||
jmp -77
|
||||
acc +40
|
||||
acc +28
|
||||
acc +22
|
||||
jmp -262
|
||||
nop -287
|
||||
acc +34
|
||||
acc -4
|
||||
nop +112
|
||||
jmp -195
|
||||
acc +29
|
||||
nop -94
|
||||
nop -418
|
||||
jmp +24
|
||||
jmp -190
|
||||
acc +2
|
||||
jmp -311
|
||||
jmp -178
|
||||
jmp -276
|
||||
acc -12
|
||||
acc -18
|
||||
jmp +62
|
||||
jmp -174
|
||||
nop +31
|
||||
acc +33
|
||||
nop -158
|
||||
jmp -417
|
||||
acc +3
|
||||
acc +21
|
||||
acc +47
|
||||
jmp +87
|
||||
acc +45
|
||||
jmp -77
|
||||
acc +6
|
||||
acc -10
|
||||
jmp +1
|
||||
jmp -240
|
||||
acc +7
|
||||
acc +47
|
||||
jmp -379
|
||||
acc -14
|
||||
acc +50
|
||||
nop -75
|
||||
acc +30
|
||||
jmp +70
|
||||
jmp -392
|
||||
jmp -430
|
||||
acc +22
|
||||
acc -2
|
||||
jmp -492
|
||||
jmp +1
|
||||
acc -6
|
||||
acc +38
|
||||
jmp -36
|
||||
nop -336
|
||||
jmp -32
|
||||
jmp +61
|
||||
acc +20
|
||||
acc -9
|
||||
acc +2
|
||||
jmp -175
|
||||
acc +21
|
||||
acc -2
|
||||
jmp -6
|
||||
jmp -527
|
||||
acc +11
|
||||
acc +16
|
||||
jmp -262
|
||||
jmp +1
|
||||
nop -327
|
||||
acc +29
|
||||
jmp -114
|
||||
acc +11
|
||||
acc +17
|
||||
acc +26
|
||||
nop -104
|
||||
jmp -428
|
||||
nop -178
|
||||
nop -242
|
||||
acc +29
|
||||
acc +5
|
||||
jmp -245
|
||||
jmp -417
|
||||
jmp -278
|
||||
acc +35
|
||||
acc +21
|
||||
jmp +1
|
||||
nop -263
|
||||
jmp +8
|
||||
acc +42
|
||||
jmp -95
|
||||
nop -312
|
||||
acc -11
|
||||
acc +34
|
||||
acc +0
|
||||
jmp +19
|
||||
acc +8
|
||||
acc -13
|
||||
acc +32
|
||||
acc +21
|
||||
jmp -208
|
||||
acc +15
|
||||
acc +39
|
||||
nop -194
|
||||
jmp -280
|
||||
jmp +24
|
||||
nop -516
|
||||
acc +21
|
||||
acc +48
|
||||
jmp -367
|
||||
jmp -121
|
||||
acc +49
|
||||
acc -16
|
||||
jmp -136
|
||||
acc +0
|
||||
jmp -148
|
||||
jmp -85
|
||||
jmp -103
|
||||
nop -446
|
||||
jmp -242
|
||||
acc -12
|
||||
acc +13
|
||||
acc +31
|
||||
acc -1
|
||||
jmp -435
|
||||
nop -420
|
||||
acc +22
|
||||
acc -5
|
||||
jmp -567
|
||||
nop -354
|
||||
acc +11
|
||||
acc +33
|
||||
acc +45
|
||||
jmp -76
|
||||
acc -2
|
||||
acc +0
|
||||
acc +25
|
||||
acc +46
|
||||
jmp -555
|
||||
acc +0
|
||||
acc +11
|
||||
nop -2
|
||||
jmp -394
|
||||
jmp -395
|
||||
acc +8
|
||||
acc +14
|
||||
acc +47
|
||||
acc +22
|
||||
jmp +1
|
Loading…
Reference in New Issue