OOP Day 16
change
commit 82928ac7c0acdc8db0b632b862a6ed5c7169dca7
author Alpha Chen <alpha.chen@gmail.com>
date
parent 7792d829
diff --git a/day_16.rb b/day_16.rb
index 604d4f9..75b0b64 100644
--- a/day_16.rb
+++ b/day_16.rb
@@ -1,8 +1,33 @@
+require "letters"
+
+class Sue
+  MATCHERS = Hash.new("==")
+  %w[ cats trees ].each do |key|
+    MATCHERS[key] = ?>
+  end
+  %w[pomeranians goldfish ].each do |key|
+    MATCHERS[key] = ?<
+  end
+
+  attr_reader *%i[ properties ]
+
+  def initialize(properties)
+    @properties = properties
+  end
+
+  def match?(facts)
+    facts.select {|k,_| properties.keys.include?(k) }
+         .all? {|k,v| properties[k].send(MATCHERS[k], v) }
+  end
+end
+
 regex = /Sue (\d+): (.*)/
 sues = Hash[DATA.read.scan(regex).map { |attrs|
-  [attrs[0], Hash[attrs[1].split(", ").map {|i| i.split(": ") }]]
+  [attrs[0].to_i, Sue.new(Hash[attrs[1].split(", ")
+                                       .map {|i| i.split(": ") }
+                                       .map {|k,v| [k,v.to_i] }])]
 }]
-facts = Hash[<<FACTS.split("\n").map {|i| i.split(": ") }]
+facts = Hash[<<FACTS.split("\n").map {|i| i.split(": ") }.map {|k,v| [k,v.to_i] }]
 children: 3
 cats: 7
 samoyeds: 2
@@ -15,15 +40,7 @@ cars: 2
 perfumes: 1
 FACTS
 
-facts_gt = Hash[%w[ cats trees ].map {|k| [k,facts[k]] }]
-facts_lt = Hash[%w[ pomeranians goldfish ].map {|k| [k,facts[k]] }]
-%w[ cats trees pomeranians goldfish ].each {|k| facts.delete(k) }
-
-puts sues.select {|sue,data|
-  facts.select {|k,_| data.keys.include?(k) }.all? {|k,v| data[k] == v } &&
-  facts_gt.select {|k,_| data.keys.include?(k) }.all? {|k,v| data[k] > v } &&
-  facts_lt.select {|k,_| data.keys.include?(k) }.all? {|k,v| data[k] < v }
-}
+puts sues.select {|i,sue| sue.match?(facts) }
 
 __END__
 Sue 1: goldfish: 9, cars: 0, samoyeds: 9