Day 8
This commit is contained in:
parent
eabdb11a25
commit
5b7a124ecb
|
@ -0,0 +1,82 @@
|
||||||
|
defmodule Day8 do
|
||||||
|
@example """
|
||||||
|
nop +0
|
||||||
|
acc +1
|
||||||
|
jmp +4
|
||||||
|
acc +3
|
||||||
|
jmp -3
|
||||||
|
acc -99
|
||||||
|
acc +1
|
||||||
|
jmp -4
|
||||||
|
acc +6
|
||||||
|
"""
|
||||||
|
|
||||||
|
def part1(example \\ false) do
|
||||||
|
if(example, do: @example, else: File.read!("lib/day8/input.txt"))
|
||||||
|
|> parse_prog()
|
||||||
|
|> run_stopping_after_repetition()
|
||||||
|
end
|
||||||
|
|
||||||
|
def part2(example \\ false) do
|
||||||
|
prog =
|
||||||
|
if(example, do: @example, else: File.read!("lib/day8/input.txt"))
|
||||||
|
|> parse_prog()
|
||||||
|
|
||||||
|
prog
|
||||||
|
|> Enum.with_index()
|
||||||
|
|> Enum.filter(fn
|
||||||
|
{{"acc", _}, _} -> false
|
||||||
|
_ -> true
|
||||||
|
end)
|
||||||
|
|> Enum.find_value(fn {{insn, val}, index} ->
|
||||||
|
new_insn = if insn == "nop", do: "jmp", else: "nop"
|
||||||
|
modified_prog = List.replace_at(prog, index, {new_insn, val})
|
||||||
|
|
||||||
|
case run_stopping_after_repetition(modified_prog) do
|
||||||
|
{:loop, _} -> false
|
||||||
|
{:halt, acc} -> acc
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_prog(str) do
|
||||||
|
str
|
||||||
|
|> String.trim()
|
||||||
|
|> String.split("\n")
|
||||||
|
|> Enum.map(&parse_insn/1)
|
||||||
|
end
|
||||||
|
|
||||||
|
def parse_insn(str) do
|
||||||
|
[_, insn, num] = Regex.run(~r/^(\w+) ([+-]\d+)$/, str)
|
||||||
|
num = String.to_integer(num)
|
||||||
|
{insn, num}
|
||||||
|
end
|
||||||
|
|
||||||
|
def run_stopping_after_repetition(prog, {acc, ip, visited_insns} \\ {0, 0, MapSet.new()}) do
|
||||||
|
cond do
|
||||||
|
MapSet.member?(visited_insns, ip) ->
|
||||||
|
{:loop, acc}
|
||||||
|
|
||||||
|
ip >= length(prog) ->
|
||||||
|
{:halt, acc}
|
||||||
|
|
||||||
|
true ->
|
||||||
|
insn = Enum.at(prog, ip)
|
||||||
|
old_ip = ip
|
||||||
|
{acc, ip} = run_insn(insn, acc, ip)
|
||||||
|
run_stopping_after_repetition(prog, {acc, ip, MapSet.put(visited_insns, old_ip)})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def run_insn({"nop", _}, acc, ip) do
|
||||||
|
{acc, ip + 1}
|
||||||
|
end
|
||||||
|
|
||||||
|
def run_insn({"acc", val}, acc, ip) do
|
||||||
|
{acc + val, ip + 1}
|
||||||
|
end
|
||||||
|
|
||||||
|
def run_insn({"jmp", val}, acc, ip) do
|
||||||
|
{acc, ip + val}
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,631 @@
|
||||||
|
nop +355
|
||||||
|
acc +46
|
||||||
|
jmp +42
|
||||||
|
jmp +585
|
||||||
|
acc +11
|
||||||
|
acc +0
|
||||||
|
acc +40
|
||||||
|
jmp +284
|
||||||
|
acc -2
|
||||||
|
nop +276
|
||||||
|
jmp +613
|
||||||
|
acc +23
|
||||||
|
acc +2
|
||||||
|
acc +14
|
||||||
|
acc +25
|
||||||
|
jmp +310
|
||||||
|
acc +43
|
||||||
|
acc +43
|
||||||
|
jmp +510
|
||||||
|
jmp +116
|
||||||
|
jmp +204
|
||||||
|
nop +213
|
||||||
|
acc +47
|
||||||
|
jmp +1
|
||||||
|
acc +8
|
||||||
|
jmp +461
|
||||||
|
jmp -22
|
||||||
|
acc +36
|
||||||
|
acc +33
|
||||||
|
acc +45
|
||||||
|
jmp +175
|
||||||
|
acc +21
|
||||||
|
jmp +472
|
||||||
|
acc +50
|
||||||
|
acc +40
|
||||||
|
jmp +525
|
||||||
|
acc +26
|
||||||
|
nop +208
|
||||||
|
jmp +496
|
||||||
|
jmp +153
|
||||||
|
acc +50
|
||||||
|
acc +24
|
||||||
|
nop +512
|
||||||
|
jmp +242
|
||||||
|
acc +7
|
||||||
|
nop +317
|
||||||
|
acc +50
|
||||||
|
acc +7
|
||||||
|
jmp +268
|
||||||
|
acc +8
|
||||||
|
acc -19
|
||||||
|
acc -11
|
||||||
|
jmp +1
|
||||||
|
jmp +383
|
||||||
|
acc +1
|
||||||
|
jmp +230
|
||||||
|
acc +5
|
||||||
|
jmp +128
|
||||||
|
nop +227
|
||||||
|
acc -7
|
||||||
|
jmp -16
|
||||||
|
acc +11
|
||||||
|
acc -6
|
||||||
|
jmp -42
|
||||||
|
acc +11
|
||||||
|
acc +23
|
||||||
|
jmp +7
|
||||||
|
jmp -23
|
||||||
|
jmp +11
|
||||||
|
acc +0
|
||||||
|
nop +246
|
||||||
|
acc +24
|
||||||
|
jmp +213
|
||||||
|
jmp +550
|
||||||
|
acc +24
|
||||||
|
acc +14
|
||||||
|
acc +34
|
||||||
|
acc -6
|
||||||
|
jmp +525
|
||||||
|
acc +4
|
||||||
|
nop +220
|
||||||
|
jmp +399
|
||||||
|
acc +41
|
||||||
|
jmp +34
|
||||||
|
acc -2
|
||||||
|
acc +38
|
||||||
|
acc +48
|
||||||
|
acc -7
|
||||||
|
jmp +136
|
||||||
|
acc -2
|
||||||
|
acc +40
|
||||||
|
acc +12
|
||||||
|
acc -4
|
||||||
|
jmp +467
|
||||||
|
acc +36
|
||||||
|
acc +19
|
||||||
|
nop +518
|
||||||
|
jmp +328
|
||||||
|
acc +7
|
||||||
|
nop +263
|
||||||
|
acc +19
|
||||||
|
acc -17
|
||||||
|
jmp +282
|
||||||
|
jmp +206
|
||||||
|
acc +28
|
||||||
|
acc +7
|
||||||
|
jmp +417
|
||||||
|
acc -10
|
||||||
|
jmp -75
|
||||||
|
nop +475
|
||||||
|
nop +68
|
||||||
|
nop -38
|
||||||
|
acc +33
|
||||||
|
jmp +367
|
||||||
|
acc +0
|
||||||
|
jmp +459
|
||||||
|
jmp +1
|
||||||
|
acc +50
|
||||||
|
jmp +1
|
||||||
|
nop -25
|
||||||
|
jmp +464
|
||||||
|
acc +35
|
||||||
|
jmp -5
|
||||||
|
acc -14
|
||||||
|
jmp -113
|
||||||
|
nop +25
|
||||||
|
acc +33
|
||||||
|
acc +28
|
||||||
|
acc +3
|
||||||
|
jmp -71
|
||||||
|
nop +75
|
||||||
|
acc +19
|
||||||
|
acc +27
|
||||||
|
jmp +332
|
||||||
|
jmp +361
|
||||||
|
acc -2
|
||||||
|
acc +45
|
||||||
|
acc +47
|
||||||
|
jmp +461
|
||||||
|
jmp -120
|
||||||
|
acc +18
|
||||||
|
acc +25
|
||||||
|
acc +11
|
||||||
|
jmp +24
|
||||||
|
jmp +372
|
||||||
|
acc +32
|
||||||
|
acc +2
|
||||||
|
jmp +87
|
||||||
|
acc +23
|
||||||
|
jmp +96
|
||||||
|
acc +32
|
||||||
|
nop +233
|
||||||
|
acc -7
|
||||||
|
jmp +435
|
||||||
|
jmp +51
|
||||||
|
acc -7
|
||||||
|
jmp +392
|
||||||
|
acc +22
|
||||||
|
acc -17
|
||||||
|
acc +8
|
||||||
|
acc +34
|
||||||
|
jmp -140
|
||||||
|
acc +10
|
||||||
|
nop +276
|
||||||
|
jmp -57
|
||||||
|
acc -6
|
||||||
|
jmp +388
|
||||||
|
acc +4
|
||||||
|
jmp +386
|
||||||
|
jmp +267
|
||||||
|
jmp +1
|
||||||
|
acc +15
|
||||||
|
acc -11
|
||||||
|
nop -169
|
||||||
|
jmp +71
|
||||||
|
acc +10
|
||||||
|
acc +19
|
||||||
|
jmp +377
|
||||||
|
acc -1
|
||||||
|
jmp +316
|
||||||
|
acc +13
|
||||||
|
acc -5
|
||||||
|
acc +7
|
||||||
|
acc +28
|
||||||
|
jmp -49
|
||||||
|
acc +20
|
||||||
|
acc +4
|
||||||
|
acc -19
|
||||||
|
jmp +196
|
||||||
|
acc -1
|
||||||
|
acc -8
|
||||||
|
jmp +266
|
||||||
|
acc +43
|
||||||
|
acc +10
|
||||||
|
nop +122
|
||||||
|
jmp +222
|
||||||
|
acc +0
|
||||||
|
jmp +275
|
||||||
|
nop +282
|
||||||
|
jmp +199
|
||||||
|
acc +24
|
||||||
|
acc +37
|
||||||
|
acc -18
|
||||||
|
nop -33
|
||||||
|
jmp -110
|
||||||
|
acc -7
|
||||||
|
acc -9
|
||||||
|
acc +18
|
||||||
|
jmp -189
|
||||||
|
acc -10
|
||||||
|
acc +46
|
||||||
|
jmp +214
|
||||||
|
acc +22
|
||||||
|
acc +45
|
||||||
|
jmp +48
|
||||||
|
nop +217
|
||||||
|
acc -6
|
||||||
|
acc +5
|
||||||
|
jmp -40
|
||||||
|
jmp +220
|
||||||
|
acc +26
|
||||||
|
nop +393
|
||||||
|
jmp +1
|
||||||
|
jmp +358
|
||||||
|
jmp +138
|
||||||
|
nop -181
|
||||||
|
acc +48
|
||||||
|
jmp +190
|
||||||
|
acc +49
|
||||||
|
jmp +105
|
||||||
|
jmp -176
|
||||||
|
jmp +37
|
||||||
|
acc +49
|
||||||
|
jmp -130
|
||||||
|
acc +20
|
||||||
|
acc +48
|
||||||
|
jmp +236
|
||||||
|
acc +41
|
||||||
|
acc +19
|
||||||
|
nop +321
|
||||||
|
jmp -12
|
||||||
|
acc +3
|
||||||
|
acc +38
|
||||||
|
jmp +338
|
||||||
|
jmp -160
|
||||||
|
nop +250
|
||||||
|
acc +21
|
||||||
|
jmp +29
|
||||||
|
acc +44
|
||||||
|
acc +11
|
||||||
|
acc -17
|
||||||
|
acc +7
|
||||||
|
jmp +110
|
||||||
|
nop +242
|
||||||
|
acc +48
|
||||||
|
acc +46
|
||||||
|
jmp -15
|
||||||
|
acc -18
|
||||||
|
nop -190
|
||||||
|
acc +39
|
||||||
|
acc -12
|
||||||
|
jmp +255
|
||||||
|
acc -16
|
||||||
|
acc -13
|
||||||
|
acc +12
|
||||||
|
acc +29
|
||||||
|
jmp +243
|
||||||
|
jmp -14
|
||||||
|
acc +33
|
||||||
|
nop +40
|
||||||
|
acc -11
|
||||||
|
jmp +252
|
||||||
|
nop +248
|
||||||
|
acc -17
|
||||||
|
acc +14
|
||||||
|
jmp +29
|
||||||
|
acc -6
|
||||||
|
acc +21
|
||||||
|
acc +27
|
||||||
|
nop +287
|
||||||
|
jmp +329
|
||||||
|
acc -3
|
||||||
|
acc +7
|
||||||
|
acc +0
|
||||||
|
jmp +297
|
||||||
|
acc +9
|
||||||
|
jmp -10
|
||||||
|
acc +11
|
||||||
|
nop +293
|
||||||
|
acc -14
|
||||||
|
jmp +214
|
||||||
|
acc -11
|
||||||
|
acc +43
|
||||||
|
acc +43
|
||||||
|
acc +35
|
||||||
|
jmp +239
|
||||||
|
acc +10
|
||||||
|
acc -18
|
||||||
|
acc +39
|
||||||
|
jmp -129
|
||||||
|
acc +8
|
||||||
|
jmp +313
|
||||||
|
acc +49
|
||||||
|
jmp +300
|
||||||
|
nop +219
|
||||||
|
nop +215
|
||||||
|
jmp -203
|
||||||
|
acc -8
|
||||||
|
jmp +137
|
||||||
|
nop +211
|
||||||
|
acc -19
|
||||||
|
acc -18
|
||||||
|
nop -8
|
||||||
|
jmp +132
|
||||||
|
acc -17
|
||||||
|
jmp -84
|
||||||
|
acc +8
|
||||||
|
acc +2
|
||||||
|
acc -1
|
||||||
|
jmp -91
|
||||||
|
acc -4
|
||||||
|
acc +37
|
||||||
|
jmp +1
|
||||||
|
acc +14
|
||||||
|
jmp -297
|
||||||
|
acc -10
|
||||||
|
nop -186
|
||||||
|
acc -18
|
||||||
|
jmp -150
|
||||||
|
acc +46
|
||||||
|
acc +25
|
||||||
|
acc +45
|
||||||
|
acc -5
|
||||||
|
jmp +187
|
||||||
|
acc +21
|
||||||
|
jmp +101
|
||||||
|
acc +15
|
||||||
|
acc -15
|
||||||
|
jmp +30
|
||||||
|
acc +42
|
||||||
|
acc +35
|
||||||
|
jmp +276
|
||||||
|
jmp -323
|
||||||
|
jmp -124
|
||||||
|
acc +34
|
||||||
|
acc -16
|
||||||
|
acc -19
|
||||||
|
jmp -314
|
||||||
|
acc +45
|
||||||
|
jmp -219
|
||||||
|
acc +6
|
||||||
|
acc -12
|
||||||
|
acc +45
|
||||||
|
acc +38
|
||||||
|
jmp +30
|
||||||
|
acc +32
|
||||||
|
acc +47
|
||||||
|
acc +40
|
||||||
|
acc +11
|
||||||
|
jmp -236
|
||||||
|
acc +46
|
||||||
|
jmp -328
|
||||||
|
acc -18
|
||||||
|
acc +34
|
||||||
|
acc -11
|
||||||
|
jmp +201
|
||||||
|
acc +8
|
||||||
|
jmp +161
|
||||||
|
nop +44
|
||||||
|
acc +8
|
||||||
|
jmp +158
|
||||||
|
acc +26
|
||||||
|
jmp +137
|
||||||
|
acc +2
|
||||||
|
acc -4
|
||||||
|
nop -59
|
||||||
|
jmp +14
|
||||||
|
acc +18
|
||||||
|
jmp -211
|
||||||
|
acc +28
|
||||||
|
jmp -152
|
||||||
|
acc -3
|
||||||
|
acc +0
|
||||||
|
jmp -21
|
||||||
|
acc -2
|
||||||
|
jmp -331
|
||||||
|
acc +1
|
||||||
|
acc +24
|
||||||
|
nop -274
|
||||||
|
jmp -350
|
||||||
|
jmp +1
|
||||||
|
acc +28
|
||||||
|
acc -14
|
||||||
|
acc +49
|
||||||
|
jmp -39
|
||||||
|
nop +114
|
||||||
|
acc +33
|
||||||
|
jmp +217
|
||||||
|
acc +0
|
||||||
|
acc +25
|
||||||
|
jmp +1
|
||||||
|
acc +33
|
||||||
|
jmp +50
|
||||||
|
acc +23
|
||||||
|
acc +0
|
||||||
|
acc -14
|
||||||
|
jmp +66
|
||||||
|
jmp -68
|
||||||
|
jmp +1
|
||||||
|
acc +0
|
||||||
|
acc +10
|
||||||
|
jmp -244
|
||||||
|
jmp -200
|
||||||
|
jmp +1
|
||||||
|
acc -2
|
||||||
|
acc +34
|
||||||
|
jmp -48
|
||||||
|
nop +192
|
||||||
|
acc +34
|
||||||
|
acc -1
|
||||||
|
acc +6
|
||||||
|
jmp -48
|
||||||
|
acc +4
|
||||||
|
acc +13
|
||||||
|
jmp -405
|
||||||
|
acc +36
|
||||||
|
nop -372
|
||||||
|
acc +20
|
||||||
|
acc +32
|
||||||
|
jmp -231
|
||||||
|
acc +14
|
||||||
|
jmp -83
|
||||||
|
acc +22
|
||||||
|
jmp -375
|
||||||
|
acc +21
|
||||||
|
jmp -356
|
||||||
|
acc -1
|
||||||
|
jmp -398
|
||||||
|
jmp -104
|
||||||
|
acc +48
|
||||||
|
nop -382
|
||||||
|
jmp -296
|
||||||
|
acc -15
|
||||||
|
acc +29
|
||||||
|
jmp +159
|
||||||
|
acc +41
|
||||||
|
jmp -215
|
||||||
|
acc -6
|
||||||
|
acc -1
|
||||||
|
acc +44
|
||||||
|
acc -14
|
||||||
|
jmp +72
|
||||||
|
acc +2
|
||||||
|
acc +6
|
||||||
|
jmp -106
|
||||||
|
acc +39
|
||||||
|
jmp -301
|
||||||
|
acc -12
|
||||||
|
acc +43
|
||||||
|
acc +24
|
||||||
|
jmp -53
|
||||||
|
nop +19
|
||||||
|
acc +17
|
||||||
|
acc -12
|
||||||
|
jmp -211
|
||||||
|
jmp +1
|
||||||
|
jmp -98
|
||||||
|
acc +18
|
||||||
|
acc -6
|
||||||
|
nop -153
|
||||||
|
nop -376
|
||||||
|
jmp -377
|
||||||
|
nop +109
|
||||||
|
acc -10
|
||||||
|
acc +6
|
||||||
|
acc -13
|
||||||
|
jmp -359
|
||||||
|
acc +35
|
||||||
|
nop +125
|
||||||
|
jmp -312
|
||||||
|
jmp -23
|
||||||
|
acc +8
|
||||||
|
acc +27
|
||||||
|
nop +105
|
||||||
|
acc -16
|
||||||
|
jmp -112
|
||||||
|
acc -9
|
||||||
|
acc +13
|
||||||
|
acc +1
|
||||||
|
jmp -421
|
||||||
|
nop -471
|
||||||
|
acc +41
|
||||||
|
acc +10
|
||||||
|
acc +26
|
||||||
|
jmp -110
|
||||||
|
acc -8
|
||||||
|
acc -17
|
||||||
|
acc +32
|
||||||
|
acc -3
|
||||||
|
jmp -329
|
||||||
|
acc +0
|
||||||
|
acc +2
|
||||||
|
acc +2
|
||||||
|
jmp +114
|
||||||
|
acc +44
|
||||||
|
acc +7
|
||||||
|
acc -8
|
||||||
|
jmp +33
|
||||||
|
jmp -310
|
||||||
|
nop -14
|
||||||
|
acc +32
|
||||||
|
acc +21
|
||||||
|
acc +42
|
||||||
|
jmp -509
|
||||||
|
acc +4
|
||||||
|
jmp -29
|
||||||
|
nop +12
|
||||||
|
nop +74
|
||||||
|
jmp -491
|
||||||
|
jmp -307
|
||||||
|
acc +12
|
||||||
|
jmp -217
|
||||||
|
jmp -254
|
||||||
|
nop -3
|
||||||
|
acc +33
|
||||||
|
jmp +101
|
||||||
|
acc +17
|
||||||
|
jmp -4
|
||||||
|
nop -361
|
||||||
|
acc +20
|
||||||
|
acc +0
|
||||||
|
acc +37
|
||||||
|
jmp -120
|
||||||
|
jmp -178
|
||||||
|
jmp -306
|
||||||
|
acc +31
|
||||||
|
acc +16
|
||||||
|
acc +12
|
||||||
|
nop +61
|
||||||
|
jmp -466
|
||||||
|
acc +38
|
||||||
|
acc +40
|
||||||
|
jmp -323
|
||||||
|
acc -1
|
||||||
|
nop -112
|
||||||
|
nop +46
|
||||||
|
nop -221
|
||||||
|
jmp -111
|
||||||
|
jmp -248
|
||||||
|
acc -2
|
||||||
|
nop +53
|
||||||
|
acc -12
|
||||||
|
nop -382
|
||||||
|
jmp -514
|
||||||
|
jmp +1
|
||||||
|
acc +30
|
||||||
|
jmp -177
|
||||||
|
acc -18
|
||||||
|
acc +34
|
||||||
|
jmp -297
|
||||||
|
jmp -446
|
||||||
|
nop -33
|
||||||
|
acc +8
|
||||||
|
acc +19
|
||||||
|
acc +22
|
||||||
|
jmp +16
|
||||||
|
acc -17
|
||||||
|
nop -194
|
||||||
|
jmp -541
|
||||||
|
acc +50
|
||||||
|
acc +15
|
||||||
|
nop -347
|
||||||
|
acc -9
|
||||||
|
jmp -433
|
||||||
|
acc +32
|
||||||
|
nop -571
|
||||||
|
jmp -482
|
||||||
|
acc +42
|
||||||
|
nop -287
|
||||||
|
nop -263
|
||||||
|
jmp -368
|
||||||
|
jmp +10
|
||||||
|
acc +39
|
||||||
|
jmp -204
|
||||||
|
acc +28
|
||||||
|
acc +35
|
||||||
|
jmp -565
|
||||||
|
jmp -464
|
||||||
|
jmp -84
|
||||||
|
acc +25
|
||||||
|
jmp -532
|
||||||
|
acc +42
|
||||||
|
jmp +1
|
||||||
|
jmp -154
|
||||||
|
acc +4
|
||||||
|
acc +8
|
||||||
|
acc +4
|
||||||
|
acc +48
|
||||||
|
jmp -82
|
||||||
|
jmp -256
|
||||||
|
acc +33
|
||||||
|
acc +49
|
||||||
|
jmp +1
|
||||||
|
jmp -539
|
||||||
|
acc -1
|
||||||
|
acc +46
|
||||||
|
acc +49
|
||||||
|
acc +13
|
||||||
|
jmp -20
|
||||||
|
acc -11
|
||||||
|
acc -15
|
||||||
|
acc +1
|
||||||
|
jmp -96
|
||||||
|
jmp -483
|
||||||
|
jmp -444
|
||||||
|
jmp +1
|
||||||
|
jmp -382
|
||||||
|
acc -5
|
||||||
|
acc +5
|
||||||
|
acc +26
|
||||||
|
jmp -458
|
||||||
|
acc +24
|
||||||
|
jmp -515
|
||||||
|
nop -211
|
||||||
|
jmp -64
|
||||||
|
jmp -246
|
||||||
|
acc -17
|
||||||
|
acc -7
|
||||||
|
acc +0
|
||||||
|
acc +21
|
||||||
|
jmp +1
|
Loading…
Reference in New Issue