#!/usr/local/bin/ruby

class DirSpace
	attr_reader :name;
	attr_reader :size;
	attr_reader :fullsize;		# Including relevant children
	def initialize(name, size)
		name.gsub!(/\/$/, "");
		@name = name
		@size = size
		@fullsize = size
		@subbedchildren = {}
	end
	#
	# Subtract the size of a (potential) child from the size of this node.
	# Returns nil if our size was not changed, true if it was
	#
	def subChild(child)
		return nil if (@subbedchildren[child.name])
		if (child.name.index(Regexp.new("^#{name}/")))
			@size -= child.fullsize
			@subbedchildren[child.name] = child
			return true
		end
		return nil
	end
end


# Number of items to show
num_items = 10
if (ARGV.length > 0)
	num_items = ARGV[0].to_i
end


dirspace = {}
while $stdin.gets
	if ($_ =~ /^(\d+)\s+(.*)/)
		dirspace[$2] = DirSpace.new($2, $1.to_i)
	else
		print "Warning: bad line #$_\n"
	end
end

begin
	changed = nil
	ordered = dirspace.values.sort { |a,b| b.size <=> a.size }
	num_items.downto(0) { |i|
		#print "ordered[#{i}] = #{ordered[i].name}, #{ordered[i].size}\n"
		i.downto(0) { |j|
			if (ordered[j].subChild(ordered[i]))
				changed = true
			end
		}
	}
end while changed

sum = 0
0.upto(num_items) { |i|
	printf("%-8d%s\n", ordered[i].size, ordered[i].name)
	sum += ordered[i].size
}
print "Sum: #{sum}\n"
