39 lines
		
	
	
		
			880 B
		
	
	
	
		
			Crystal
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			880 B
		
	
	
	
		
			Crystal
		
	
	
	
	
	
| require "./common.cr"
 | |
| 
 | |
| lines = File.read("day3_input").split("\n")
 | |
| lines.pop
 | |
| 
 | |
| REGEX = /#([0-9]+) @ ([0-9]+),([0-9]+): ([0-9]+)x([0-9]+)/
 | |
| 
 | |
| claims = {} of Int32 => Rectangle
 | |
| lines.each do |line|
 | |
|   match = line.match(REGEX).not_nil!
 | |
|   claim = match[1].to_i32
 | |
|   x = match[2].to_i32
 | |
|   y = match[3].to_i32
 | |
|   width = match[4].to_i32
 | |
|   height = match[5].to_i32
 | |
|   claims[claim] = Rectangle.new(x, y, width, height)
 | |
| end
 | |
| 
 | |
| claimed_coords = {} of Tuple(Int32, Int32) => Int32
 | |
| claims.values.each do |claim|
 | |
|   claim.each_coord do |x, y|
 | |
|     coord = {x, y}
 | |
|     claimed_coords[coord] = (claimed_coords[coord]? || 0) + 1
 | |
|   end
 | |
| end
 | |
| 
 | |
| puts "Overlapping: #{claimed_coords.values.count &.>(1)}"
 | |
| 
 | |
| claims.each do |k, v|
 | |
|   count_overlapped = 0
 | |
|   v.each_coord do |x, y|
 | |
|     count_overlapped += 1 if claimed_coords[{x, y}] > 1
 | |
|   end
 | |
|   if count_overlapped == 0
 | |
|     puts "No overlaps: #{k}"
 | |
|     exit
 | |
|   end
 | |
| end
 |