62 lines
1.2 KiB
Crystal
62 lines
1.2 KiB
Crystal
require "./common.cr"
|
|
require "big"
|
|
|
|
lines = File.read("day12_input").split "\n"
|
|
lines.pop
|
|
|
|
initial = lines[0].split(": ")[1].chars
|
|
original = initial.join("")
|
|
rules = lines[2..-1].map do |it|
|
|
split = it.split " => "
|
|
line = split[0]
|
|
into = split[1][0]
|
|
{ line.chars, into }
|
|
end
|
|
|
|
class Array
|
|
def has_plant(i)
|
|
return false if i < 0 || i >= size
|
|
return self[i] == '#'
|
|
end
|
|
end
|
|
|
|
def step(initial, rules)
|
|
array = [] of Char
|
|
(-2..initial.size + 2).each do |i|
|
|
rule = [] of Char
|
|
(i-2..i+2).each do |ind|
|
|
rule << (initial.has_plant(ind) ? '#' : '.')
|
|
end
|
|
|
|
new_char = rules.find(&.[0].==(rule)).try(&.[1]) || '.'
|
|
array << new_char
|
|
end
|
|
return array
|
|
end
|
|
|
|
def get_total(initial, offset)
|
|
total = 0
|
|
initial.each_with_index do |char, i|
|
|
total += (char == '#') ? (i + offset) : 0
|
|
end
|
|
return total
|
|
end
|
|
|
|
offset = 0
|
|
|
|
20.times do |it|
|
|
initial = step(initial, rules)
|
|
offset -= 2
|
|
end
|
|
puts get_total(initial, offset)
|
|
|
|
total = BigInt.new("0")
|
|
fivebil = BigInt.new("50000000000")
|
|
first_index = (fivebil - 11)
|
|
|
|
total += first_index * 57
|
|
total += get_total("###.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#.#".chars, 0)
|
|
puts total
|
|
|
|
# 2850000002508
|