Snippet

advent_of_code/2024_14.rb
Code:
# Advent of Code 2024, Day 14: Restroom Redoubt

# https://adventofcode.com/2024/day/14

require_relative './helpers.rb'

def part_one(data)
  w, h, d = 101, 103, 100
  rs, vs = data.map { |p, v| p.to_p }, data.map { |p, v| v.to_p }
  d.times do |t|
    rs.size.times { |i| rs[i] = [(rs[i].x + vs[i].x) % w, (rs[i].y + vs[i].y) % h].to_p }
    return [
      rs.count { |r| (r.x < w / 2) && (r.y < h / 2) }, rs.count { |r| (r.x > w / 2) && (r.y < h / 2) },
      rs.count { |r| (r.x < w / 2) && (r.y > h / 2) }, rs.count { |r| (r.x > w / 2) && (r.y > h / 2) },
    ].inject(:*) if t == d - 1
  end
end

def part_two(data)
  w, h, t = 101, 103, 0
  rs, vs = data.map { |p, v| p.to_p }, data.map { |p, v| v.to_p }
  loop do
    t += 1
    rs.size.times { |i| rs[i] = [(rs[i].x + vs[i].x) % w, (rs[i].y + vs[i].y) % h].to_p }
    next unless rs.uniq.size == rs.size
    grid = Array.new(h) { Array.new(w) { '.' } }
    rs.each { |r| set_grid(grid, r, '#') }
    draw_grid(grid)
    return t
  end
end

def solve(data)
  data.map! { |l| l.split(/\=|\ |\,/).as { |a| [a[1, 2].map(&:to_i), a[4, 2].map(&:to_i)] } }
  [part_one(data), part_two(data)]
end

# puts solve(get_dataset(year: 2024, day: 14, type: 'example'))
# puts solve(get_dataset(year: 2024, day: 14, type: 'example_2'))
puts solve(get_dataset(year: 2024, day: 14, type: 'input'))
Output:
.................#...........................#.....................................#.................
.....................................................................................................
...........................#.........................................................................
.............#..................#....................................................................
.....#.#...#..........................................................................#..............
.....................................................................................................
.....................................................................................................
.................................................#...............#...................................
#.............................................#.....................................................#
......................................................#..............................................
............................................................................#........................
.....................................................................................................
........#......................................................#.....................................
.....................................................................................................
..................................................................................#..................
..............................................................................#.....................#
...................#.......................#.........................................................
.......................#.............................................................................
............................................#..................#...#.................................
.#..............................#....................................................................
.........................................#...........................................................
......#........#......................#...........................................#..................
.....................................................................................................
..............................................#......................................................
........................#.......................................#....................#............#..
...#......#........................................................................................#.
..................................................................................................#..
.................................................###############################.....#...#...........
.................................................#.............................#...................#.
..............#.#................................#.............................#.....................
.........................................#.......#.............................#...................#.
.................................................#.............................#.....................
...........#.....................................#..............#..............#.....................
...............#................#................#.............###.............#.....................
.................................................#............#####............#.....................
.........................#.......................#...........#######...........#.....................
.........#.................#.....................#..........#########..........#..............#......
.................................................#............#####............#.....................
.......................................#.........#...........#######...........#.................#...
......................#..........................#..........#########..........#.....................
.................................................#.........###########.........#.....................
.................................................#........#############........#.....................
.................................................#..........#########..........#.....................
............................#...............#....#.........###########.........#.....................
.................................................#........#############........#.....................
.................................................#.......###############.......#....................#
................................#................#......#################......#.................#...
.................................................#........#############........#.....................
.................................................#.......###############.......#.............#.......
...#........................#....................#......#################......#.....................
.................................................#.....###################.....#.....................
..........................................#......#....#####################....#.........#...........
.................................................#.............###.............#.....................
.................................................#.............###.............#.....................
#.................#..............#............#..#.............###.............#.....................
................................#................#.............................#.....................
.............#...................................#.............................#.....................
.......................................#.........#.............................#.....................
...............................#.................#.............................#................#...#
.................................................###############################.....................
............#.......................................................................#................
...............................#................................................#....................
..........................#....................#.....................................................
..........................................#..........................................................
............................................................#........................................
..................................................#..........................................#.......
......#..................................#..........#...............................#................
............#........................................................................................
.....................................................................................................
..#.........................................................................#........................
..........................#.................................#........................................
.....................................................................................................
.........................#...........#..................#...............#............................
...........................................................#.........................................
......................................................................#..............................
.....................................................................................................
...............#.................#...................................................................
.#.......................................................#...........................................
............................................#........................................................
..............................................#....................................#.........#.......
.....................................................................................................
.....#...............................................................................................
.....................................................................................................
.....................................................................................................
...........................................................#.........................................
..............................................................#............#.........................
.....................................................................................................
................................................................................................#....
......................................................#..............................................
...................#...........................................................#.....................
...............................#..............#......................#...............................
.....................................................................................................
.........#...........................................................................................
..............................#.........................#.................................#.......#..
..........#.......................................................#.......#..........................
.....................................................................................................
.......................................#...............................#.............................
.....................................................................................................
................#.....................................................#.......#......................
...................#.................#.........##........................#...........................
..................#.....................................................................#............
............................................................................................#........
...........................................................................................#.........
218619324
6446