#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);
? Оператор остатка Javascript3. Один или несколько из этих фактов должны быть полезны: (а) Целочисленное деление — это способ определить, сколько раз может произойти вычитание, создавая неотрицательный остаток, (б) деление по модулю% дает остаток. (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. Да, это плохая привычка, но большую часть времени я нахожу, что массивы легче укладывать в голове. Спасибо, это, кажется, работает до сих пор, очень ценится.