Задачка с числами


#21

Тут надо было почитать про FIFO. Например, текст из википедии:

При помещении товаров на хранение необходимо учитывать принцип складской обработки. Если было несколько поступлений товара, то нужно решить, товар из какой партии будет отгружаться первым. Принцип FIFO означает приоритетную отгрузку товара, пришедшего первым

По сути, первый массив (предположим) это история операций на складе за день, где положительные числа - поступления, отрицательные - отгрузка. Нам нужна детализация того, как из поступлений брались части для отгрузки.

[3, 4, -1, -5, -4, 7]

Первым у нас поступила пачка из трёх товаров, потом из 4, потом было три отгрузки и в конце дня пришло ещё пачка из 7.

  • Ищем отгрузки: -1, значит мы взяли 1 товар из первой пачки (осталось 2 товара). [1]
  • Потом -5: 2 из первой пачки и ещё три из второй (остаётся 1). [1, 2, 3]
  • Потом -4: 1 из пачки, но поступлений до этого больше не было, значит приходится брать 3 из “другого места”. [1, 2, 3, 1, -3]
  • Потом приходит 7: мы должны отдать долг в “другое место” и у нас остаётся в конце дня четыре товара в пачке. [1, 2, 3, 1, -3, 4]

Не знаю, это ли ввиду имел автор, но я понял так.


#22

Такое объяснение мне открыло суть вопроса, если такого оно было у автора.
Правда ваш пример для хранилища провальный, т.к. в реальных условиях такого быть не может :slight_smile:


#23

Спасибо, что поделились - все именно так и задумывалось :slight_smile:

Каждой партии полученной и отгруженной соответствует цена, далее никаких проблем не составит расчитать прибыль/убыток от операций.


#24

Ну блин, теперь картина ясная. Да, одним reduce это не решить. Но задача клевая. Надо будет ее поковырять.


#25

Было бы круто реализовать это с помощью методов функционального программирования


#26

А чем решение от @Higderin не подходит. Он же там не работает с объектами. Там чистая работа с элементами массива. Это в любом языке имеется.


#27

Оно абсолютно нормальное и рабочее! Просто все, что можно написать в одну строчку имхо круче, чем код на целый абзац. @haymob в этом мастер спорта :slight_smile:


#29

А с нулями как быть?
И если массив начинается с -1, то мы считаем что у нас изнчачально “долг”?


#30

Нулей быть не может. С отрицательного числа может начинаться, да.


#31

а такое преобразование корректно? Правильно ли я методику понял?
[-2, 4, -1, -5, -4, 7] => [-2, 2, 1, -4, -8, -1]


#32

метод @Higderin выдает такой результат
[-2, 4, -1, -5, -4, 7] -> [-2, 1, 1, -4, -3, -1]


#33

Почему? Я исходил из описания про “поступления и отгрузки”. Где ошибка-тогда?


#34

Не в этот раз)

Тоже какие то костыли на ум пришли:

var arr = [3, 4, -1, -5, -4, 7]

func calculate(_ arr: [Int]) -> [Int] {
    var arr = arr
    print(arr)
    guard let pIndex = arr.index(where: { $0 > 0 }) else { return [] }
    let p = arr.remove(at: pIndex)
    guard let mIndex = arr.index(where: { $0 < 0 }) else { return [] }
    let m = arr.remove(at: mIndex)
    
    let sum = p + m
    var result: [Int]
    
    switch true {
    case sum < 0 && mIndex == 0:
        result = [p, sum]
    case sum > 0 && mIndex < pIndex:
        result = [sum]
    case sum > 0:
        result = [p - sum]
    default:
        result = [p]
    }
    
    if !arr.isEmpty {
        arr.insert(sum, at: sum > 0 ? 0 : mIndex)
        result += calculate(arr)
    }
    return result
}

print(calculate(arr))


#35

У вас явно где-то ошибка в логике.
Прогоните этот вариант [-2, 4, -1, -5, -4, 7]
И метод @Higderin кажется тоже не так считает на этом примере.
Мне кажется @Tau правильно посчитал.

И что-то мне подсказывает, что конечный ответ должен быть таким [-2, 1, 1, -4, -4, -1]


#36

Почему? Можно методику расчета пояснить?


#37

Правильно ли сделал преобразование? [-2, 3,4,-1,-5,-4,7] => [-2, 1,4,-1,-4,2]. Если нет, то какой массив будет правильным?


#38

пинг. (…)


#39

Так вроде бы разобрали уже задачку? :slight_smile: по вашему вопросу, @Higderin подробно расписал, как правильно разбивать массив.


#40

Похоже на правильное преобразование. Мой метод, кстати, неправильно считает долги.


#41

ну короче последний кусок кода от @haymob корректно считает? я не проверял код, мне было интересней методику понять.