Skip to content

Commit 53bb3bb

Browse files
committed
solve day 5 part 2 in Ruby
1 parent d616c23 commit 53bb3bb

File tree

1 file changed

+48
-3
lines changed

1 file changed

+48
-3
lines changed

day05/sol.rb

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
# Part 1
21
s = File.read("input.txt")
3-
seeds = s.lines[0].split[1..].map(&:to_i)
42
sections = s.split("\n\n")[1..]
3+
4+
# Part 1
5+
seeds = s.lines[0].split[1..].map(&:to_i)
6+
57
sections.map do |sect|
68
xs = sect.lines[1..].map{_1.split.map(&:to_i)}
79
seeds.map! do |seed|
@@ -11,4 +13,47 @@
1113
end
1214
end
1315
end
14-
p seeds.min
16+
17+
puts "Part 1:", seeds.min
18+
19+
20+
# Part 2
21+
seeds = s.lines[0].split[1..].map(&:to_i).each_slice(2).map{[_1, _1+_2-1]}
22+
23+
sections.map do |sect|
24+
xs = sect.lines[1..].map{_1.split.map(&:to_i)}.sort_by{_2}
25+
new_seeds = []
26+
27+
xs.each do |dest,src,len|
28+
next_seeds = []
29+
a = src
30+
b = src + len - 1
31+
seeds.each do |c, d|
32+
# A-C-D-B
33+
if a <= c && d <= b # full overlap
34+
new_seeds << [c - src + dest, d - src + dest]
35+
# C-A-B-D
36+
elsif c < a && b < d # inside
37+
next_seeds << [c, a-1]
38+
new_seeds << [a - src + dest, b - src + dest]
39+
next_seeds << [b+1, d]
40+
# A-C-B-D
41+
elsif a < c && c < b && b < d # partial overlap
42+
new_seeds << [c - src + dest, b - src + dest]
43+
next_seeds << [b+1, d]
44+
# C-A-D-B
45+
elsif c < a && a < d && d < b # partial overlap
46+
next_seeds << [c, a-1]
47+
new_seeds << [a - src + dest, d - src + dest]
48+
# A-B-C-D or C-D-A-B
49+
else # no overlap
50+
next_seeds << [c, d]
51+
end
52+
end
53+
seeds = next_seeds
54+
end
55+
56+
seeds += new_seeds
57+
end
58+
59+
puts "Part 2:", seeds.map{|a,b| a }.min

0 commit comments

Comments
 (0)