Napisz funkcję lub program, który pobiera listę i tworzy listę ekstremów lokalnych.
Na liście [x_0, x_1, x_2...]
lokalna skrajność jest x_i
taka, że x_(i-1) < x_i
i x_(i+1) < x_i
lub x_(i-1) > x_i
i x_(i+1) > x_i
. Zauważ, że pierwszym i ostatnim elementem listy nigdy nie mogą być ekstremy lokalne.
Tak dla niektórych przykładów
local_extremes([1, 2, 1]) = [2]
local_extremes([0, 1, 0, 1, 0]) = [1, 0, 1]
local_extremems([]) = []
To jest kod golfowy, więc wygrywa najkrótszy kod!
1 2 2 1
nie należy ich2
też uważać za skrajności? - Wiem, to znacznie utrudniłoby rozwiązanie ...Odpowiedzi:
Mathematica
66 5851Aktualne rozwiązanie
Skrócone dzięki wkładowi Calle.
Partition[#,3,1]
znajduje tróje.(a-b) (b-c)<0
jest prawdziwe wtedy i tylko wtedy gdyb
jest poniżeja
,c
czy powyżeja
,c
. i patrzy na znaki różnic. Miejscowy skrajny powróci albo{-1,1}
albo{1,-1}
.Przykłady
Wcześniejsze rozwiązanie
Wygląda to na przykłady wszystkich trzech (generowanych przez
Partition
) i określa, czy środkowy element jest mniejszy niż obie skrajności, czy większy niż skrajności.Pierwsze rozwiązanie
Znajduje to potrójne i patrzy na znaki różnic. Miejscowy skrajny powróci albo
{-1,1}
albo{1,-1}
.Przykład
Analiza :
%
odnosi się do wyniku z odpowiedniej linii poprzedniej.Sort@Sign@Differences@x=={-1,1}
identyfikuje tróje z {{9, 10, 7}, {10, 7, 6}, {7, 6, 9}, {6, 9, 0}, {9, 0, 3}, {0, 3, 3}, {3, 3, 1}, {3, 1, 10}} tak, że znak (-, 0, +) różnic składa się z a-1
i a1
. W niniejszej sprawie są to:Dla każdego z tych przypadków x
x[[2]]
oznacza drugi termin. Będą to wszystkie lokalne maksima i minima.źródło
J - 19 znaków
Nic na to nie poradzę;)
Wyjaśnienie jest następujące:
2-/\]
- Przy każdej parze elementów w argumencie (każda 2-elementowa długa infiks) weź różnicę.2*/\
- Teraz nad każdą parą nowej listy weź produkt.0>
- Sprawdź, czy każdy wynik jest mniejszy niż 0. Dzieje się tak tylko wtedy, gdy multiplikaty mają naprzemienne znaki, tzn. Nie zdarza się, jeśli mają ten sam znak lub którykolwiek był równy zero.0,
- Zadeklaruj, że pierwszy element nie jest elementem skrajnym.}:
- Odetnij ostatni element, ponieważ to też nie może być ekstremalne.#~
- Użyj prawdziwych wartości po prawej stronie, aby wybrać elementy z listy po lewej stronie.Stosowanie:
źródło
JavaScript -
6245 znakówEdytować
źródło
Ruby,
8370605549 znakówDrukuje wszystkie lokalne ekstremy do STDOUT.
Korzysta z<=>
operatora „statku kosmicznego”, który bardzo mi się podoba. (Zwraca 1, jeśli pierwsza rzecz jest większa od drugiej, -1, jeśli jest mniejsza, a 0, jeśli jest równa. Dlatego, jeśli dodają do -2 lub 2, oznacza to, że środek jest ekstremalny.)Już nie, jak zauważył @daniero, że „oczywisty” sposób jest w rzeczywistości krótszy!Zmieniony jeszcze raz! Teraz wykorzystuje niesamowity algorytm znaleziony w odpowiedzi MT0 (+1 dla niego!).
Również podoba mi się,
each_cons
który wybiera każdąn
grupę kolejnych elementów w tablicy.if
Ciekawe jest również śledzenie .Ogólnie podoba mi się to, jak elegancko wygląda.
Niektóre przykładowe przebiegi:
źródło
f=->a{a.each_cons(3){|x,y,z|p y if((x<=>y)+(z<=>y)).abs==2}}
x>y&&y<z||x<y&&y>z
(nawet jeśli operator statku kosmicznego jest bardzo ładny);)!((x..z)===y)
jest jeszcze krótszy, choć nie tak sprytnyx < z
.C ++ - 208 znaków
Najdłuższe rozwiązanie ponownie:
Aby użyć, wprowadź liczby całkowite, a następnie dowolny znak, który spowoduje awarię strumienia wejściowego - wszystkie znaki nienumeryczne powinny działać.
Wejście:
0 1 0 x
Wynik:
1
źródło
deque
zamiast zamiast a,vector
aby zyskać 2 postacie.i
ij
, możesz zadeklarowaćint i;
zaraz po zbiorze i użyć w dwóch pętlach zamiast deklarować dwie zmienne.i++
w pętli for i rozpocząć swój stanif(v[++i]>[i-1]...
, aby ponownie zdobyć jedną postać.Matlab - 45 bajtów
źródło
Python 2.7 - 73 bajty
Niezbyt imponujące (spójrz na każdy element listy oprócz pierwszego i ostatniego, zobacz, czy jest większy czy mniejszy niż jego sąsiedzi).
Przeważnie publikuję to, ponieważ nie wszyscy wiedzą, że możesz to zrobićx<y>z
i , by działało. Myślę, że to trochę miłe.Tak,
x<y>z
jest fajną funkcją Pythona, ale w tym przypadku nie jest optymalna. Dzięki VX za zwielokrotnienie, które w ogóle mi się nie przydarzyło. Wrzlprmft przypomniał mi, że zadeklarowanie anonimowej funkcji wymaga mniej naciśnięć klawiszy niżdef x(y):
.źródło
if(l[i]-l[i-1])*(l[i]-l[i+1])>0
zmniejszy kod o 11 znaków ...def e(l):\n
ma tyle samo znaków coe=lambda l:
, ale zapomniałem, że nie trzeba używaćreturn
słowa kluczowego. Dzięki!(l[i]-l[i-1])*(l[i]-l[i+1])
to1
, czyl[i]
jest lokalnym ekstremum i0
inaczej, nie trzeba używać>0
. Mogę po prostu pozwolić Pythonowi interpretować to jako bool. :)\n
deklaracji! Uratowałoby to dwie postacie, ale włączeniereturn
wciąż sprawia, że nie warto.Haskell 50
źródło
x>p&&x>n
ma o jedną postać mniej niżx>max p n
:-),
nie jest konieczna.x>p&&x>n
również(x>p)==(x>n)
na lokalne minimum, dodaje 4 dodatkowe znaki.Galaretka , 8 bajtów
Wypróbuj online!
Wyjaśnienie
Element jest tylko ekstremum lokalnym, jeśli jego różnica z lewym sąsiadem ma znak przeciwny do różnicy z prawym sąsiadem, tzn. Znaki różnic różnią się o 2 lub -2. Galaretka ma wiele przydatnych prymitywów do radzenia sobie z „znajdowaniem elementów o określonych właściwościach” (w szczególności możemy znaleźć elementy o określonych właściwościach na jednej liście i użyć go do wyodrębnienia elementów z innej listy), co oznacza, że możemy przełożyć z powrotem na oryginalna lista mniej więcej bezpośrednio (wystarczy przesunąć o 1, ponieważ pierwszy i ostatni element oryginalnej listy zagubił się w podejmowaniu różnic).
źródło
Python z Numpy -
81 7467 bajtów (6154 bezimport
wiersza)Dane wejściowe muszą być tablicą Numpy.
źródło
C, 83
źródło
awk - 32 znaki
Nie mam nadziei na pokonanie takiego języka jak J lub APL w zwięzłości, ale pomyślałem, że i tak wrzucę kapelusz na ring. Wyjaśnienie:
a
,b
ic
chwytx_i
,x_(i-1)
orazx_(i-2)
b-c
ia-b
przybliżenie pochodnej przed i pox_(i-1)
x_(i-1)
, dlatego jest to lokalna skrajność, więc drukujźródło
Brachylog , 17 bajtów
Wypróbuj online!
Pobiera dane wejściowe poprzez zmienną wejściową i generuje dane wyjściowe poprzez zmienną wyjściową.
Jeśli można by zagwarantować, że nie ma przebiegów,
s₃{{⌉|⌋}.&bh}
można zaoszczędzić cztery bajty.źródło
Perl 5
-p
, 49 bajtówWypróbuj online!
źródło
Wolfram Language (Mathematica) ,
4342 bajtyWypróbuj online!
Myślę, że
Nothing
jest za długi ...źródło
05AB1E ,
1110 bajtówWypróbuj online lub sprawdź kilka innych przypadków testowych .
Wyjaśnienie:
źródło
PHP,
116 114113Przykładowe użycie:
źródło
Haskell, 70 ° C
Wersja golfowa
Wersja bez golfa
źródło
JavaScript: 102 znaki
źródło
APL, 19 bajtów
Przekształciłem wersję 20 znaków J na APL. Ale dodaję zero na początku i na końcu, zamiast usuwać pierwszą i ostatnią cyfrę. W przeciwnym razie działa tak jak wersja J.
⍵
- parametr formalny omega. To jest wejście do funkcji.źródło
{x@1+&0>2_*':-':0 0,x}
. 6 z tych znaków (2_
i0 0,
) wydaje się na ochronę przed błędem długości, jeśli argument jest krótszy niż dwa elementy, więc gdyby nie ten problem, byłby to 16 ... Działanie jest również nieco inne - musimy obrócić lista boolean na listę indeksów1+&
i użyj jej dox
ponownego indeksowania - ale jest ona krótsza i również bardzo fajna.Python 2 , 59 bajtów
Wypróbuj online!
Ta funkcja pozwala przede wszystkim uniknąć kosztownego indeksowania, przyjmując elementy listy jako argumenty zamiast samej listy. Chociaż na liście pozostaje więcej niż jeden element, rekurencyjnie tworzymy listę, sprawdzając maksimum na każdym kroku.
źródło