Как рассчитать, сколько раз я должен вычесть из определенного значения?

#javascript #math #pseudocode

#javascript #математика #псевдокод

Вопрос:

В моей программе у каждого Job есть связанный массив costs . Я пытаюсь написать функцию, которая будет вычислять, сколько раз задание может быть выполнено, прежде чем оно исчерпает определенный ресурс. Каждое задание вычисляет свою стоимость за цикл в зависимости от того, сколько рабочих выполняет его, поэтому задание с 10 рабочими и стоимостью 2 единицы будет вычитать 20 единиц из запаса по завершении каждого цикла.

Однако я хочу, чтобы функция учитывала ситуацию, когда имеется достаточно ресурсов для частичного завершения задания. Итак, используя приведенный выше пример, может быть только 15 единиц ресурса, поэтому 14 единиц вычитаются с 1 остатком.

грубо говоря, в псевдокоде (я работаю с Typescript, но подойдет любой язык):

 def doJob(cost, amount, worker):
  if amount - cost * workers >= 0
     amount - cost * workers
  if amount - cost * workers < 0
     ....
 

Редактировать:

Как я могу завершить эту функцию, чтобы она правильно вычитала из переменной «amount», не опустившись ниже нуля, и где переменной «worker» может быть любое произвольно большое число?

Комментарии:

1. В настоящее время не совсем ясно, в чем заключается ваш точный вопрос.

2. const remainder = amount % (cost * workers); ? Оператор остатка Javascript

3. Один или несколько из этих фактов должны быть полезны: (а) Целочисленное деление — это способ определить, сколько раз может произойти вычитание, создавая неотрицательный остаток, (б) деление по модулю% дает остаток. (c) Math.max( 0, some_computation ) «зажимает» результат вычисления до неотрицательного значения.

Ответ №1:

Похоже, вы ищете наименьший resource / resourcePerCycle из всех ресурсов. Это еще не учитывает количество работников, но вам просто нужно разделить maxJobCount на количество работников для обработки нескольких работников (при условии, что я правильно понимаю ваш вопрос).

 const stockpile = [1000, 50, 50];
const jobCost = [200, 20, 2];

function maxJobCount(jobCost, stockpile) {
  return Math.min(
    ...jobCost.map((_, i) => stockpile[i] / jobCost[i])
   );
}
console.log(maxJobCount(jobCost, stockpile)); 

Комментарии:

1. Сможете ли вы преобразовать это для использования массивов, а не объектов? Я думаю, это то, что я ищу

2. Переключился с объектов на массивы. Использование массивов более хрупкое, потому что оно предполагает jobCost и stockpile всегда будет иметь одни и те же ресурсы, перечисленные в том же порядке (даже если стоимость задания равна 0 для определенного ресурса). Итак, если вам нужна работа, которая стоит только третьего ресурса, вам нужно было бы сказать jobCost = [0, 0, 10] , а не просто сказать jobCost = {gold: 10} … но все, что работает для вас.

3. Да, это плохая привычка, но большую часть времени я нахожу, что массивы легче укладывать в голове. Спасибо, это, кажется, работает до сих пор, очень ценится.