-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmultiset.rb
37 lines (33 loc) · 848 Bytes
/
multiset.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/usr/bin/env ruby
$bag = {}; $rws = []
def multiset(str)
o = str.split(/\s+/).group_by{|i|i}.transform_values(&:length)
if o.keys.all?(&:empty?) then {} else o end
end
def rewrite()
loop do
didMatch = false
$rws.each do |pat, set|
match = true
pat.each do |term, count|
(match = false; break) unless $bag.key? term
(match = false; break) if $bag[term] < count
end
if match
didMatch = true
$bag.merge!(pat) { |_, bagged, removed| bagged - removed }
$bag.merge!(set) { |_, bagged, newly| newly + bagged }
puts $bag
end
end
break unless didMatch
end
end
while gets.chomp
if $_ =~ /\s*(.*)\s*\|\s*(.*)\s*/
$rws << [multiset($1), multiset($2)]
else
$bag.merge!(multiset $_) { |_, bagged, newly| newly + bagged }
end
rewrite
end