require_relative 'util'
# --- Day 1: Inverse Captcha ---
#
# The night before Christmas, one of Santa's Elves calls you in a
# panic. "The printer's broken! We can't print the Naughty or Nice
# List!" By the time you make it to sub-basement 17, there are only a
# few minutes until midnight. "We have a big problem," she says;
# "there must be almost fifty bugs in this system, but nothing else
# can print The List. Stand in this square, quick! There's no time to
# explain; if you can convince them to pay you in stars, you'll be
# able to--" She pulls a lever and the world goes blurry.
#
# When your eyes can focus again, everything seems a lot more
# pixelated than before. She must have sent you inside the computer!
# You check the system clock: 25 milliseconds until midnight. With
# that much time, you should be able to collect all fifty stars by
# December 25th.
#
# Collect stars by solving puzzles. Two puzzles will be made available
# on each +day+ millisecond in the advent calendar; the second puzzle
# is unlocked when you complete the first. Each puzzle grants one
# star. Good luck!
#
# You're standing in a room with "digitization quarantine" written in
# LEDs along one wall. The only door is locked, but it includes a
# small interface. "Restricted Area - Strictly No Digitized Users
# Allowed."
#
# It goes on to explain that you may only leave by solving a captcha
# to prove you're not a human. Apparently, you only get one
# millisecond to solve the captcha: too fast for a normal human, but
# it feels like hours to you.
#
# The captcha requires you to review a sequence of digits (your puzzle
# input) and find the sum of all digits that match the next digit in
# the list. The list is circular, so the digit after the last digit is
# the first digit in the list.
#
# For example:
#
# - 1122 produces a sum of 3 (1 + 2) because the first digit (1)
# matches the second digit and the third digit (2) matches the
# fourth digit.
# - 1111 produces 4 because each digit (all 1) matches the next.
# - 1234 produces 0 because no digit matches the next.
# - 91212129 produces 9 because the only digit that matches the next
# one is the last digit, 9.
#
# What is the solution to your captcha?
input = File.open('01.txt') { |f| f.read.chomp }
def check(x, y)
if x == y
x.to_i
else
0
end
end
def easy(string)
sum = 0
explode(string).each_cons(2) { |x, y| sum += check(x, y) }
sum += check(string[-1], string[0])
sum
end
assert(easy('1122') == 3)
assert(easy('1111') == 4)
assert(easy('1234') == 0)
assert(easy('91212129') == 9)
puts "easy(input): #{easy(input)}"
# --- Part Two ---
#
# You notice a progress bar that jumps to 50% completion. Apparently,
# the door isn't yet satisfied, but it did emit a star as
# encouragement. The instructions change:
#
# Now, instead of considering the next digit, it wants you to consider
# the digit halfway around the circular list. That is, if your list
# contains 10 items, only include a digit in your sum if the digit
# 10/2 = 5 steps forward matches it. Fortunately, your list has an
# even number of elements.
#
# For example:
#
# - 1212 produces 6: the list contains 4 items, and all four digits
# match the digit 2 items ahead.
# - 1221 produces 0, because every comparison is between a 1 and a 2.
# - 123425 produces 4, because both 2s match each other, but no other
# digit has a match.
# - 123123 produces 12.
# - 12131415 produces 4.
#
# What is the solution to your new captcha?
def hard(string)
sum = 0
steps = string.length / 2
string.length.times do |i|
j = (i + steps) % string.length
sum += check(string[i], string[j])
end
sum
end
assert(hard('1212') == 6)
assert(hard('1221') == 0)
assert(hard('123425') == 4)
assert(hard('123123') == 12)
assert(hard('12131415') == 4)
puts "hard(input): #{hard(input)}"