people = {} purposes = {} File.read("muenchen-2005.rech").each { |line| line.chomp! next if line =~ /^ *(#|$)/ # emacs: / name, money, reason = line.split "\t" people[name] ||= 0.0 people[name] += money.to_f (purposes[name] ||= []) << reason if reason =~ /\w/ } total = people.values.inject { |a,e| a+e } avg = total / people.size puts "#{people.size} Leute, #{avg} pro Person (Cashflow: #{total})" payment = {} n = people.size people.each { |na, money| (people.keys-[na]).each { |ot| next if money == 0 pay = money/n if na > ot other, name = na, ot pay = -pay else name, other = na, ot end payment[name] ||= {} payment[name][other] ||= 0 payment[name][other] += pay } } puts purposes.each { |name, purp| unless purp.empty? puts "#{name}: #{purp.join ', '}" end } puts puts payment.map { |don, v| v.map { |rec, n| if n == 0 nil elsif n > 0 "%s -> %s: %.2f" % [rec, don, n] else "%s -> %s: %.2f" % [don, rec, -n] end } }.flatten.compact.sort