54 lines
2.8 KiB
Ruby
54 lines
2.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
grid = []
|
|
start_pos = [0, 0]
|
|
File.foreach('./2023/day10/data').with_index do |line, number|
|
|
start_pos = [line.index('S'), number] if line.include? 'S'
|
|
grid << line.split('')
|
|
end
|
|
|
|
# +x direction is right, +y direction is down
|
|
|
|
puts "Start POS: x: #{start_pos[0]} y: #{start_pos[1]}"
|
|
|
|
last_pos = start_pos
|
|
if (grid[start_pos[1] + 1][start_pos[0]] == '|') || (grid[start_pos[1] + 1][start_pos[0]] == 'J') || (grid[start_pos[1] + 1][start_pos[0]] == 'L')
|
|
cur_pos = [start_pos[0], start_pos[1] + 1]
|
|
elsif (grid[start_pos[1]][start_pos[0] + 1] == '-') || (grid[start_pos[1]][start_pos[0] + 1] == 'J')
|
|
cur_pos = [start_pos[0] + 1, start_pos[1]]
|
|
elsif (grid[start_pos[1]][start_pos[0] - 1] == '-') || (grid[start_pos[1]][start_pos[0] - 1] == 'L')
|
|
cur_pos = [start_pos[0] - 1, start_pos[1]]
|
|
elsif (grid[start_pos[1] - 1][start_pos[0]] == '|') || (grid[start_pos[1] - 1][start_pos[0]] == 'F') || (grid[start_pos[1] - 1][start_pos[0]] == '7')
|
|
cur_pos = [start_pos[0], start_pos[1] - 1]
|
|
end
|
|
|
|
dist = 0
|
|
log_count = 0
|
|
|
|
while cur_pos != start_pos
|
|
dist += 1
|
|
log_count += 1
|
|
puts dist if (log_count % 100_000).zero?
|
|
if (last_pos != [cur_pos[0],
|
|
cur_pos[1] + 1]) && (grid[cur_pos[1]][cur_pos[0]] == '|' || grid[cur_pos[1]][cur_pos[0]] == 'F' || grid[cur_pos[1]][cur_pos[0]] == '7') && ((grid[cur_pos[1] + 1][cur_pos[0]] == '|') || (grid[cur_pos[1] + 1][cur_pos[0]] == 'J') || (grid[cur_pos[1] + 1][cur_pos[0]] == 'L'))
|
|
last_pos = [cur_pos[0], cur_pos[1]]
|
|
cur_pos = [cur_pos[0], cur_pos[1] + 1]
|
|
elsif (last_pos != [cur_pos[0] + 1,
|
|
cur_pos[1]]) && (grid[cur_pos[1]][cur_pos[0]] == 'L' || grid[cur_pos[1]][cur_pos[0]] == '-' || grid[cur_pos[1]][cur_pos[0]] == 'F') && ((grid[cur_pos[1]][cur_pos[0] + 1] == '-') || (grid[cur_pos[1]][cur_pos[0] + 1] == 'J') || (grid[cur_pos[1]][cur_pos[0] + 1] == '7'))
|
|
last_pos = [cur_pos[0], cur_pos[1]]
|
|
cur_pos = [cur_pos[0] + 1, cur_pos[1]]
|
|
elsif (last_pos != [cur_pos[0] - 1,
|
|
cur_pos[1]]) && (grid[cur_pos[1]][cur_pos[0]] == '-' || grid[cur_pos[1]][cur_pos[0]] == '7' || grid[cur_pos[1]][cur_pos[0]] == 'J') && ((grid[cur_pos[1]][cur_pos[0] - 1] == '-') || (grid[cur_pos[1]][cur_pos[0] - 1] == 'L') || (grid[cur_pos[1]][cur_pos[0] - 1] == 'F'))
|
|
last_pos = [cur_pos[0], cur_pos[1]]
|
|
cur_pos = [cur_pos[0] - 1, cur_pos[1]]
|
|
elsif (last_pos != [cur_pos[0],
|
|
cur_pos[1] - 1]) && (grid[cur_pos[1]][cur_pos[0]] == 'J' || grid[cur_pos[1]][cur_pos[0]] == 'L' || grid[cur_pos[1]][cur_pos[0]] == '|') && ((grid[cur_pos[1] - 1][cur_pos[0]] == '|') || (grid[cur_pos[1] - 1][cur_pos[0]] == 'F') || (grid[cur_pos[1] - 1][cur_pos[0]] == '7'))
|
|
last_pos = [cur_pos[0], cur_pos[1]]
|
|
cur_pos = [cur_pos[0], cur_pos[1] - 1]
|
|
else
|
|
break
|
|
end
|
|
end
|
|
|
|
puts (dist / 2.0).ceil
|