Betrachten Sie eine eindimensionale Folge von Zahlen innerhalb eines festgelegten Bereichs, d. H
[1, 2, 4, 6, 8, 0, 2, 7, 3] in range [0, 10⟩
Der immer größer werdende Graph * ** ist eine Linie, die alle Punkte in dieser Sequenz von links nach rechts verbindet und immer nach oben zeigt oder eben bleibt. Bei Bedarf wird die Linie von oben nach unten gewickelt und steigt von dort weiter an, um den nächsten Punkt zu erreichen.
Das Ziel dieser Herausforderung ist es, die Sequenz in verschiedene Teilsequenzen zu unterteilen, die alle nicht abnehmen, sodass sie, wenn sie zusammen mit einer begrenzten vertikalen Achse geplottet werden, einen immer größer werdenden Graphen bilden. Dies erfolgt durch Hinzufügen eines Punkts am Ende einer Teilsequenz und am Anfang der nächsten Teilsequenz, sodass der Winkel der Linie, die die obere Grenze kreuzt, mit der Linie, die die untere Grenze kreuzt, und den beiden Kreuzungspunkten übereinstimmt haben die gleiche horizontale Koordinate. Das obige Beispiel würde die folgende Ausgabe ergeben:
[1, 2, 4, 6, 8, 10]
[-2, 0, 2, 7, 13]
[-3, 3]
Und das entsprechende Diagramm sieht folgendermaßen aus: Und zur besseren Übersicht mit erweiterter Achse: Die erforderliche Ausgabe ist eine Liste von Teilsequenzen, die die Teile des immer größer werdenden Diagramms bilden. Das Erstellen eines Plots ist nicht erforderlich, bringt Ihnen jedoch Bonuspunkte;). Die Ausgabe muss die Teilsequenzen in irgendeiner Weise klar trennen.
Anmerkungen
- Der Bereich wird immer Null als linke (inklusive) Grenze haben, und die rechte Grenze wird eine ganze Zahl N sein.
- Die Sequenz enthält niemals Werte, die nicht innerhalb des Bereichs liegen.
- Die erste Teilsequenz hat am Anfang keinen zusätzlichen Punkt.
- Die letzte Untersequenz hat am Ende keinen zusätzlichen Punkt.
- Es ist nicht erforderlich, die Startindizes anzugeben, die zum Zeichnen der Teilsequenzen erforderlich wären.
Testfälle
Input: [0, 2, 4, 6, 1, 3, 5, 0], 7
Output: [0, 2, 4, 6, 8], [-1, 1, 3, 5, 7], [-2, 0]
Input: [1, 1, 2, 3, 5, 8, 3, 1], 10
Output: [1, 1, 2, 3, 5, 8, 13],[-2, 3, 11],[-7, 1]
Input: [5, 4, 3, 2, 1], 10
Output: [5, 14],[-5, 4, 13],[-6, 3, 12],[-7, 2, 11],[-8, 1]
Input: [0, 1, 4, 9, 16, 15, 0], 17
Output: [0, 1, 4, 9, 16, 32], [-1, 15, 17], [-2, 0]
Wertung
Dies ist Code-Golf, der kürzeste Code in Bytes gewinnt.
* Nicht der eigentliche Jargon ** Eigentlich sollte man Ever Non-Decreasing Graph nennen, wie @ngm betont hat, aber das klingt weniger beeindruckend.
Antworten:
Gelee , 20 Bytes
Probieren Sie es online!
Teilfolgen werden durch geteilt
0.5
.quelle
R ,
179158151 BytesProbieren Sie es online!
Bearbeiten: Code ist jetzt eine Funktion und nimmt Eingaben entgegen. (Dank an Giuseppe, user202729 und JayCe für den ruhigen Hinweis)
Edit: -21 Bytes, vorgeschlagen von Giuseppe.
Bearbeiten: -7 Bytes durch Entfernen
d=NULL;
.quelle
s[p+1]-((m+s[p+1])-s[p])
vereinfacht sichs[p]-m
, und Sie haben,d=c(c(...))
wo nurd=c(...)
erforderlich ist. Ich vermute sehr, dass es einen golferischeren Weg gibt, aber dies ist immer noch eine schöne Antwort.d
noch initialisiert werden?Python 2 , 60 Bytes
Die Eingabe ist N, gefolgt von allen Punkten als einzelne Argumente. Folgen in der Ausgabe werden durch getrennt
0.5
.Probieren Sie es online!
Python 2 ,
927768 BytesFolgen werden durch getrennt
[...]
.Probieren Sie es online!
quelle
Sauber ,
279269258 BytesProbieren Sie es online!
quelle
JavaScript (Node.js) ,
10482 ByteProbieren Sie es online! Port von @ovss Python-Antwort.
quelle
Haskell,
828180 BytesDies ist ein Port meiner Clean-Antwort .
Probieren Sie es online!
-1, -1 dank Laikoni
quelle
f
lokal definieren können, ohne Klammern um das:
Muster, wie inlet x<r@(a:_):s|...
.Sauber , 92 Bytes
Probieren Sie es online!
Das Operatorargument zu
foldr
ist ein Lambda mit Wache; Es wird analysiert als:Ich habe das nach Haskell portiert .
quelle
Sauber ,
11010910410097 BytesProbieren Sie es online!
-1 Byte dank Keelan
quelle
Haskell , 82 Bytes
Probieren Sie es online! Port meiner Clean Antwort .
Alternativ auch 82 Bytes
Probieren Sie es online!
quelle
JavaScript (Node.js) , 98 Byte
Probieren Sie es online!Dies ist viel länger als die andere Antwort von JS, aber es wird ein anderer Ansatz verwendet.
Ungolfed und vereinfachte Erklärung
quelle
JavaScript (Node.js) , 48 Byte, Arrays getrennt durch
,,
Probieren Sie es online!
JavaScript (Node.js) , 50 Byte, Arrays getrennt durch
|
Probieren Sie es online!
quelle