Skip to content

Instantly share code, notes, and snippets.

@carlwiedemann
Created December 18, 2024 18:49
Show Gist options
  • Save carlwiedemann/58fdf28ddd1d3fb43c334dcd9cfc324b to your computer and use it in GitHub Desktop.
Save carlwiedemann/58fdf28ddd1d3fb43c334dcd9cfc324b to your computer and use it in GitHub Desktop.
Advent of Code 2024 day017.rb
require_relative "main"
module Day017
INPUT = File.read("INPUT.txt")
##########
# Part 1 #
##########
parts = INPUT.split("\n\n")
register = parts.first.split("\n").map { _1[/\d+/].to_i }
steps = parts.last.scan(/\d+/).map(&:to_i)
A = 0
B = 1
C = 2
COMBOS = [
-> { 0 },
-> { 1 },
-> { 2 },
-> { 3 },
-> { register[A] },
-> { register[B] },
-> { register[C] }
]
SKIP = -1
pointer = 0
INSTRUCTIONS = [
->(o) { register[A] = register[A] / 2**COMBOS[o].call }, # adv
->(o) { register[B] = register[B] ^ o }, # bxl
->(o) { register[B] = COMBOS[o].call % 8 }, # bst
->(o) { register[A].zero? ? SKIP : o }, # jnz
->(_o) { register[B] = register[B] ^ register[C] }, # bxc
->(o) { COMBOS[o].call % 8 }, # out
->(o) { register[B] = register[A] / 2**COMBOS[o].call }, # bdv
->(o) { register[C] = register[A] / 2**COMBOS[o].call } # cdv
]
out = []
while pointer < steps.count
c = steps[pointer]
o = steps[pointer + 1]
res = INSTRUCTIONS[c].call(o)
if c == 5
out.push(res)
end
if c == 3 && res != SKIP
pointer = res
else
pointer += 2
end
end
answer1 = out.join(",")
pp answer1
##########
# Part 2 #
##########
# 2,4 bst B = A % 8
# 1,1 bxl B = B ^ 1 -- XOR with 1 will subtract 1 if it is odd, add 1 if even
# 7,5 cdv C = A / 2^B
# 4,7 bxc B = B ^ C
# 1,4 bxl B = B ^ 4
# 0,3 adv A = A / 8
# 5,5 out
# 3,0 jnz
# B = A % 8
# B = B ^ 1
# C = A / 2**B
# B = B ^ C
# B = B ^ 4
# print B
# A = A / 8
run = ->(a, last = "") do
b = (((a % 8) ^ 1 ^ (a / (2**(a % 8 ^ 1))) ^ 4) % 8)
a /= 8
var = last + b.to_s
if !a.zero?
run.call(a, var)
else
var
end
end
# This was just a lot of guessing & checking...it's hard to explain what I was
# doing, mostly exploring things in octal. I didn't come up with an algorithm that I can easily describe :(
# ANSWER
# Octal 05600647654025052
# Decimal 202367025818154
answer2 = 202367025818154
pp answer2
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment