require 'date' str = '2021 7 0' y, m ,s = str.scan( /\d+/ ).map( &:to_i ) a = '日月火水木金土'.chars.rotate(s) sw = (Time.new( y, m, 1 ) - s % 7).wday ( (sw == 0)? 7 : sw ).downto(1){|d| a << Date.new( y, m, 1 ).prev_day( d ).mday.to_s } 1.upto( Date.new( y, m, 1 ).next_month.prev_day.mday ){|d| a << '%2d' % d } (-a.size % 7).times{|d| a << '%2d' % (d+1) } a.each_slice(7){|w| puts w * ' ' }