Головоломка кода

jopi

Попрошайка
1,421
30
260
У меня есть такой прикол
int damage = 5000;
int[] armors = {2000, 6000, 1000, 0};
Мне нужно на выходе получить
int damage = 0;
int[] armors = {0, 4000, 0, 0};
я попробовал, и обосрался

Java:
while(true) {
    boolean var1 = true;
    for (int i = 0; i != 4; i++) {
        if (armors[i] != 0) {
            var1 = false;
        }
    }
    if (var1) break;
    if (damage == 0) break;
    int var2 = 0;
    int[] var3 = {0, 0, 0, 0};
    for (int i = 0; i != 4; i++) {
        if (armors[i] != 0) {
            var2++;
            var3[i] = 1;
        }
    }

    int var4DamageLimited = damage / var2;
    int var5Copy = damage;
    int var6 = 0;
    for (int i = 0; i != 4; i++) {
        if (var3[i] != 0) {
            if (armors[i] >= var4DamageLimited) {
                armors[i] -= var4DamageLimited;
                var5Copy -= var4DamageLimited;
            } else if (armors[i] < var4DamageLimited) {
                var6 = var4DamageLimited - armors[i];
                armors[i] = 0;
                var5Copy -= var6;
            }
        }
    }
    damage -= var5Copy;
}
Что можете подсказать господа?
при этом если сделать так:
int damage = 3500;
int[] armors = {2000, 6000, 1000, 0};
Должно выйти
int damage = 0;
int[] armors = {750, 4750, 0, 0};
 

jopi

Попрошайка
1,421
30
260
@Dysphoria я тоже, неправильно генерит
смысл вот в чем
типо есть броня, и равномерно должен расходится дамаг.
т.е. если у тебя на шмотках осталось 500 1000 250 и 0 прочности
при ударе уроном 1000, должно снятся одинаково со всех, т.е. 333.333336 если быть точным, в инте это 333 и снимается
500-333 потом 1000-333 а дальше незадача, 250 меньше 333, поэтому вычитается 250 и остаток записывается, и этот цикл крутится еще раз
и так пока либо броня не сядет равномерно либо пока урон не станет 0
 

Eifel

Модератор
1,623
78
608
Так продамажил бронь, при дамаге равными порциями чекаешь, сколько можно продамажить, и то, что осталось запихиваешь в остаток, потом опять по всему проходишь(по тому шмоту, что остался) юзая уже свой остаток, который получился, опять рабиваешь и опять то же.. Ну тип, первое что пришло в голову.

Думаю если бы ты с нуля написал алгоритм, а не парился с готовым, все бы уже давно работало. Вообще можно думаю как-то более солидно это все дело оформить
 

jopi

Попрошайка
1,421
30
260
Головоломка решена, Ошибки были в
var4DamageLimited, var5Copy типы заменяются на double,
последняя проверка где else if (armors[i] < var4DamageLimited)
становится такой:

Java:
var5Copy -= armors[i];
armors[i] = 0;
последняя строка цикла damage -= var5Copy меняется на damage = var5Copy
и на этом головоломка моя решена.
спасибо всем кто помогал
Вот код, немного изменены переменные(названия)
var2 - activeArmor
var3 - activeArmorArr и тип boolean
var5Copy - damageCopy
Забыл упомянуть что var6 удаляется вовсе.
Java:
public void run() {
    int damage = 7600;
    int[] armors = {3700, 2100, 5550, 220};

    while(true) {
        boolean var1 = true;
        for (int i = 0; i != 4; i++) {
            if (armors[i] != 0) {
                var1 = false;
            }
        }
        if (var1) break;
        if (damage <= 0) break;
        int activeArmor = 0;
        boolean[] activeArmorArr = {false, false, false, false};
        for (int i = 0; i != 4; i++) {
            if (armors[i] != 0) {
                activeArmor++;
                activeArmorArr[i] = true;
            }
        }
        double var4DamageLimited = (double)damage / (double)activeArmor;
        double damageCopy = damage;
        for (int i = 0; i != 4; i++) {
            if (activeArmorArr[i]) {
                if (armors[i] >= var4DamageLimited) {
                    armors[i] -= var4DamageLimited;
                    damageCopy -= var4DamageLimited;
                } else if (armors[i] < var4DamageLimited) {
                    damageCopy -= armors[i];
                    armors[i] = 0;
                }
            }
        }
        damage = (int)damageCopy;
    }
    System.out.println(Arrays.toString(armors));
    System.out.println(damage);
}
 
Сверху