Something went wrong. Try again.
Code for the Advent of Code event
aoc advent-of-code
Something went wrong. Try again.
1.3 kB · 57 lines
Ruby
at rust
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758#!/usr/bin/env ruby# frozen_string_literal: true
require 'matrix'
map = ARGF.readlines.map(&:chomp).flat_map.with_index do |line, y| line.chars.map.with_index do |cell, x| [Vector[x, y], cell] endend.to_h
WIDTH = map.keys.map { _1[0] }.max + 1HEIGHT = map.keys.map { _1[1] }.max + 1
def wrapget(map, pos) return map[Vector[0, pos[1]]] if pos[0] >= WIDTH return map[Vector[WIDTH - 1, pos[1]]] if pos[0] < 0 return map[Vector[pos[0], 0]] if pos[1] >= HEIGHT return map[Vector[pos[0], HEIGHT - 1]] if pos[1] < 0 map[pos]end
def wrapset(map, pos, val) if pos[0] >= WIDTH map[Vector[0, pos[1]]] = val elsif pos[0] < 0 map[Vector[WIDTH - 1, pos[1]]] = val elsif pos[1] >= HEIGHT map[Vector[pos[0], 0]] = val elsif pos[1] < 0 map[Vector[pos[0], HEIGHT - 1]] = val else map[pos] = val endend
def step(map) moved = 0 easts = map.select { _2 == '>' && wrapget(map, _1 + Vector[1, 0]) == '.' } easts.each_key do |pos| map[pos] = '.' wrapset(map, pos + Vector[1, 0], '>') moved += 1 end souths = map.select { _2 == 'v' && wrapget(map, _1 + Vector[0, 1]) == '.' } souths.each_key do |pos| map[pos] = '.' wrapset(map, pos + Vector[0, 1], 'v') moved += 1 end movedend
steps = 1steps += 1 while step(map) > 0
puts steps