У меня есть три списка кортежей, каждый из которых содержит (startpos, endpos, value).
То, что я хочу сделать, это объединить их в один список кортежей (startpos, endpos, values []), но следуя правилу, которое мне проще нарисовать, чем написать:
//third [---------] [------------]
//second [-------------] [---------------------------]
//first [-----------------------------] [--------------]
//(pos) 0123456789|123456789|123456789|123456789|123456789|123456789|123456789
//result [--1-][--2-][---3---][---1----] [---2--][---3--]
(Числа в результате представляют ожидаемую длину списка значений [] для каждого результирующего элемента)
По сути, я держу только «верхний» элемент там, где он перекрывает «нижний» элемент, и я делю на «однородные» элементы.
Позиции можно рассматривать как имеющие тип int
. Как видно из результата, сегменты «split» начинаются и заканчиваются не в одной и той же позиции, а в pos-1 или pos + 1. Порядок значений не важен, если он определен.
Пример данных (на основе приведенного выше примера):
let third = [(12,22,3.1);(43,56,3.2)]
let second = [(6,20,2.1);(35,63,2.2)]
let first = [(0,30,1.1);(35,50,1.2)]
let after = [
(0,5,[1.1]);
(6,11,[1.1;2.1]);
(12,20,[1.1;2.1;3.1]);
(21,30,[1.1]);
(35,42,[1.2;2.2]);
(43,50,[1.2;2.2;3.2])
]
Прямо сейчас мне трудно думать об этом функционально, все, что приходит на ум, необходимо. Может быть, это неизбежно в этом случае, но если у кого-то есть идеи ...
ОБНОВЛЕНИЕ На самом деле, если мы обобщили регистр ввода, чтобы он уже имел тип (int*int*List<float>
), мы могли бы просто обработать регистр двух списков ввода, а затем сложить это.
PS: Это не домашняя работа или код-гольф, я просто несколько стерилизовал данные.