Ruby 查找会计年度中的剩余月份

Ruby 查找会计年度中的剩余月份,ruby,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_mon

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

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

您可以使用max设置起始索引值的最小值

fiscal_months = [4,5,6,7,8,9,10,11,12,1,2,3]
index = [@month-3, 1].max
annual_taxable_income += total_monthly_income_present_month + @basic_salary * fiscal_months[index, 12].size

对于两个不同的输入(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

我会那样做的。我觉得更清楚

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
我希望它对你有用

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
因此,您需要
[剩余月份(周一),1].max
。最好不要将此部分放入方法
剩余的\u个月

请注意,数组
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"]

你需要重新考虑这之后的计算。为什么
3
必须是例外?有办法避免吗?如果它真的应该作为例外情况处理,那么它也应该在这里显示的例程中作为例外情况处理。“值用于乘法,如果它为0,则输出为0”-只有乘法的结果为0,因此您将拥有
每月总收入\u当前月收入+0
。不确定您为什么需要三元。您的代码为我提供了
12
以输入
3
。为了得到零,我必须添加括号:
(12-(mon+9))%12
,这相当于
(3-mon)%12
@showaltb,在查看我的IRB会话后,我发现我将错误的代码转换为我的答案。产生这些结果的方法的操作路线是
11-(mon+8)%12
,但
(3-mon)%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]]