Advertisement
Guest User

Advent of Code Day 24

a guest
Dec 24th, 2022
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.30 KB | Source Code | 0 0
  1. require 'set'
  2.  
  3. DIRS = [ [1,0], [0,1], [-1,0], [0,-1], [0,0] ]
  4. WRAP = [ [:min,:same], [:same, :min], [:max,:same], [:same,:max] ]
  5. ARROW = [ '>', 'v', '<', '^']
  6.  
  7. def show(grid, pos)
  8.   msg = nil
  9.   grid.each_with_index do |row, y|
  10.     row.each_with_index do |cell, x|
  11.       if pos == [x,y]
  12.         c = 'E'
  13.         msg = 'OVERLAP?!?!' unless cell.empty?
  14.       elsif cell == '#'
  15.         c = '#'
  16.       elsif cell.size == 0
  17.         c = '.'
  18.       elsif cell.size == 1
  19.         c = ARROW[cell[0]]
  20.       else
  21.         c = cell.size
  22.       end
  23.       print c
  24.     end
  25.     puts
  26.   end
  27.   puts msg unless msg.nil?
  28. end
  29.  
  30. def step(grid)
  31.   new_grid = Array.new(grid.size){ Array.new(grid[0].size){[]}}
  32.   max = [new_grid[0].size - 2, new_grid.size - 2]
  33.  
  34.   grid.each_with_index do |row, y|
  35.     row.each_with_index do |cell, x|
  36.       if cell == '#'
  37.         new_grid[y][x] = '#'
  38.         next
  39.       end
  40.  
  41.       cell.each do |b|
  42.         n = [x + DIRS[b][0], y + DIRS[b][1]]
  43.         if grid[n[1]][n[0]] == '#'
  44.           [0,1].each do |i|
  45.             case WRAP[b][i]
  46.             when :min then n[i] = 1
  47.             when :max then n[i] = max[i]
  48.             end
  49.           end
  50.         end
  51.         new_grid[n[1]][n[0]] << b
  52.       end
  53.     end
  54.   end
  55.  
  56.   new_grid
  57. end
  58.  
  59. def valid_moves(grid, pos)
  60.   x,y = pos
  61.   maxx, maxy = [grid[0].size-1, grid.size-1]
  62.   valids = []
  63.   DIRS.each do |d|
  64.     nx,ny = x+d[0], y+d[1]
  65.     next if nx < 0 || ny < 0 || nx > maxx || ny > maxy
  66.     valids << [nx,ny] if grid[ny][nx].empty?
  67.   end
  68.  
  69.   Set.new(valids)
  70. end
  71.  
  72. grid = File.open('input_day24.txt', 'r').readlines.map do |line|
  73.   line.strip.split('').map do |cell|
  74.     if cell == '#'
  75.       t = cell
  76.     else
  77.       t = []
  78.       t << ARROW.index(cell) if ARROW.include? cell
  79.     end
  80.     t
  81.   end
  82. end
  83.  
  84. goal = [grid[0].size-2, grid.size-1]
  85. pos = [[1,0]]
  86.  
  87. goals = [goal, [1,0], goal]
  88.  
  89. n = 0
  90. while !goals.empty?
  91.   grid = step(grid)
  92.   newpos = Set.new
  93.   pos.each {|p| newpos = newpos.union(valid_moves(grid, p))}
  94.  
  95.   if newpos.reduce(false){|v,p| v || p == goals[0]}
  96.     puts "FOUND A WAY TO GOAL #{goals[0]}! (TURN #{n+1})"
  97.     pos = [goals.shift]
  98.     n += 1
  99.     next
  100.   end
  101.  
  102.   newpos.each do |np|
  103.     x,y = np
  104.     puts "WAIT A MINUTE, THERE'S AN OVERLAP" unless grid[y][x].empty?
  105.   end
  106.  
  107.   pos = newpos
  108.   n += 1
  109. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement