Книга: Программирование на языке Ruby

7.24. Разбиение месяца на недели

7.24. Разбиение месяца на недели

Представьте, что нужно разбить месяц на недели, например чтобы напечатать календарь. Эту задачу решает приведенный ниже код. Возвращаемый массив состоит из подмассивов, по семь элементов в каждом. При этом первому элементу каждого внутреннего массива соответствует воскресенье. Начальные элементы для первой недели и конечные для второй могут быть равны nil.

def calendar(month,year)
 days = month_days(month,year)
 t = Time.mktime(year,month,1)
 first = t.wday
 list = *1..days
 weeks = [[]]
 week1 = 7 - first
 week1.times { weeks[0] << list.shift }
 nweeks = list.size/7 + 1
 nweeks.times do |i|
  weeks[i+1] ||= []
  7.times do
   break if list.empty?
   weeks[i+1] << list.shift
  end
 end
 pad_first = 7-weeks[0].size
 pad_first.times { weeks[0].unshift(nil) }
 pad_last = 7-weeks[0].size
 pad_last.times { weeks[-1].unshift(nil) }
 weeks
end
arr = calendar(12,2008) # [[nil, 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, nil, nil, nil]]

Чтобы было понятнее, распечатаем этот массив массивов:

def print_calendar(month,year)
 weeks = calendar(month,year)
 weeks.each do |wk|
  wk.each do |d|
   item = d.nil? ? " "*4 : " %2d " % d
   print item
  end
  puts
 end
 puts
end
# Выводится:
#     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

Оглавление книги

Оглавление статьи/книги

Генерация: 4.859. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз