annotate day3b.rb @ 6:9d89489bc939

Day 6 part 1 - calculate times above range
author IBBoard <dev@ibboard.co.uk>
date Thu, 07 Dec 2023 08:16:30 +0000
parents 0f4991eca11a
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
1 #! /usr/bin/env ruby
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
2
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
3 if ARGV.length != 1
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
4 abort("Incorrect arguments - needs input file")
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
5 elsif not File.exist? (ARGV[0])
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6 abort("File #{ARGV[0]} did not exist")
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 end
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 file = ARGV[0]
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
10
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
11 number_chars = *('0'..'9')
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
12 skip_chars = ['.']
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
13
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
14 numbers = Hash.new
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
15 symbols = Array.new
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
16 Position = Struct.new(:x, :y)
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
17 NumberValue = Struct.new(:value, :positions)
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
18 SymbolValue = Struct.new(:value, :position)
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
19
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20 def create_number_position(vals)
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21 number = vals.reduce("") {|m, v| m + v[0]}.to_i
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
22 positions = vals.map {|v| Position.new(v[1], v[2])}
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
23 NumberValue.new(number, positions)
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
24 end
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
25
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
26 def adjacent(a, b)
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
27 (a.x - b.x).abs <= 1 and (a.y - b.y).abs <= 1
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
28 end
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
29
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
30 sum = 0
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
31 positions = File.open(file, "r").each_line(chomp: true).with_index.map do |line, index|
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
32 numbers = line.each_char.with_index.map {|c, i| if number_chars.include? c or !skip_chars.include? c then [c, index, i] end }\
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
33 .filter {|v| v != nil }\
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
34 .reduce([[], []]) do |memo, val|
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
35 if number_chars.include? val[0] then
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
36 if memo[1].last and memo[1].last[2] + 1 != val[2] then
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
37 memo[0] << create_number_position(memo[1])
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
38 memo[1] = []
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
39 end
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
40 memo[1] << val
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
41 else
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
42 if memo[1] != [] then
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
43 memo[0] << create_number_position(memo[1])
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
44 memo[1] = []
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
45 end
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
46 memo[0] << SymbolValue.new(val[0], Position.new(val[1], val[2]))
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
47 end
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
48 memo
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
49 end
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
50 if numbers[1] != [] then
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
51 numbers[0] << create_number_position(numbers[1])
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
52 end
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
53 numbers[0]
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
54 end.flatten.group_by {|elem| elem.class}
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
55
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
56 symbol_pos = positions[SymbolValue]
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
57 number_pos = positions[NumberValue]
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
58
0f4991eca11a Implement day 3
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
59 puts symbol_pos.filter {|sym| sym.value == "*"}.map {|sym| number_pos.filter {|num| num.positions.any? {|num_pos| adjacent(num_pos, sym.position)}}}.filter {|nums| nums.length == 2}.map {|val| val.reduce(1) {|v, k| v * k.value}}.reduce(:+)