Führen Sie die Vereinigung der Intervalle anhand einer Liste von Intervallen durch und reduzieren Sie die Überlappungen. Das heißt, überlappende Teile werden reduziert. ( [a, b] U [c, d] = [a, d]
if b > c
) Angenommen alle a <b in allen Intervallen [a, b]
. Implementieren als Funktion einer Liste von Eingabeintervallen -> Liste von Ausgabeintervallen. Kürzester Code gewinnt. Sie können keine vorhandenen Bibliotheken verwenden.
Klarstellungen:
- Offene und geschlossene Intervalle werden nicht unterschieden.
- Intervalle für reelle Zahlen, keine ganzen Zahlen. (
[2, 3], [4, 5] -> [2, 3], [4, 5]
) - Ausgabeintervalle müssen nicht sortiert werden
- Die Reihenfolge der Eingaben spielt keine Rolle
- Illegale Eingaben sind nur
[a, b]
wob >= a
, es hat nichts mit der Reihenfolge der Eingabeintervalle und der Anzahl der Eingabeintervalle zu tun. - Bei undefiniertem Verhalten muss keine Fehlermeldung angezeigt werden
Beispiele (mit Zahlenlinien)
[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)
Antworten:
GolfScript, 32
[[2 4] [3 5]]
Vollständiges Testprogramm:
Beispielaufruf:
quelle
Haskell
Ich denke, es ist viel zu ausführlich für Haskell. Vielen Dank an Hoa Long Tam für seine Sortierfunktion.
In Haskell wird ein Intervall von
a
bisb
mit bezeichnet[a..b]
. Meine Notation ist der mathematischen Notation sehr ähnlich. Benutze es so:quelle
Ok, hier ist mein 250-Zeichen-Knaller.
Die Funktion nimmt ein int-Array und bearbeitet es in situ. Das Array wird mit einer 0 abgeschlossen und die Intervalle können in beliebiger Reihenfolge angegeben werden.
Beispielausgabe:
Beispielprogramm:
quelle
perform the union of them
sollte dazu führen(1,11) (13,18)
, nicht wahr?([a, b] U [c, d] = [a, d] if b > c)
. Und auch (1, 5) (5, 6) würde nicht kombiniert werden.and
Reduzieren Sie die Überlappungen - nichtif they overlap
. OK - das Folgendethat means ...
zeigt wieder in die entgegengesetzte Richtung.Python, 100 Zeichen
erzeugt
Übernimmt alle Endpunkte der Intervalle, entfernt alle, die sich ausschließlich innerhalb eines anderen Intervalls befinden, vereinheitlicht und sortiert sie und verbindet sie.
quelle
Haskell, 55 Zeichen
Wenn die Eingabe unsortiert ist, dann 88 Zeichen:
Testläufe:
Ich gehe davon aus, dass "keine vorhandenen Bibliotheken verwenden können" das Importieren
List
und Aufrufen ausschließtsort
. Wenn das legal wäre, wäre die unsortierte Version nur 71 Zeichen.quelle
List
aus paketHaskell98
wäre meiner meinung nach ausreichend.Scala, 272 Zeichen
Verwendung:
Erstellt ein Array und fügt für jeden Intervallstart eine 1 und für jedes Intervallende eine -1 ein. Führen Sie dann die Schritte durch, indem Sie die Werte zu einem Zähler hinzufügen und jedes Mal einen Start ausgeben, wenn der Zähler von 0 auf 1 wechselt, und ein Ende, wenn er von 1 auf 0 wechselt. Wahrscheinlich unnötig kompliziert.
Ausgabe:
quelle
Perl
(146)(92)(90)Golf bis zu 90 Zeichen, kreativ mit der Regex-Engine
Anwendungsbeispiel:
Lassen Sie uns diesen Code ein wenig erklären.
Diese Subroutine empfängt ein Array von Arrayrefs, von denen jedes auf ein Array verweist, das zwei Elemente enthält, nämlich Anfang und Ende des Intervalls:
([2, 4], [3, 6], [8, 9])
für jedes aref generieren wir eine reihe von elementen vom ersten bis zum letzten
($_->[0] .. $_->[1])
. Dann verwenden wir map, um Elemente solcher Indizes in @h auf 1 zu setzen.nach diesem,
@h
wird entweder diejenigen enthalten (Intervalle) oder undefs, dargestellt unten als Bindestriche für Klarheit.Als Nächstes erstellen wir einen String aus @h und fügen 0 hinzu, um Undefs durch etwas Nützlicheres zu ersetzen (Undef + 0 = 0).
$w .= $_+0 for @h;
$ w enthält
011111011
jetzt.Es ist Zeit, die Regex-Engine ein wenig zu missbrauchen.
push @r, ($-[0], $+[0]-1) while $w=~/1+/g;
Nach erfolgreichen Übereinstimmungen enthalten die Arrays @ - und @ + jeweils die Position von Anfang und Ende jeder Übereinstimmung. Das 0te Element wird für das gesamte Match verwendet, erstens für 1 $, zweitens für 2 $ und so weiter.
$+[0]
enthält tatsächlich die Position des ersten nicht passenden Zeichens, also müssen wir eines subtrahieren.@r
enthält(2, 6, 8, 9)
jetzt.@r
um das U-Boot zurückzubringen
@r
.quelle
[2,3],[4,5]
Erträge2 5
Scala
305279 Zeichen ohne Aufruf:Aufruf:
quelle
Brachylog , 12 Bytes
Probieren Sie es online!
Eine erfreulich deklarative Lösung, bei der die Eingabe als Liste von Listen über die Eingabevariable und die Ausgabe einer Liste von Listen über die Ausgabevariable erfolgt.
quelle
Clojure, 138 Bytes
Dies verkürzt sich auf 119 Bytes, wenn die Eingabe flexibler ist, nämlich eine Liste von Intervallstartpunkten UND eine Liste von Intervallendpunkten:
Es muss einen besseren Weg geben.
quelle
Japt , 18 Bytes
Das fühlt sich viel zu lang an. E / A als sortierte, 2D-Anordnung von Intervallen.
Versuch es
quelle
Perl 5
-MList::Util=max -n
, 89 BytesProbieren Sie es online!
quelle