Ihre Aufgabe hier ist einfach:
Suchen Sie anhand einer Liste von Ganzzahlensätzen die Mengenvereinigung. Mit anderen Worten, finden Sie die kürzeste Liste von Ganzzahlensätzen, die alle Elemente in der ursprünglichen Liste von Sätzen enthalten (aber keine anderen Elemente). Beispielsweise:
[1,5] and [3,9] becomes [1,9] as it contains all of the elements in both [1,5] and [3,9]
[1,3] and [5,9] stays as [1,3] and [5,9], because you don't want to include 4
Mengen werden unter Verwendung der Bereichsnotation notiert: [1,4]
bedeutet die ganzen Zahlen 1,2,3,4
. Mengen können auch unbegrenzt sein: [3,]
bedeutet alle ganzen Zahlen >= 3
und [,-1]
bedeutet alle ganzen Zahlen <= -1
. Es ist garantiert, dass das erste Element des Bereichs nicht größer als das zweite ist.
Sie können festlegen, dass Mengen in Zeichenfolgennotation verwendet werden sollen, oder Sie können Tupel mit zwei Elementen verwenden, wobei als "unendlicher" Wert eine nicht ganzzahlige Konstante verwendet wird. Sie können zwei unterschiedliche Konstanten verwenden, um die unendliche Obergrenze und die unendliche Untergrenze darzustellen. In Javascript können Sie beispielsweise [3,{}]
alle Ganzzahlen notieren >= 3
, sofern Sie diese {}
in allen Testfällen konsistent verwendet haben.
Testfälle:
[1,3] => [1,3]
[1,] => [1,]
[,9] => [,9]
[,] => [,]
[1,3],[4,9] => [1,9]
[1,5],[8,9] => [1,5],[8,9]
[1,5],[1,5] => [1,5]
[1,5],[3,7] => [1,7]
[-10,7],[1,5] => [-10,7]
[1,1],[2,2],[3,3] => [1,3]
[3,7],[1,5] => [1,7]
[1,4],[8,] => [1,4],[8,]
[1,4],[-1,] => [-1,]
[1,4],[,5] => [,5]
[1,4],[,-10] => [1,4],[,-10]
[1,4],[,] => [,]
[1,4],[3,7],[8,9],[11,20] => [1,9],[11,20]
Das ist Code-Golf , also machen Sie Ihre Antwort so kurz wie möglich!
quelle
Infinity
stattdessen verwenden{}
?[1.0, 3.0]
statt nehmen[1, 3]
?[1.0, 3.0], [4.0, 5.0]
sollte noch werden[1.0, 5.0]
Infinity
und-Infinity
als Eingabe akzeptieren kann, darf sie stattdessen-999999
und999999
(oder sogar größer / kleiner)?Antworten:
R +
intervals
,90 8781 BytesProbieren Sie es online!
Die Eingabe ist eine Liste von Intervallen.
-Inf
undInf
sind R eingebaut für minus / plus unendlich. Die Ausgabe ist eine Matrix von Intervallspalten.Normalerweise kein Fan von Nicht-Standard-Bibliotheken, aber dieses hat Spaß gemacht. TIO ist nicht
intervals
installiert. Sie können es auf Ihrer eigenen Installation oder unter https://rdrr.io/snippets/ ausprobieren.Das
intervals
Paket unterstützt Real- und Integer (type = "Z"
) -Intervalle und diereduce
Funktion ist für die jeweiligen Anforderungen integriert, die Ausgabe scheint jedoch standardmäßig Intervalle zu öffnen. Sie wird also benötigt, um das gewünschte Ergebnis zu erzielen.close_intervals
+c(1,-1)
Die alte Version enthielt Beispiele in einer Liste von Listen, die nützlich sein könnten. Ich habe den Link hier gelassen.
quelle
function(...)close_intervals(reduce(Intervals(rbind(...),type="Z")))
. Oder noch besser, Sie können mit op prüfen, ob sie eine Matrix als Eingabe zulassen.reduce
undReduce
dort zu haben .f=function(...)t(reduce(Intervals(rbind(...),type="Z")))+c(1,-1)
?JavaScript (ES6), 103 Byte
1 Byte dank @Shaggy
gespeichert 1 Byte dank @KevinCruijssen gespeichert
Erwartet
+/-Infinity
unendliche Werte.Probieren Sie es online!
Wie?
Wir sortieren zuerst die Intervalle nach ihrer Untergrenze, von der niedrigsten zur höchsten. Obergrenzen werden ignoriert.
Kommentiert
quelle
p<=M+1
kann seinp<M+2
?Python 2 ,
118113112111106105104101 BytesDank Mr.Xcoder ein Byte gespart, dank Jonathan Frech ein Byte und dank Dead Possum drei Byte.
Probieren Sie es online!
quelle
(b,c),
Speichert ein Byte.g
dass Ihre Funktionf
nicht wiederverwendbar und daher ungültig ist?return
wird auchprint
für ein anderes Byte ausführen.Ruby ,
8976 BytesProbieren Sie es online!
Sortieren Sie das Array und glätten Sie es, indem Sie alle Bereiche an den ersten anhängen: Wenn sich ein Bereich mit dem vorherigen überschneidet, verwerfen Sie 2 der letzten 3 Elemente (wobei Sie nur das Maximum beibehalten).
Machen Sie am Ende alles glatt.
quelle
Pascal (FPC) ,
367362357 BytesProbieren Sie es online!
Eine Prozedur, die ein dynamisches Array benötigt von Datensätzen verwendet, das aus zwei Bereichsgrenzen besteht, das Array an der richtigen Stelle ändert und es dann in die Standardausgabe schreibt, einen Bereich pro Zeile. (Entschuldigen Sie diesen verdrehten Satz.) Verwendet
1/0
für unbegrenzt und-1/0
unbegrenzt.Lesbare Version
Es wäre schön, nur das Array zurück mit korrigierten Anzahl von Elementen, aber die dynamische Array - Funktion übergeben / Prozedur ist nicht dynamisch Array mehr ... Zuerst fand ich diese , dann gibt es diese hervorragende, irrsinnig Erklärung .
Dies ist die beste Datenstruktur, die ich zum Kürzen des Codes finden konnte. Wenn Sie bessere Möglichkeiten haben, können Sie uns gerne einen Vorschlag unterbreiten.
quelle
Wolfram Language (Mathematica) , 57 Byte
Probieren Sie es online!
Nimmt die Eingabe als eine Liste von Listen
{a,b}
das Intervall darstellt[a,b]
, in dema
sein kann ,-Infinity
undb
sein kannInfinity
.Verwendet die eingebaute
IntervalUnion
, aber natürlich müssen wir zuerst die Intervalle in Form massieren. Um vorzutäuschen, dass die Intervalle ganze Zahlen sind, addieren wir 1 zur oberen Grenze (stellen Sie sicher, dass die Vereinigung von[1,3]
und[4,9]
ist[1,9]
). Am Ende machen wir diese Operation rückgängig und wandeln das Ergebnis wieder in eine Liste von Listen um.Es gibt auch einen ganz anderen Ansatz, der mit 73 Bytes einrastet :
Hier ersetzen wir nach dem Sortieren der Intervalle einfach zwei aufeinanderfolgende Intervalle durch ihre Vereinigung, wann immer dies ein einzelnes Intervall wäre, und wiederholen dies, bis keine solche Operation mehr auszuführen ist.
quelle
05AB1E (Legacy) ,
887978 ByteUnendlich wird als Kleinbuchstabe (
'abcdefghijklmnopqrstuvwxyz'
) eingegeben .Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Wichtiger Hinweis: Wenn es ein tatsächliches
Infinity
und gegeben hätte-Infinity
, wären es stattdessen43 bis42 Bytes gewesen . Soetwas über 50%um 30% ist als Abhilfe für den Mangel anInfinity
..Probieren Sie es online aus (mit
Infinity
ersetzt durch9999999999
und-Infinity
ersetzt durch-9999999999
).Kann definitiv erheblich golfen werden. Am Ende war es sehr, sehr hässlich und voller Workarounds. Aber jetzt bin ich nur froh, dass es funktioniert.
Erläuterung:
quelle
C (clang) ,
346342 BytesCompiler - Flags
-DP=printf("(%d,%d)\n"
,-DB=a[i+1]
und-DA=a[i]
Probieren Sie es online!
quelle
i
den globalen Wert von.while(A)i++;
solltefor(i=0;A;)i++;
explizit gesetzt werdeni=0
bevor es in der while-Schleife verwendet wird, anstatt seinen Standardwert0
auf globaler Ebene zu verwenden. Ich weiß nicht mehr warum, aber es ist gemäß den Metaregeln erforderlich. Hauptsächlich, weil Methoden in sich geschlossen / wiederverwendbar sein sollten, ohne dass globale Werte zwischen Methodenaufrufen zurückgesetzt werden müssen, IIRC.i
WertStax ,
4639 BytesFühren Sie es aus und debuggen Sie es
Dieses Programm nimmt Eingaben in der ursprünglich angegebenen Zeichenfolgennotation vor.
quelle