Add day 13 solutions.
This commit is contained in:
parent
c96b0c667e
commit
6eef99e081
|
@ -1,5 +1,5 @@
|
||||||
module Enumerable(T)
|
module Enumerable(T)
|
||||||
def count_each(others)
|
def count_each
|
||||||
count_map = {} of T => Int32
|
count_map = {} of T => Int32
|
||||||
each do |other|
|
each do |other|
|
||||||
count_map[other] = (count_map[other]? || 0) + 1
|
count_map[other] = (count_map[other]? || 0) + 1
|
||||||
|
|
120
day13.cr
Normal file
120
day13.cr
Normal file
|
@ -0,0 +1,120 @@
|
||||||
|
require "./common.cr"
|
||||||
|
|
||||||
|
lines = File.read("day13_input").split "\n"
|
||||||
|
lines.pop
|
||||||
|
|
||||||
|
map = lines.map &.chars
|
||||||
|
carts = [] of Tuple(Int32, Int32, Char, Char)
|
||||||
|
|
||||||
|
map.each_with_index do |line, y|
|
||||||
|
line.each_with_index do |char, x|
|
||||||
|
carts << {x, y, char, 'l'} if char == '>' || char == '<' || char == '^' || char == 'v'
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def next_turn(char)
|
||||||
|
return 'r' if char == 's'
|
||||||
|
return 'l' if char == 'r'
|
||||||
|
return 's'
|
||||||
|
end
|
||||||
|
|
||||||
|
def turn_dir(char, turn)
|
||||||
|
if turn == 'l'
|
||||||
|
return '<' if char == '^'
|
||||||
|
return 'v' if char == '<'
|
||||||
|
return '>' if char == 'v'
|
||||||
|
return '^' if char == '>'
|
||||||
|
end
|
||||||
|
if turn == 'r'
|
||||||
|
return '>' if char == '^'
|
||||||
|
return '^' if char == '<'
|
||||||
|
return '<' if char == 'v'
|
||||||
|
return 'v' if char == '>'
|
||||||
|
end
|
||||||
|
return char
|
||||||
|
end
|
||||||
|
|
||||||
|
def offset(char)
|
||||||
|
case char
|
||||||
|
when '^'
|
||||||
|
{0, -1}
|
||||||
|
when 'v'
|
||||||
|
{0, 1}
|
||||||
|
when '<'
|
||||||
|
{-1, 0}
|
||||||
|
when '>'
|
||||||
|
{1, 0}
|
||||||
|
else
|
||||||
|
{0, 0}
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def turn(cart, turnchar)
|
||||||
|
if turnchar == '/'
|
||||||
|
return '>' if cart == '^'
|
||||||
|
return 'v' if cart == '<'
|
||||||
|
return '^' if cart == '>'
|
||||||
|
return '<'
|
||||||
|
elsif turnchar == '\\'
|
||||||
|
return 'v' if cart == '>'
|
||||||
|
return '<' if cart == '^'
|
||||||
|
return '^' if cart == '<'
|
||||||
|
return '>'
|
||||||
|
end
|
||||||
|
return cart
|
||||||
|
end
|
||||||
|
|
||||||
|
def simulate(map, carts)
|
||||||
|
crashed = [] of Int32
|
||||||
|
crashed_pos = [] of Tuple(Int32, Int32)
|
||||||
|
|
||||||
|
carts.sort_by! do |cart|
|
||||||
|
x, y, c, t = cart
|
||||||
|
y * 280 + x
|
||||||
|
end
|
||||||
|
|
||||||
|
carts.each_with_index do |cart, index|
|
||||||
|
next if crashed.includes? index
|
||||||
|
x, y, c, t = cart
|
||||||
|
|
||||||
|
# TRUSTED
|
||||||
|
dx, dy = offset(c)
|
||||||
|
x += dx
|
||||||
|
y += dy
|
||||||
|
if map[y][x] == '+'
|
||||||
|
c = turn_dir(c, t)
|
||||||
|
t = next_turn(t)
|
||||||
|
else
|
||||||
|
c = turn(c, map[y][x])
|
||||||
|
end
|
||||||
|
# UNTRUSTED
|
||||||
|
|
||||||
|
carts.each_with_index do |c2, i2|
|
||||||
|
next if crashed.includes? i2
|
||||||
|
next if (c2[0] != x) || (c2[1] != y)
|
||||||
|
|
||||||
|
puts carts
|
||||||
|
crashed << index
|
||||||
|
crashed << i2
|
||||||
|
crashed_pos << {x, y}
|
||||||
|
end
|
||||||
|
|
||||||
|
carts[index] = {x, y, c, t}
|
||||||
|
end
|
||||||
|
|
||||||
|
crashed.sort!.reverse!.uniq!.each do |index|
|
||||||
|
carts.delete_at index
|
||||||
|
end
|
||||||
|
|
||||||
|
unless crashed_pos.empty?
|
||||||
|
puts crashed_pos
|
||||||
|
end
|
||||||
|
|
||||||
|
return carts.size <= 1
|
||||||
|
end
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
while !simulate(map, carts)
|
||||||
|
count += 1
|
||||||
|
end
|
||||||
|
puts carts[0]?
|
Loading…
Reference in New Issue
Block a user