diff --git a/2020/ruby/day_24.rb b/2020/ruby/day_24.rb index d017007..9a0bd74 100644 --- a/2020/ruby/day_24.rb +++ b/2020/ruby/day_24.rb @@ -7,17 +7,17 @@ def parse(line) ss = StringScanner.new(line) until ss.eos? deltas << case - when ss.scan(/e/) then [ 1, -1, 0] - when ss.scan(/se/) then [ 0, -1, 1] - when ss.scan(/sw/) then [-1, 0, 1] - when ss.scan(/w/) then [-1, 1, 0] - when ss.scan(/nw/) then [ 0, 1, -1] - when ss.scan(/ne/) then [ 1, 0, -1] + when ss.scan(/e/) then [ 1, 0] + when ss.scan(/se/) then [ 0, 1] + when ss.scan(/sw/) then [-1, 1] + when ss.scan(/w/) then [-1, 0] + when ss.scan(/nw/) then [ 0, -1] + when ss.scan(/ne/) then [ 1, -1] else fail end end - deltas.inject {|(x,y,z),(dx,dy,dz)| [x+dx, y+dy, z+dz] } + deltas.inject {|c,d| c.zip(d).map {|c,d| c+d }} end NEIGHBORS = %w[ e se sw w nw ne ].map {|dir| parse(dir) } @@ -25,11 +25,11 @@ def tick(tiles) coords = Set.new(tiles.flat_map {|coord| [ coord, - *NEIGHBORS.map {|n| coord.zip(n).map {|c,d| c + d }}, + *NEIGHBORS.map {|n| coord.zip(n).map {|c,d| c+d }}, ] }) Set.new(coords.select {|coord| - live_neighbors = NEIGHBORS.map {|n| coord.zip(n).map {|c,d| c + d }}.count {|c| tiles.include?(c) } + live_neighbors = NEIGHBORS.map {|n| coord.zip(n).map {|c,d| c+d }}.count {|c| tiles.include?(c) } if tiles.include?(coord) (1..2).cover?(live_neighbors) else