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]]