Add day 12 solution.
This commit is contained in:
parent
453521de55
commit
c96b0c667e
61
day12.cr
Normal file
61
day12.cr
Normal file
|
@ -0,0 +1,61 @@
|
|||
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
|
Loading…
Reference in New Issue
Block a user