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


#1

Привет.

Есть массив положительных и отрицательных чисел [Int], например [3, 4, -1, -5, -4, 7]. Каким образом можно создать новый массив, чтобы каждому положительному числу соответствовало отрицательное? Например, первое положительное число 3, первое отрицательное -1. Значит в массив добавляем 1, 2 придерживаем для следующего отрицательного числа, т.е. -5. Теперь добавляем в массив ту 2-ку, и уже держим -3 для следующего положительно числа и т.д. Может есть какой-то простой способ это сделать?


#2

простую сортировку, если числа не повторяются, то потом в словарь записать


#3

Числа могут быть любыми, в том числе повторяющимися.


#4

Может так?

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

let sorted = arr.reduce(into: ([Int](), [Int]())) { $1 > 0 ? $0.0.append($1) : $0.1.append($1) }
let result = zip(sorted.0, sorted.1).flatMap { [$0.0, $0.1] }

print(result)

#5

Нет, не совсем. Первое число положительное - ему ищется пара. Не забываем про остаток от первой пары.

У нас есть основной массив let arr = [3, 4, -1, -5, -4, 7]. В нем можно выделить 2 подмассива - с положительными и отрицательными числами:

let pos = arr.filter { $0 > 0 } // [3, 4, 7]
let neg = arr.filter { $0 < 0 } // [-1, -5, -4]

Первой “парой” будет 1, т.к. первое число в основном массиве (arr) положительное (3) - его необходимо “закрыть” отрицательным. Т.е. берем наименьшее:

var posIndex = 0
var negIndex = 0
let size = min(pos[posIndex], -neg[negIndex])

Далее берем остаток

var reserve = pos[posIndex] + neg[negIndex]

Если он положительный, значит берем уже следующее отрицательное число. И так далее.


#6

Ничерта не понял из описания к заданию. Опишите результат. У вас явно плохо с формулировкой.


#7

Тут не совсем понятно, почему 1 :slight_smile:

Какой должен быть результат?

У меня вот что получилось:

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

let pos = { arr.index { $0 > 0 }.map { arr.remove(at: $0) } }
let neg = { arr.index { $0 < 0 }.map { arr.remove(at: $0) } }

let firstPos = pos()!
let firstNeg = neg()!
var result = [min(firstPos, -firstNeg), firstPos + firstNeg]

while let val = (result.last! > 0 ? neg : pos)() {
    result.append(result.last! + val)
}

print(result) // [1, 2, -3, 1, -3, 4]

#8

Можешь привести 2 примера с массивами? Вход-выход. Чтобы можно было точно понять что именно требуется. А то из описания и комментов трудно понять условие.


#9

Практически все верно :slight_smile:

Если просуммируем позиции, то получим [3, 7, 6, 1, -3, 4] - есть вход, далее увеличение позиции, потом выход, снова выход, переворот позиции, снова переворот. Тут как в бухгалтерском методе FIFO, first in - first out. Поэтому первым значением будет 1 - закрываем 3 с помощью -1.

В итоге должно получится [1, 2, 3, 1, -3, 4]

Пс: надеюсь, стало чуть понятнее всем :slight_smile:


#10

Почему 3 у вас со знаком + если 2 + -5 = -3?


#11

Первое значение 3 разбиваем на 1, 2
Второе значение 4 разбиваем на 3, 1

В итоге последовательность 1, 2, 3, 1, …


#12

А по какому принципу целое число разбиваем? :thinking:


#13

Стало еще запутанней. :thinking:


#14

Ну смотря на входные-выходные данные, вот такое придумал.

let a = [3, 4, -1, -5, -4, 7]
var result = a.enumerated().map {  return a[0...$0.offset].reduce(0, +) }
print(result)

Результат:
[3, 7, 6, 1, -3, 4]


#15

Если не гнаться за лаконичностью, то выходит так (если, конечно, я правильно понял условие):

var arr = [3, 4, -1, -5, -4, 7]
var result = [Int]()

while arr.count > 0 {
    let num = arr.removeFirst()
    if arr.count == 0 { result.append(num); continue }
    guard let secNum = num > 0 ? arr.first(where: { $0 < 0 }) : arr.first(where: { $0 > 0 }), let index = arr.firstIndex(of: secNum) else { result.append(num); continue }
    let r = num + secNum
    if (num > 0 && r >= 0) || (num < 0 && r <= 0) {
        result.append(-secNum)
        arr.remove(at: index)
        arr.insert(r, at: 0)
    } else {
        result.append(num)
        arr[index] = r
    }
}
print(result)

#16

Верно :slight_smile: ФП желательно, но необязательно.


#17

так я в итоге условие понял? Тесты прогнал по задаче?


#18

Нет, я выше написал, что результат должен получится [1, 2, 3, 1, -3, 4].

Поняли похоже только haymob и Higderin)


#19

Блт, муд%цкая задача. :slight_smile: Так. Давай пошагово. Почему 3 превращается в единицу? И почему 4 превращается в 2 ?


#20

Можно как-то с логикой описать что и по какому принципу раскладывается. Либо какое-то условие общее для всех разложений.
К примеру почему 4 это 3 и 1, а не 2 и 2.
Придется теперь уже вам отдуваться, что бы нормально все объяснить, т.к. заинтересовали.