Задав список интервалов, выполните их объединение и уменьшите наложения. Это означает, что перекрывающиеся части уменьшаются. ( [a, b] U [c, d] = [a, d]
если b > c
) Предполагая все a <b во всех интервалах [a, b]
. Реализовать как функцию списка интервалов ввода -> список интервалов вывода. Самый короткий код выигрывает. Вы не можете использовать любые существующие библиотеки.
Разъяснения:
- Открытые и закрытые интервалы не различаются.
- Интервалы для действительных чисел, а не целых чисел. (
[2, 3], [4, 5] -> [2, 3], [4, 5]
) - Нет необходимости сортировать выходные интервалы
- Порядок, если вход не имеет значения
- Недопустимые входные данные есть только
[a, b]
тамb >= a
, где они не имеют ничего общего с порядком входных интервалов и количеством входных интервалов. - Вам не нужно показывать сообщение об ошибке при неопределенном поведении
Примеры (с номерами строк)
[2, 4], [7, 9] --> [2, 4], [7, 9]
234
789
-> 234 789
[1, 5], [2, 10] --> [1, 10] (overlapping [2, 5] reduced)
12345
234567890
-> 1234567890
[2, 4], [3, 6], [8, 9] -> [2, 6], [8, 9]
234
3456
89
-> 23456 89
[4, 2], [2, 2] -> (undefined behavior: against the assumption)
Ответы:
GolfScript, 32
[[2 4] [3 5]]
Полная тестовая программа:
Пример вызова:
источник
Хаскелл (103)
Я думаю, это слишком многословно для Хаскелла. Спасибо Hoa Long Tam за его функцию сортировки.
В Хаскеле интервал от
a
кb
обозначается как[a..b]
. Моя запись очень похожа на математическую запись. Используйте это так:источник
Хорошо, вот мои 250 символов трещины в этом.
Функция принимает массив int и работает с ним in-situ. Массив заканчивается 0, и интервалы могут быть заданы в любом порядке.
Пример вывода:
Пример программы:
источник
perform the union of them
должно привести к(1,11) (13,18)
, не так ли?([a, b] U [c, d] = [a, d] if b > c)
. И в этом отношении, даже (1, 5) (5, 6) не будут объединены.and
Уменьшите перекрытия - нетif they overlap
. ОК - следующиеthat means ...
пункты снова в обратном направлении.Питон, 100 символов
генерирует
Занимает все конечные точки интервалов, удаляет любые, которые находятся строго в другом интервале, унифицирует и сортирует их, и объединяет их в пару.
источник
Haskell, 55 символов
Если ввод не отсортирован, то 88 символов:
Тестовые прогоны:
Я предполагаю, что «не может использовать никакие существующие библиотеки» исключает импорт
List
и вызовsort
. Если бы это было законно, то в несортированной версии было бы всего 71 символ.источник
List
из пакетаHaskell98
.Скала, 272 персонажа
Использование:
Создает массив и вставляет 1 для каждого начала интервала и -1 для каждого конца интервала. Затем пошагово проходит по массиву, добавляя значения в счетчик, выводя начало каждый раз, когда счетчик переходит от 0 до 1, и конец, когда он переходит от 1 до 0. Возможно, излишне сложно.
Выход:
источник
Perl
(146)(92)(90)игра в гольф до 90 символов, творчески с использованием двигателя регулярных выражений
пример использования:
давайте немного объясним этот код.
эта подпрограмма получает массив arrayrefs, каждый из которых указывает на массив, содержащий два элемента, начало и конец интервала:
([2, 4], [3, 6], [8, 9])
для каждого арефа мы генерируем массив элементов от первого до последнего
($_->[0] .. $_->[1])
. затем мы используем map для установки элементов таких индексов в @h в 1.после этого,
@h
будет содержать единицы (для интервалов) или undefs, изображенные ниже как дефисы для ясности.затем мы строим строку из @h, добавляя 0, чтобы заменить undefs чем-то более полезным (undef + 0 = 0).
$w .= $_+0 for @h;
$ w содержит
011111011
сейчас.пришло время немного злоупотребить движком регулярных выражений.
push @r, ($-[0], $+[0]-1) while $w=~/1+/g;
после успешных совпадений массивы @ - и @ + содержат соответственно позицию начала и конца каждого совпадения; 0-й элемент используется для всего совпадения: сначала за 1 доллар, затем за 2 доллара и т. Д.
$+[0]
фактически содержит позицию первого несоответствующего символа, поэтому мы должны вычесть один.@r
содержит(2, 6, 8, 9)
сейчас.@r
сделать суб возврат
@r
.источник
[2,3],[4,5]
доходности реальных чисел2 5
Scala
305279 символов без вызова:вызов:
источник
Брахилог , 12 байт
Попробуйте онлайн!
Восхитительно декларативное решение, принимающее ввод как список списков через входную переменную и выводящее список списков через выходную переменную.
источник
Clojure, 138 байт
Это сокращает до 119 байт, если ввод более гибкий, а именно список начальных точек интервалов И список конечных точек интервалов:
Там должен быть лучший способ.
источник
Japt , 18 байт
Это слишком долго. I / O как отсортировано, 2D массив интервалов.
Попытайся
источник
Perl 5
-MList::Util=max -n
, 89 байтПопробуйте онлайн!
источник