Eine Liste positiver Ganzzahlen kann als quantisierte Bergkette dargestellt werden, wobei jeder Listeneintrag die Höhe eines vertikalen Abschnitts der Berge darstellt.
Zum Beispiel die Liste
1, 2, 2, 3, 4, 3, 5, 3, 2, 1, 2, 3, 3, 3, 2, 2, 1, 3
kann der Bereich werden
x
x x
xxxxx xxx x
xxxxxxxx xxxxxx x
xxxxxxxxxxxxxxxxxx
(Weniger poetische Leute nennen das vielleicht ein Balkendiagramm, aber ich schweife ab.)
Die Frage bei dieser Herausforderung lautet: Wie viele Gipfel gibt es in einer willkürlichen Liste im Gebirgszug? Wie viele lokale Maxima sind im Wesentlichen in der Liste enthalten?
Ein Gipfel ist definiert als zusammenhängender Abschnitt einer oder mehrerer Spalten des Gebirges, die alle gleich hoch sind, wobei die Spalten unmittelbar links und rechts niedriger sind.
Es ist leicht visuell zu erkennen, dass das Beispiel an diesen in Klammern gesetzten Stellen vier Peaks aufweist:
1, 2, 2, 3, (4), 3, (5), 3, 2, 1, 2, (3, 3, 3), 2, 2, 1, (3)
Beachten Sie, dass der (3, 3, 3)
Plateau-Abschnitt als Peak gilt, da es sich um eine zusammenhängende Gruppe von Spalten handelt, deren Höhe höher ist als die der benachbarten Spalten.
Der letzte (3)
zählt ebenfalls als Peak, da wir für die Zwecke dieser Herausforderung den linken Nachbarn der ganz linken Spalte und den rechten Nachbarn der ganz rechten Spalte als Höhe Null definieren.
Dies bedeutet , dass eine Liste mit nur einem Wert, zum Beispiel 1, 1, 1
, kann als interpretiert wird 0, 1, 1, 1, 0
und hat somit einen Peak, nicht none: 0, (1, 1, 1), 0
.
Die einzige Liste mit Nullspitzen ist die leere Liste.
Herausforderung
Schreiben Sie eine Funktion oder ein Programm, das eine beliebige Liste positiver Ganzzahlen aufnimmt und die Anzahl der Gipfel im entsprechenden Gebirgszug ausgibt oder zurückgibt.
Der kürzeste Code in Bytes gewinnt. Tiebreaker ist früherer Beitrag.
Testfälle
Input List -> Output Peak Count
[empty list] -> 0
1, 1, 1 -> 1
1, 2, 2, 3, 4, 3, 5, 3, 2, 1, 2, 3, 3, 3, 2, 2, 1, 3 -> 4
1 -> 1
1, 1 -> 1
2, 2, 2, 2, 2 -> 1
90 -> 1
2, 1, 2 -> 2
5, 2, 5, 2, 5 -> 3
2, 5, 2, 5, 2, 5, 2 -> 3
1, 2, 3, 4 -> 1
1, 2, 3, 4, 1, 2 -> 2
1, 3, 5, 3, 1 -> 1
7, 4, 2, 1, 2, 3, 7 -> 2
7, 4, 2, 1, 2, 1, 2, 3, 7 -> 3
1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 -> 10
1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1 -> 10
2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 2 -> 10
1, 3, 3, 3, 1, 3, 3, 1, 3, 1, 3, 3, 3, 3, 1 -> 4
12, 1, 2, 1, 2, 3, 3, 3, 2, 4, 4, 4, 1, 5, 5, 4, 7, 9 -> 6
87, 356, 37673, 3676, 386, 909, 909, 909, 909, 454, 909, 909 -> 3
87, 356, 37673, 3676, 386, 909, 909, 909, 909, 454, 909, 908, 909 -> 4
quelle
Antworten:
Pyth, 18 Bytes
Basierend auf @ PeterTaylor's mehr als Lösung, aber mit einer Wendung.
++ZQZ
: Fügen Sie auf beiden Seiten Nullen hinzu.eMr ... 8
: Wiederholungen entfernen.u ... 2 ...
: Wende zweimal Folgendes an:>VGTG
: Ordnen Sie jedes Zahlenpaar in absteigender Reihenfolge zu._
: Und umgekehrt.Eine 1 im Ausgang entspricht einer
1, 0
im vorherigen Schritt, diea < b > c
aufgrund der Umkehrung in der Eingabe entspricht .s
: Summe (und print)quelle
CJam (
32 26 2421 Bytes)Erwartete Eingabe sind durch Leerzeichen getrennte Zahlen.
Online-Demo ; vollständige Testsuite (die erwartete Ausgabe gilt für
1
jeden Testfall).Vielen Dank an Martin, der mich darüber informiert hat, dass die aktuelle Version von CJam einen der verwendeten Operatoren verbessert und 2 Zeichen gespart hat. und für eine weitere 3-Zeichen-Ersparnis.
Präparation
Zwei Phasen: deduplizieren, dann lokale Maxima in jeder Gruppe von drei identifizieren.
quelle
JavaScript (ES6),
5451 ByteErläuterung
Nimmt eine Reihe von Zahlen
Prüfung
Code-Snippet anzeigen
quelle
Pyth,
2523 BytesErläuterung:
quelle
0q~0]{2ew::-:g0-}2*1-,
für 22.Julia, 66 Jahre
Pad, unterscheiden:
y=diff([0;x;0])
.Ignorieren Sie die Plateaus:
y=y[y.!=0]
.Zählen
+
auf-
Nulldurchgänge:sum((y[1:end-1].>0)&(y[2:end].<0))
.quelle
MATLAB,
2927 BytesAnonyme Funktion, die die Peaks in den Daten findet und zählt, wie viele es gibt. 0 wird vorangestellt und an die Daten angehängt, um sicherzustellen, dass Peaks ganz am Rand gemäß der Frage erkannt werden.
Dies funktioniert auch mit Octave . Sie können es hier online versuchen . Fügen Sie einfach den obigen Code in die Befehlszeile ein und führen Sie ihn dann mit
ans([1,2,1,3,4,5,6,1])
(oder einer anderen Eingabe) aus.Da die Zahlen immer + ve sind, können wir davon ausgehen, dass sie größer als Null sind. Sie können also 2 Bytes einsparen, indem Sie
nnz
anstelle von verwendennumel
.quelle
Python 3, 75 Bytes
Dies ist mein erster Codegolf, daher kann es einige Stellen geben, an denen man Abstriche machen kann, insbesondere am
d=((n==p)&d)+(n>p)
Teil. Es funktioniert jedoch in allen Testfällenquelle
Mathematica,
42363332 BytesVielen Dank an Martin Büttner für das Speichern von 1 Byte.
PeakDetect
macht einfach fast alles!Testfälle:
quelle
CJam,
2726 BytesVerwendet die Lauflängencodierung, um Duplikate zu entfernen. Danach prüfen wir für jedes Triplett, ob das mittlere die größte Zahl ist.
Probieren Sie es hier aus! Besteht die Testsuite von Peter Taylor .
quelle
MATL , 22 Bytes
Verwendet die aktuelle Version der Sprache / des Compilers.
Beispiel
Erläuterung
quelle
Mathematica,
55393635 BytesFunktioniert jetzt auf allen Testfällen!
quelle
Last/@
->#&@@@
Retina ,
3331 BytesVielen Dank an Neil für das Speichern von 2 Bytes.
Probieren Sie es online!
Übernimmt die Eingabe als durch Kommas getrennte, unäre Liste.
quelle
\b(1+)(?<!\1 \1)( \1)*\b(?! \1)
scheint 2 Bytes zu sparen?JavaScript ES6,
9694 BytesPrinzip: Plateaus in einzelne Peaks zerlegen, die Picks finden, die als höher als die nächsten und vorherigen Elemente definiert sind.
Übernimmt die Eingabe als Array.
Demo:
quelle
ES6,
5048 Bytes2 Bytes dank @ user81655 gespeichert.
Ungolfed:
quelle
.map()|
.)MATL, 23
Da wir Stack-basierte Esolangs verwenden müssen, um wettbewerbsfähig zu sein, habe ich meine Julia- Lösung in MATL neu implementiert.
Zweimal drücken
0
, eingeben0
, verketten.0i0hh
=>x = [0, input(''), 0]
Unterscheiden.
d
=>x = diff(x)
Duplizieren
t
, konvertieren Sie einen in einen Booleschen Wert und indizieren Sie den anderen.tg)
=>x=x(x!=0)
Nochmal duplizieren.
t
Zuerst:
[1,G])0>
=>y1 = x(1:end-1)>0
Austausch.
w
Zweite:
[2,0])0<
=>y2 = x(2:end)<0
Logik und zählen die Wahrheitswerte.
*s
=>sum(y1 & y2)
quelle
[1,G]
->5L
Spart 3 Bytes.[2,0]
->6L
spart 3 Bytesand
(&
) aus MATL (und das gleiche füror
). Es kann wie in diesem Fall immer*o
und oft durch nur ersetzt*
werden. Was denkst du? Auf diese Weise können die Zeichen&
und|
in Zukunft für andere Funktionen verwendet werden.Japt, 19 Bytes
Das war einfacher als ich dachte, aber der Anfang ist aufgrund eines Fehlers etwas verschwenderisch.
Probieren Sie es online!
Wie es funktioniert
Nicht konkurrierende Version, 15 Bytes
Heute habe ich die
è
Funktion hinzugefügt , die wie folgt istf
aber die Anzahl der Übereinstimmungen und nicht die Übereinstimmungen selbst zurückgibt. Ich habe auch einen Fehler behoben, bei demArray.u
die Länge des Arrays und nicht das Array selbst zurückgegeben wurde.Probieren Sie es online!
quelle
05AB1E , 9 Bytes
Probieren Sie es online!
Erläuterung:
quelle
Gelee , 27 Bytes
Probieren Sie es online!
quelle
GolfScript, 35
Online testen
Entfernt im Allgemeinen Duplikate, fügt an beiden Enden eine 0 hinzu und überprüft, wie viele Tripel ein Maximum in der Mitte haben.
quelle
Java 8, 141 Bytes
Kann wahrscheinlich mit einem anderen Ansatz oder einem Array als Eingabe anstelle von List gespielt werden.
Erläuterung:
Probieren Sie es hier aus.
quelle