Поиск оставшихся месяцев в финансовом году - PullRequest
0 голосов
/ 10 декабря 2018

Мне нужно рассчитать количество оставшихся месяцев в финансовом году, начиная с данного месяца, где финансовый год начинается с четвертого месяца года.У меня есть массив, иллюстрирующий это:

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

Iиспользовал троичный оператор, чтобы проверить, есть ли 3, и если есть, то не найти оставшиеся месяцы.Решение работает, но мне нужен лучший способ сделать это.

Ответы [ 4 ]

0 голосов
/ 10 декабря 2018
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]]
0 голосов
/ 10 декабря 2018

Кажется странным, что вам нужна функция, которая возвращает один и тот же ответ (1) для двух разных входов (2,3).Но, если это так, вы можете сделать это так.Это грубая сила, но она проясняет, что вы пытаетесь сделать:

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
0 голосов
/ 10 декабря 2018

Я бы так и сделал.Я думаю, что это понятнее.

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

Я надеюсь, что это полезно для вас.

0 голосов
/ 10 декабря 2018

вы можете установить минимальное значение начального индекса с помощью 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...