Biorąc pod uwagę listę interwałów, wykonaj ich połączenie i zmniejsz nakładanie się. Oznacza to, że nakładające się części są zmniejszone. ( [a, b] U [c, d] = [a, d]
if b > c
) Zakładając wszystkie a <b we wszystkich przedziałach [a, b]
. Implementuj jako funkcję listy interwałów wejściowych -> lista interwałów wyjściowych. Najkrótszy kod wygrywa. Nie możesz używać żadnych istniejących bibliotek.
Wyjaśnienia:
- Przedziały otwarte i zamknięte nie są rozróżniane.
- Przedziały dla liczb rzeczywistych, a nie liczb całkowitych. (
[2, 3], [4, 5] -> [2, 3], [4, 5]
) - Nie ma potrzeby sortowania przedziałów wyjściowych
- Kolejność, jeśli dane wejściowe nie mają znaczenia
- Wejścia są nielegalne tylko
[a, b]
gdzieb >= a
, to nie ma nic wspólnego z porządkiem odstępach wejściowych i liczby przedziałów wejściowych. - Nie musisz wyświetlać komunikatu o błędzie dotyczącym niezdefiniowanych zachowań
Przykłady (z liniami liczbowymi)
[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)
Odpowiedzi:
GolfScript, 32
[[2 4] [3 5]]
Pełny program testowy:
Przykładowe wywołanie:
źródło
Haskell (103)
Myślę, że dla Haskella jest to zbyt szczegółowe. Dzięki Hoa Long Tam za jego funkcję sortowania.
W Haskell interwał od
a
dob
jest oznaczony przez[a..b]
. Moja notacja jest bardzo podobna do notacji matematycznej. Użyj tego w ten sposób:źródło
Ok, oto mój 250 znakowy crack.
Funkcja przyjmuje tablicę int i działa na niej in-situ. Tablica jest zakończona cyfrą 0, a interwały mogą być podawane w dowolnej kolejności.
Przykładowe dane wyjściowe:
Przykładowy program:
źródło
perform the union of them
powinno prowadzić do(1,11) (13,18)
, prawda?([a, b] U [c, d] = [a, d] if b > c)
. I pod tym względem nawet (1, 5) (5, 6) nie zostaną połączone.and
zmniejsz nakładanie się - nieif they overlap
. OK - kolejnethat means ...
punkty w przeciwnym kierunku.Python, 100 znaków
generuje
Pobiera wszystkie punkty końcowe interwałów, usuwa te, które znajdują się ściśle w innym interwale, ujednolica je i sortuje oraz łączy w pary.
źródło
Haskell, 55 znaków
Jeśli dane wejściowe nie są posortowane, to 88 znaków:
Przebiegi testowe:
Zakładam, że „nie można użyć żadnych istniejących bibliotek” wyklucza importowanie
List
i wywoływaniesort
. Gdyby to było legalne, nieposortowana wersja miałaby tylko 71 znaków.źródło
List
z paczkiHaskell98
IMHO.Scala, 272 znaków
Stosowanie:
Tworzy tablicę i wstawia 1 dla każdego początku interwału i -1 dla każdego końca interwału. Następnie przechodzi przez tablicę, dodając wartości do licznika, generując początek za każdym razem, gdy licznik przeskakuje od 0 do 1, a koniec, gdy przeskakuje od 1 do 0. Prawdopodobnie niepotrzebnie skomplikowane.
Wynik:
źródło
Perl
(146)(92)(90)grał w golfa do 90 znaków, twórczo wykorzystując silnik regex
przykład użycia:
wyjaśnijmy trochę ten kod.
ten podprogram odbiera tablicę referencji tablic, z których każda wskazuje na tablicę zawierającą dwa elementy, początek i koniec przedziału:
([2, 4], [3, 6], [8, 9])
dla każdego aref generujemy tablicę elementów od pierwszego do ostatniego
($_->[0] .. $_->[1])
. następnie używamy map do ustawienia elementów takich indeksów w @h na 1.po tym
@h
będzie zawierać albo (dla interwałów), albo undefs, przedstawione poniżej jako łączniki dla przejrzystości.następnie budujemy ciąg z @h, dodając 0, aby zastąpić undefs czymś bardziej użytecznym (undef + 0 = 0).
$w .= $_+0 for @h;
$ w zawiera
011111011
teraz.czas trochę nadużyć silnik wyrażeń regularnych.
push @r, ($-[0], $+[0]-1) while $w=~/1+/g;
po udanych dopasowaniach tablice @ - i @ + zawierają odpowiednio pozycję początku i końca każdego dopasowania; 0-ty element jest używany przez cały mecz, pierwszy za 1 $, drugi za 2 $ i tak dalej.
$+[0]
faktycznie zawiera pozycję pierwszego niepasującego znaku, więc musimy go odjąć.@r
zawiera(2, 6, 8, 9)
teraz.@r
aby zwrócić sub
@r
.źródło
[2,3],[4,5]
zbiorów liczb rzeczywistych2 5
Scala
305279 znaków bez wywołania:wezwanie:
źródło
Brachylog , 12 bajtów
Wypróbuj online!
Cudownie deklaratywne rozwiązanie, przyjmując dane wejściowe jako listę list przez zmienną wejściową i wypisując listę list przez zmienną wyjściową.
źródło
Clojure, 138 bajtów
Skraca to do 119 bajtów, jeśli dane wejściowe są bardziej elastyczne, a mianowicie lista punktów początkowych interwałów ORAZ lista punktów końcowych interwałów:
Musi być lepszy sposób.
źródło
Japt , 18 bajtów
To wydaje się zbyt długie. I / O jako posortowana tablica interwałów 2D.
Spróbuj
źródło
Perl 5
-MList::Util=max -n
, 89 bajtówWypróbuj online!
źródło