Add solutions to days 10 and 11
This commit is contained in:
parent
17492a8c23
commit
479affa4cc
37
day10.cr
Normal file
37
day10.cr
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
require "advent"
|
||||||
|
INPUT = input(2020, 10).lines.map(&.to_i32).sort!
|
||||||
|
|
||||||
|
def part1(input)
|
||||||
|
diff_1 = 0
|
||||||
|
diff_3 = 0
|
||||||
|
curr = 0
|
||||||
|
input << (input.max + 3)
|
||||||
|
input.each do |i|
|
||||||
|
diff_1 += 1 if (i - curr) == 1
|
||||||
|
diff_3 += 1 if (i - curr) == 3
|
||||||
|
curr = i
|
||||||
|
end
|
||||||
|
puts diff_1 * diff_3
|
||||||
|
end
|
||||||
|
|
||||||
|
def count_ways(input, prev, index, mem, indent = 0)
|
||||||
|
if m = mem[{prev, index}]?
|
||||||
|
return m
|
||||||
|
end
|
||||||
|
return 0_i64 if input[index] - prev > 3 || index >= input.size
|
||||||
|
return 1_i64 if index == input.size - 1
|
||||||
|
|
||||||
|
total = count_ways(input, input[index], index+1, mem, indent + 1)
|
||||||
|
total += count_ways(input, prev, index+1, mem, indent + 1)
|
||||||
|
|
||||||
|
mem[{prev, index}] = total
|
||||||
|
return total
|
||||||
|
end
|
||||||
|
|
||||||
|
def part2(input)
|
||||||
|
input << (input.max + 3)
|
||||||
|
count_ways(input, 0, 0, {} of {Int32, Int32} => Int64)
|
||||||
|
end
|
||||||
|
|
||||||
|
puts part1(INPUT.clone)
|
||||||
|
puts part2(INPUT.clone)
|
64
day11.cr
Normal file
64
day11.cr
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
require "advent"
|
||||||
|
INPUT = input(2020, 11).lines.map(&.chars)
|
||||||
|
|
||||||
|
abstract class Search
|
||||||
|
def search(current, x, y, dx, dy)
|
||||||
|
x, y = x + dx, y + dy
|
||||||
|
return 0 if y < 0 || y >= current.size
|
||||||
|
return 0 if x < 0 || x >= current[y].size
|
||||||
|
search_impl(current,x,y,dx,dy)
|
||||||
|
end
|
||||||
|
|
||||||
|
abstract def search_impl(current, x, y, dx, dy)
|
||||||
|
end
|
||||||
|
|
||||||
|
class FirstSearch < Search
|
||||||
|
def search_impl(current, x, y, dx, dy)
|
||||||
|
return current[y][x] == '#' ? 1 : 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
class SecondSearch < Search
|
||||||
|
def search_impl(current, x, y, dx, dy)
|
||||||
|
return 1 if current[y][x] == '#'
|
||||||
|
return 0 if current[y][x] == 'L'
|
||||||
|
return search(current, x, y, dx, dy)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
DIRS = [{-1,-1}, {-1, 0}, {-1, 1}, {0, -1}, {0, 1}, {1, -1}, {1, 0}, {1,1}]
|
||||||
|
|
||||||
|
def step(current, step, check, n)
|
||||||
|
current.each_with_index do |row, y|
|
||||||
|
row.each_with_index do |seat, x|
|
||||||
|
step[y][x] = current[y][x]
|
||||||
|
count = DIRS.sum do |dx, dy|
|
||||||
|
check.search(current, x, y, dx, dy)
|
||||||
|
end
|
||||||
|
step[y][x] = 'L' if seat == '#' && count >= n
|
||||||
|
step[y][x] = '#' if seat == 'L' && count == 0
|
||||||
|
end
|
||||||
|
end
|
||||||
|
{step, current}
|
||||||
|
end
|
||||||
|
|
||||||
|
def run(input, search, n)
|
||||||
|
current = input
|
||||||
|
step = input.clone
|
||||||
|
loop do
|
||||||
|
current, step = step(current, step, search, n)
|
||||||
|
break if current.zip_with(step) { |l, r| l == r }.all?
|
||||||
|
end
|
||||||
|
current.sum(&.count(&.==('#')))
|
||||||
|
end
|
||||||
|
|
||||||
|
def part1(input)
|
||||||
|
run(input, FirstSearch.new, 4)
|
||||||
|
end
|
||||||
|
|
||||||
|
def part2(input)
|
||||||
|
run(input, SecondSearch.new, 5)
|
||||||
|
end
|
||||||
|
|
||||||
|
puts part1(INPUT.clone)
|
||||||
|
puts part2(INPUT.clone)
|
Loading…
Reference in New Issue
Block a user