Listę liczb całkowitych dodatnich można zwizualizować jako kwantowane pasmo górskie, gdzie każda pozycja listy reprezentuje wysokość jednego pionowego odcinka gór.
Na przykład lista
1, 2, 2, 3, 4, 3, 5, 3, 2, 1, 2, 3, 3, 3, 2, 2, 1, 3
może stać się zasięgiem
x
x x
xxxxx xxx x
xxxxxxxx xxxxxx x
xxxxxxxxxxxxxxxxxx
(Mniej poetyccy ludzie mogą nazwać to wykresem słupkowym, ale ja dygresję).
Pytanie w tym wyzwaniu brzmi: ile szczytów znajduje się w górach na dowolnej liście? Zasadniczo ile lokalnych maksimów znajduje się na liście?
Szczyt jest zdefiniowany jako ciągły odcinek jednej lub więcej kolumn pasma górskiego o równej wysokości, przy czym kolumny znajdujące się bezpośrednio po lewej i prawej stronie mają niższą wysokość.
Łatwo jest wizualnie stwierdzić, że przykład ma cztery szczyty w tych nawiasach:
1, 2, 2, 3, (4), 3, (5), 3, 2, 1, 2, (3, 3, 3), 2, 2, 1, (3)
Zwróć uwagę, jak (3, 3, 3)
sekcja plateau liczy się jako szczyt, ponieważ jest to ciągły zestaw kolumn o równej wysokości, wyższej niż sąsiednie kolumny.
Ostatni (3)
liczy się również jako szczyt, ponieważ dla celów tego wyzwania zdefiniujemy lewego sąsiada z lewej kolumny i prawego sąsiada z prawej kolumny, aby oba miały wysokość zero.
Oznacza to, że lista z tylko jedna wartość, na przykład 1, 1, 1
, może być interpretowany jako 0, 1, 1, 1, 0
, a tym samym ma jeden pik, a nie żaden: 0, (1, 1, 1), 0
.
Jedyną listą z zerowymi pikami jest pusta lista.
Wyzwanie
Napisz funkcję lub program, który pobierze dowolną listę liczb całkowitych dodatnich i wypisze lub zwróci liczbę pików w odpowiednim paśmie górskim.
Najkrótszy kod w bajtach wygrywa. Tiebreaker jest wcześniejszym postem.
Przypadki testowe
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
źródło
Odpowiedzi:
Pyth, 18 bajtów
Oparty na @ PeterTaylor's powtórzył więcej niż rozwiązanie, ale z niespodzianką.
++ZQZ
: Dodaj zera po obu stronach.eMr ... 8
: Usuń powtórzenia.u ... 2 ...
: Zastosuj dwukrotnie:>VGTG
: Zamapuj każdą parę liczb w kolejności malejącej._
: I odwrotnie.Wartość 1 na wyjściu odpowiada
1, 0
wcześniejszemu etapowi, który odpowiadaa < b > c
na wejściu z powodu odwrócenia.s
: Suma (i wydrukuj)źródło
CJam (
32 26 2421 bajtów)Oczekiwane dane wejściowe to liczby rozdzielone spacjami.
Demo online ; pełny pakiet testowy (oczekiwany wynik to
1
przypadek testowy).Dzięki Martinowi za poinformowanie mnie, że obecna wersja CJam ulepsza jednego z używanych operatorów, oszczędzając 2 znaki; i dla dalszego oszczędzania 3 znaków.
Sekcja
Dwie fazy: deduplikuj, a następnie określ lokalne maksima w każdym zestawie trzech.
źródło
JavaScript (ES6),
5451 bajtówWyjaśnienie
Przyjmuje tablicę liczb
Test
Pokaż fragment kodu
źródło
Pyth,
2523 bajtówWyjaśnienie:
źródło
0q~0]{2ew::-:g0-}2*1-,
za 22.Julia, 66
Pad, różnicować:
y=diff([0;x;0])
.Zignoruj płaskowyże:
y=y[y.!=0]
.Liczyć
+
się-
przejść przez zero:sum((y[1:end-1].>0)&(y[2:end].<0))
.źródło
MATLAB,
2927 bajtówAnonimowa funkcja znajdująca szczyty w danych i zliczająca ich liczbę. Wartość 0 jest dodawana i dodawana do danych, aby zapewnić wykrywanie pików na samych krawędziach zgodnie z pytaniem.
Będzie to również działać z Octave . Możesz spróbować online tutaj . Po prostu wklej powyższy kod do wiersza poleceń, a następnie uruchom go za pomocą
ans([1,2,1,3,4,5,6,1])
(lub dowolnego innego wejścia).Ponieważ liczby są zawsze + ve, możemy założyć, że są większe od zera, więc możemy zapisać 2 bajty, używając
nnz
zamiastnumel
.źródło
Python 3, 75 bajtów
To jest mój pierwszy codegolf, więc mogą być na nim miejsca, zwłaszcza
d=((n==p)&d)+(n>p)
część. Działa jednak na wszystkich przypadkach testowychźródło
Mathematica,
42363332 bajtyPodziękowania dla Martina Büttnera za oszczędność 1 bajtu.
PeakDetect
robi prawie wszystko!Przypadki testowe:
źródło
CJam,
2726 bajtówWykorzystuje kodowanie długości przebiegu do usunięcia duplikatów. Następnie sprawdzamy dla każdej trojaczki, czy środkowa jest największą liczbą.
Wypróbuj tutaj! Przechodzi zestaw testów Petera Taylora .
źródło
MATL , 22 bajty
Używa bieżącej wersji języka / kompilatora.
Przykład
Wyjaśnienie
źródło
Mathematica,
55393635 bajtówTeraz działa na wszystkich przypadkach testowych!
źródło
Last/@
->#&@@@
Retina ,
3331 bajtówDzięki Neil za zaoszczędzenie 2 bajtów.
Wypróbuj online!
Staje wejścia jako rozdzielonych przecinkami jednoargumentowy listy.
źródło
\b(1+)(?<!\1 \1)( \1)*\b(?! \1)
wydaje się oszczędzać 2 bajty?JavaScript ES6,
9694 bajtówZasada: zwinąć płaskowyże w pojedyncze szczyty, znajdź typy, które są zdefiniowane jako wyższe niż zarówno następny, jak i poprzedni element.
Pobiera dane wejściowe jako tablicę.
Próbny:
źródło
ES6,
5048 bajtówZaoszczędzono 2 bajty dzięki @ user81655.
Nie golfowany:
źródło
.map()|
wcześniej.)MATL, 23
Ponieważ musimy używać esolangów opartych na stosie, aby być konkurencyjnym, ponownie wdrożyłem swoje rozwiązanie Julia w MATL.
Naciśnij
0
, wprowadź0
i połącz dwa razy.0i0hh
=>x = [0, input(''), 0]
Rozróżniać.
d
=>x = diff(x)
Duplikuj
t
, przekonwertuj jeden na wartość logiczną i użyj go do zindeksowania drugiego.tg)
=>x=x(x!=0)
Powtórz ponownie.
t
Po pierwsze:
[1,G])0>
=>y1 = x(1:end-1)>0
Wymieniać się.
w
Po drugie:
[2,0])0<
=>y2 = x(2:end)<0
Logika i policz prawdziwe wartości.
*s
=>sum(y1 & y2)
źródło
[1,G]
->5L
oszczędza 3 bajty.[2,0]
->6L
zapisuje 3 bajtyand
(&
) z MATL (i to samo dlaor
). Zawsze można go zastąpić*o
, a często tylko*
, tak jak w tym przypadku. Co myślisz? W ten sposób znaki&
i|
mogą być używane do innych funkcji w przyszłości.Japt, 19 bajtów
To było łatwiejsze niż myślałem, ale początek jest nieco marnotrawiony z powodu błędu.
Wypróbuj online!
Jak to działa
Wersja niekonkurencyjna, 15 bajtów
Wcześniej dzisiaj dodałem
è
funkcję, która przypomina,f
ale zwraca liczbę dopasowań, a nie same dopasowania. Naprawiłem również błąd, w którymArray.u
zwracała długość tablicy zamiast samej tablicy.Wypróbuj online!
źródło
05AB1E , 9 bajtów
Wypróbuj online!
Wyjaśnienie:
źródło
Galaretka , 27 bajtów
Wypróbuj online!
źródło
GolfScript, 35
Przetestuj online
Zasadniczo usuwa duplikaty, dodaje zero na obu końcach i sprawdza, ile trójek ma maksimum w środku.
źródło
Java 8, 141 bajtów
Prawdopodobnie można grać w golfa, stosując inne podejście lub tablicę jako dane wejściowe zamiast listy.
Wyjaśnienie:
Wypróbuj tutaj.
źródło