Skip to content

Instantly share code, notes, and snippets.

@cjavdev
Created December 15, 2022 14:21
Show Gist options
  • Save cjavdev/6b9ce18de21e56c33399e3b8c1bcff00 to your computer and use it in GitHub Desktop.
Save cjavdev/6b9ce18de21e56c33399e3b8c1bcff00 to your computer and use it in GitHub Desktop.
Part 1 - comparing ruby 3.1.2 vs 3.2.0-preview2
require 'set'
if ARGV.empty?
data = DATA.readlines(chomp: true)
y = 10
else
data = File.readlines(ARGV[0], chomp: true)
y = 2000000
end
sensors = Set.new
beacons = Set.new
def distance(a, b)
(a[0] - b[0]).abs + (a[1] - b[1]).abs
end
puts "Parsing lines..."
lines = data.map do |line|
/Sensor at x=(?<x>-?\d+), y=(?<y>-?\d+): closest beacon is at x=(?<bx>-?\d+), y=(?<by>-?\d+)/.match(line)
end.map do |match|
sensor = [match[:x].to_i, match[:y].to_i]
beacon = [match[:bx].to_i, match[:by].to_i]
d = distance(sensor, beacon)
sensors << [sensor, d]
beacons << beacon
end
possible = Set.new
exclude = Set.new
puts "Big loop..."
(-10_000_000..10_000_000).each do |x|
pt = [x, y]
next if beacons.include?(pt)
sensors.each do |sensor, d|
if distance(sensor, pt) <= d
exclude << pt
break
end
end
end
p exclude.size
# p beacons
# p lines
__END__
Sensor at x=2, y=18: closest beacon is at x=-2, y=15
Sensor at x=9, y=16: closest beacon is at x=10, y=16
Sensor at x=13, y=2: closest beacon is at x=15, y=3
Sensor at x=12, y=14: closest beacon is at x=10, y=16
Sensor at x=10, y=20: closest beacon is at x=10, y=16
Sensor at x=14, y=17: closest beacon is at x=10, y=16
Sensor at x=8, y=7: closest beacon is at x=2, y=10
Sensor at x=2, y=0: closest beacon is at x=2, y=10
Sensor at x=0, y=11: closest beacon is at x=2, y=10
Sensor at x=20, y=14: closest beacon is at x=25, y=17
Sensor at x=17, y=20: closest beacon is at x=21, y=22
Sensor at x=16, y=7: closest beacon is at x=15, y=3
Sensor at x=14, y=3: closest beacon is at x=15, y=3
Sensor at x=20, y=1: closest beacon is at x=15, y=3
@cjavdev
Copy link
Author

cjavdev commented Dec 15, 2022

image

@cjavdev
Copy link
Author

cjavdev commented Dec 15, 2022

Made it a little faster:

  • replace function call with inline distance calculation
  • only exclude beacons if they are in range
require 'set'
if ARGV.empty?
  data = DATA.readlines(chomp: true)
  y = 10
else
  data = File.readlines(ARGV[0], chomp: true)
  y = 2000000
end

sensors = Set.new
beacons = Set.new

puts "Parsing lines..."
lines = data.map do |line|
  /Sensor at x=(?<x>-?\d+), y=(?<y>-?\d+): closest beacon is at x=(?<bx>-?\d+), y=(?<by>-?\d+)/.match(line)
end.map do |match|
  sensor = [match[:x].to_i, match[:y].to_i]
  beacon = [match[:bx].to_i, match[:by].to_i]
  d = distance(sensor, beacon)
  sensors << [sensor, d]
  beacons << beacon
end

exclude = Set.new
puts "Big loop..."
(-10_000_000..10_000_000).each do |x|
  sensors.each do |(sx, sy), d|
    if (sx - x).abs + (sy - y).abs <= d
      exclude << [x, y] if !beacons.include?([x, y])
      break
    end
  end
end
p exclude.size

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment