我需要计算从给定月份开始的一个会计年度的剩余月份数,其中一个会计年度从该年的第四个月开始。我有一个数组来说明这一点:
months = [4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3]
一些预期的输入和输出是:
4
=> 11
10
=> 5
2
=> 1
但是,当给定3
时(以及给定2
时),我希望它返回1
,因为返回值用于乘法,如果返回值用于乘法,为0,则输出变为0
。
我通过以下方法解决了这个问题:
@month == 3 ?
annual_taxable_income += total_monthly_income_present_month :
annual_taxable_income += total_monthly_income_present_month + @basic_salary * fiscal_months_array[@month - 3, 12].size
我用三元运算符检查是否有3
,如果有,那么找不到剩余的月份。该解决方案正在工作,但我需要一种更好的方法来实现这一点。
答案 0 :(得分:1)
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]]
答案 1 :(得分:0)
您可以使用max设置起始索引值的最小值
dev
答案 2 :(得分:0)
您想要一个为两个不同的输入(2,3)返回相同答案(1)的函数似乎很奇怪。但是,如果是这种情况,您可以这样做。这是蛮力的,但可以清楚说明您要做什么:
def num_remaining_months_for (m)
fiscal_months = [4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3]
remaining = [11, 10, 9, 8, 7, 6, 5, 4, 3 , 2, 1, 1]
index = fiscal_months.index(m)
remaining[index]
end
(1..12).each do |e|
puts "For month #{e} => #{num_remaining_months_for(e)} remaining"
end
结果是:
For month 1 => 2 remaining
For month 2 => 1 remaining
For month 3 => 1 remaining
For month 4 => 11 remaining
For month 5 => 10 remaining
For month 6 => 9 remaining
For month 7 => 8 remaining
For month 8 => 7 remaining
For month 9 => 6 remaining
For month 10 => 5 remaining
For month 11 => 4 remaining
For month 12 => 3 remaining
答案 3 :(得分:0)
我会那样做。我认为这更清楚。
def number_of_remaining_months(month)
fiscal_months_array = [4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3]
month = 2 if month == 3
fiscal_months_array.count - 1 - fiscal_months_array.index(month)
end
puts("Number of the month [1-12]:")
month = Integer(gets.chomp)
result = number_of_remaining_months(month)
annual_taxable_income = total_monthly_income_present_month +
@basic_salary * result
我希望它对您有用。