[2022][ruby][14.x] refactored

pull/1/head
Alpha Chen 2 years ago
parent adff292d00
commit 4129a82f26
Signed by: alpha
SSH Key Fingerprint: SHA256:3fOT8fiYQG/aK9ntivV3Bqtg8AYQ7q4nV6ZgihOA20g

@ -12,51 +12,41 @@ cave = scan.each.with_object({}) {|line, cave|
} }
} }
x_min, x_max = cave.keys.map(&:first).minmax def cave.to_s
y_min, y_max = cave.keys.map(&:last).minmax x_min, x_max = keys.map(&:first).minmax
y_min, y_max = keys.map(&:last).minmax
inspect_cave = -> { (0..y_max+1).map {|y|
puts (0..y_max+1).map {|y|
(x_min-1..x_max+1).map {|x| (x_min-1..x_max+1).map {|x|
cave[[x, y]] || ?. self.fetch([x, y], ?.)
}.join }.join
}.join("\n") }.join("\n")
} end
# part one
# sands = 0
# loop do
# inspect_cave.()
# sands += 1
# pos = [500, 0]
# while next_pos = [0, -1, 1].map {|dx| pos.zip([dx, 1]).map { _1 + _2 }}.find { cave[_1].nil? }
# pos = next_pos
# break if pos[1] >= y_max
# end
# break if pos[1] >= y_max
# cave[pos] = ?o
# end
# inspect_cave.()
# p sands-1
# part two def pour_sand(cave, stop:)
cave.default_proc = ->(h,(x,y)) { h[[x, y]] = y == y_max + 2 ? ?# : nil } return enum_for(__method__, cave, stop:) unless block_given?
sands = 0
loop do
# inspect_cave.()
sands += 1
loop do
# puts cave
pos = [500, 0] pos = [500, 0]
while next_pos = [0, -1, 1].map {|dx| pos.zip([dx, 1]).map { _1 + _2 }}.find { cave[_1].nil? } while next_pos = [0, -1, 1].map {|dx| pos.zip([dx, 1]).map { _1 + _2 }}.find { cave[_1].nil? }
pos = next_pos pos = next_pos
break if stop.(*pos)
end end
break if pos == [500, 0] break if stop.(*pos)
cave[pos] = ?o cave[pos] = ?o
yield pos
end
end end
inspect_cave.() y_max = cave.keys.map(&:last).max
p sands
# part one
p pour_sand(cave, stop: ->(_, y) { y >= y_max }).count
# part two
cave.delete_if { _2 == ?o } # reset cave
cave.default_proc = ->(_,(_,y)) { y == y_max + 2 ? ?# : nil }
p pour_sand(cave, stop: ->(x, y) { [x, y] == [500, 0] }).count + 1

Loading…
Cancel
Save