查找会计年度的剩余月份

时间:2018-12-10 00:41:59

标签: ruby

我需要计算从给定月份开始的一个会计年度的剩余月份数,其中一个会计年度从该年的第四个月开始。我有一个数组来说明这一点:

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,如果有,那么找不到剩余的月份。该解决方案正在工作,但我需要一种更好的方法来实现这一点。

4 个答案:

答案 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

我希望它对您有用。