def remaining_months(mon)
(3 - mon) % 12
end
(1..12).each { |mon| puts "#{mon} -> #{remaining_months(mon)}" }
1 -> 2
2 -> 1
3 -> 0
4 -> 11
5 -> 10
6 -> 9
7 -> 8
8 -> 7
9 -> 6
10 -> 5
11 -> 4
12 -> 3
Поэтому вы бы хотели [remaining_months(mon), 1].max
.Лучше не помещать эту часть в метод remaining_months
.
. Обратите внимание, что массив months
определяется первым элементом, который является первым месяцем финансового года (4
).Поэтому неудивительно, что в вычислениях необходим только первый элемент.
У вас когда-нибудь возникали проблемы, связанные с модулем, когда вы пытались использовать различные выражения, пока не нашли, наконец, удачный вариант?Вот способ сделать это для тех, кто в аудитории несколько ленив по натуре.
RESULT = [*(3..11), 0, 1, 2].reverse
a = [*(-12..0), *(1..12)]
a.product([1,-1], (a-[0]), a).
select do |c1,c2,c3,c4|
(1..12).all? { |mon| c1 + c2 * ((c3 * mon + c4) % 12) == RESULT[mon-1] }
end.
map do |c1,c2,c3,c4|
s1 = c1.zero? ? '' : c1.to_s
s2 = case c1.zero?
when true then c2==1 ? '' : '-'
else c2==1 ? ' + ' : ' - '
end
s3 = if c3 > 0
c3==1 ? '' : "#{c3} * "
else
c3==-1 ? '- ' : "- #{c3.abs} * "
end
s4 = case c4 <=> 0
when 0 then ''
when -1 then " - #{c4.abs}"
else " + #{c4}"
end
"#{s1}#{s2}((#{s3}mon#{s4}) % 12"
end
#=> ["((- mon - 9) % 12",
# "((- mon + 3) % 12",
# "(11 * mon - 9) % 12",
# "(11 * mon + 3) % 12",
# "11 - ((- 11 * mon - 4) % 12",
# "11 - ((- 11 * mon + 8) % 12",
# "11 - ((mon - 4) % 12",
# "11 - ((mon + 8) % 12"]
Сделайте свой выбор!
Здесь мы получаем следующий промежуточный результат.
a.product([1,-1], (a-[0]), a).
select do |c1,c2,c3,c4|
(1..12).all? { |mon| c1 + c2 * ((c3 * mon + c4) % 12) == RESULT[mon-1] }
end
#=> [[0, 1, -1, -9], [0, 1, -1, 3], [0, 1, 11, -9], [0, 1, 11, 3],
# [11, -1, -11, -4], [11, -1, -11, 8], [11, -1, 1, -4], [11, -1, 1, 8]]