File tree 1 file changed +48
-3
lines changed 1 file changed +48
-3
lines changed Original file line number Diff line number Diff line change 1
- # Part 1
2
1
s = File . read ( "input.txt" )
3
- seeds = s . lines [ 0 ] . split [ 1 ..] . map ( &:to_i )
4
2
sections = s . split ( "\n \n " ) [ 1 ..]
3
+
4
+ # Part 1
5
+ seeds = s . lines [ 0 ] . split [ 1 ..] . map ( &:to_i )
6
+
5
7
sections . map do |sect |
6
8
xs = sect . lines [ 1 ..] . map { _1 . split . map ( &:to_i ) }
7
9
seeds . map! do |seed |
11
13
end
12
14
end
13
15
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
You can’t perform that action at this time.
0 commit comments