From eafb73cfc186d3984b23da7e9b01b365cf2543ee Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Mon, 7 Dec 2020 21:11:05 -0800 Subject: [PATCH] Add day 8 solution. --- day8.cr | 84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 day8.cr diff --git a/day8.cr b/day8.cr new file mode 100644 index 0000000..f7891f0 --- /dev/null +++ b/day8.cr @@ -0,0 +1,84 @@ +require "advent" +INPUT = input(2020, 8).lines + +def part1 + acc = 0 + pc = 0 + visited = Set(Int32).new + input = INPUT.clone.map do |s| + code, int = s.split(" ") + {code, int.to_i32} + end + + loop do + if visited.includes? pc + break + end + visited << pc + code, int = input[pc] + case input[pc][0] + when "acc" + acc += int + pc += 1 + when "jmp" + pc += int + when "nop" + pc += 1 + end + end +end + +def run(prog) + acc = 0 + pc = 0 + visited = Set(Int32).new + loop do + if visited.includes? pc + return false + end + return acc if pc >= prog.size + visited << pc + code, int = prog[pc] + case prog[pc][0] + when "acc" + acc += int + pc += 1 + when "jmp" + pc += int + when "nop" + pc += 1 + end + end +end + +def part2 + input = INPUT.clone.map do |s| + code, int = s.split(" ") + {code, int.to_i32} + end + + jnp = [] of Int32 + input.each_with_index do |e, i| + op, int = e + jnp << i if op == "jmp" || op == "nop" + end + + jnp.each do |i| + prog = input.clone + if prog[i][0] == "jmp" + prog[i] = {"nop", prog[i][1]} + else + prog[i] = {"jmp", prog[i][1]} + end + + case i = run(prog) + when Bool + next + when Int32 + return i + end + end +end + +puts part1 +puts part2