annotate day19.rb @ 38:8e92cb172e6b

Output final distance Also minor code cleanup
author IBBoard <dev@ibboard.co.uk>
date Fri, 20 Sep 2024 20:30:11 +0100
parents 5ba34a851816
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
1 #! /usr/bin/env ruby
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
2
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
3 if ARGV.length != 1
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
4 abort("Incorrect arguments - needs input file")
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
5 elsif not File.exist? (ARGV[0])
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
6 abort("File #{ARGV[0]} did not exist")
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
7 end
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
8
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
9 file = ARGV[0]
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
10
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
11 workflows = Hash.new
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
12 Workflow = Struct.new(:name, :rules)
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
13 Rule = Struct.new(:filter, :next)
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
14 Filter = Struct.new(:field, :comparison, :value)
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
15 objects = Array.new
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
16 Object = Struct.new(:x, :m, :a, :s)
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
17
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
18 File.open(file, "r").each_line(chomp: true) do |line|
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
19 if line == ""
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
20 next
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
21 end
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
22 bracket_pos = line.index("{")
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
23 if bracket_pos == 0
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
24 # Parse an object
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
25 match = line.match("\{x=([0-9]+),m=([0-9]+),a=([0-9]+),s=([0-9]+)\}")
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
26 objects << Object.new(x=match[1].to_i, m=match[2].to_i, a=match[3].to_i, s=match[4].to_i)
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
27 else
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
28 # Parse a workflow
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
29 workflow_name = line[0,bracket_pos]
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
30 rules = line[(bracket_pos+1)..-2].split(",").map do |rule|
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
31 rule_parts = rule.split(":")
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
32 if rule_parts.length > 1
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
33 rule, next_workflow = rule_parts
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
34 filter = Filter.new(rule[0].to_sym, rule[1].to_sym, rule[2..-1].to_i)
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
35 Rule.new(filter, next_workflow)
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
36 else
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
37 Rule.new(Filter.new(:a, ">".to_sym, -1), rule_parts[0])
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
38 end
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
39 end
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
40 workflows[workflow_name] = Workflow.new(name=workflow_name, rules=rules)
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
41 end
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
42 end
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
43
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
44 filtered_objects = objects.map do |obj|
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
45 workflow_name = "in"
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
46 while workflow_name != "R" and workflow_name != "A"
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
47 workflow = workflows[workflow_name]
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
48 workflow.rules.each do |rule|
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
49 puts rule
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
50 filter = rule.filter
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
51 if obj.public_send(filter.field).public_send(filter.comparison, filter.value)
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
52 workflow_name = rule.next
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
53 break
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
54 end
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
55 end
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
56 end
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
57 obj if workflow_name == "A"
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
58 end.reject(&:nil?)
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
59 puts "#{filtered_objects.to_a}"
5ba34a851816 Implement Day 19 workflows, skip part 2
IBBoard <dev@ibboard.co.uk>
parents:
diff changeset
60 puts "#{filtered_objects.reduce(0) {|accum, obj| accum + obj.x + obj.m + obj.a + obj.s}}"