people = [] purposes = {} payment = {} total = 0.0 (File.read("muenchen-2005.rech") + "\n\n---\n").each { |line| line.chomp! next if line =~ /^ *(#|$)/ # emacs: / if line == "---" 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 payment.each { |name, v| v.each { |other, w| v[other] = 0.0 } } next end if line =~ /^-(\w+)/ people.delete $1 next end name, money, reason = line.split "\t" money = money.to_f total += money people = (people << name).uniq (purposes[name] ||= []) << reason if reason =~ /\w/ na = name (people-[na]).each { |ot| next if money == 0 pay = money/people.size 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 } } avg = total / people.size puts puts "%d Leute, %.2f pro Person (Cashflow: %.2f)" % [people.size, avg, total] purposes.each { |name, purp| unless purp.empty? puts "#{name}: #{purp.join ', '}" end }