Как получить кусок кортежа (час, минута) - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть проблема, которую я не смог решить.Я использую https://github.com/kmanley/golang-tuple для создания кортежей.

У меня есть список минут:

minutes := int{0, 30} // Minutes are 0 and 30

и четыре параметра: start, startBreak, stop, stopBreak:

start := tuple.NewTupleFromItems(9, 30) // It represents "9:30"
startBreak := tuple.NewTupleFromItems(12, 0) // It represents "12:00"
stop := tuple.NewTupleFromItems(21, 0) // It represents "21:00"
stopBreak := tuple.NewTupleFromItems(14, 30) // It represents "14:30"

Я хочу получить срез кортежей (hour, minutes), используя все минуты в срезе minutes, и они не должны быть включены в диапазон startBreak-stopBreak (может быть равно startBreak или stopBreak, поэтому диапазон станет 12:30, 13:00, 13:30, 14:00) и stop-start (может быть равно start и stop, поэтому диапазон станет 21:30, 22:00, 22:30, ..., 8:30, 9:00).

Например, при использовании этих четырех параметров конечный результат будет:

9:30, 10:00, 10:30, 11:00, 11:30, 12:00, 14:30, 15:00, 15:30, 16:00, 16:30, 17:00, 17:30, 18:00, 18:30, 19:00, 19:30, 20:00, 20:30, 21:00

1 Ответ

0 голосов
/ 18 ноября 2018

Вот минимальный код, который демонстрирует это, я не ставил никакой проверки данных.

func periods(minutes, start, startBreak, stopBreak, stop *tuple.Tuple) (out []tuple.Tuple) {

    // next() moves current to the next minute interval
    i := 0
    curr := tuple.NewTupleFromItems(start.Get(0), minutes.Get(0))
    next := func() {
        i = (i + 1) % minutes.Len()
        curr.Set(1, minutes.Get(i))
        if i == 0 {
            curr.Set(0, curr.Get(0).(int)+1)
        }
    }

    for ; curr.Le(stop); next() {
        if (curr.Ge(start) && curr.Le(startBreak)) || (curr.Ge(stopBreak) && curr.Le(stop)) {
            out = append(out, *curr.Copy())
        }
    }

    return out
}

Детская площадка

...