require 'date' def daily_cost(start_date, end_date, time_period_costs) daily_cost = {} if start_date > end_date raise "Wrong time period given." end (start_date..end_date).each do |date| time_period_costs.each do |time_period_cost| unless time_period_cost[:cost].is_a?(Float) raise "Wrong cost given." end daily_cost[date] ||= 0 if time_period_cost[:time_period] == :daily daily_cost[date] = time_period_cost[:cost] elsif time_period_cost[:time_period] == :weekly daily_cost[date] += time_period_cost[:cost] / 7 elsif time_period_cost[:time_period] == :monthly daily_cost[date] += time_period_cost[:cost] / days_in_month(date.year, date.month) else raise "Wrong time interval given." end end end daily_cost end def days_in_month(year, month) Date.new(year, month, -1).day end