Problem ten jest „inspirowany” pytaniem, które pierwotnie zadano na Quora (nie dotyczy gry w golfa kodowego). Chcę tylko, aby stało się to dla was wyzwaniem (i moim pierwszym zgłoszeniem problemu tutaj).
Biorąc pod uwagę tablicę elementów całkowitych v
i liczbę całkowitą d
(zakładamy, że d jest mniejsza lub równa długości tablicy), rozważ wszystkie sekwencje d
kolejnych elementów w tablicy. Dla każdej sekwencji oblicz różnicę między maksymalną i minimalną wartością elementów w tej sekwencji i nazwij ją odchyleniem.
Twoim zadaniem jest napisanie programu lub funkcji, która oblicza maksymalną wartość spośród wszystkich odchyleń wszystkich sekwencji rozważanych powyżej, i zwraca lub wyprowadza tę wartość.
Przepracowany przykład:
v: (6,9,4,7,4,1)
d: 3
The sequences of length 3 are:
6,9,4 with deviation 5
9,4,7 with deviation 5
4,7,4 with deviation 3
7,4,1 with deviation 6
Thus the maximal deviation is 6, so the output is 6.
To jest kod golfowy, więc wygrywa najkrótsza odpowiedź w bajtach.
with
w całej funkcji lambdaUncaught SyntaxError: Unexpected token with
. Czy możesz opublikować działający fragment?with(Math)
, lub użyjf=eval("with(Math)(v,d)=>max(...a)))")
.Python, 60 bajtów
Oszczędność 5 bajtów dzięki Neilowi
Moja pierwsza rekurencyjna lambda!
Stosowanie:
źródło
v and
; zakres nie wzrośnie, jeśli usuniesz elementy.Perl, 48 bajtów
Obejmuje +5 za
-0pi
Podaj szerokość po
-i
opcji, podaj elementy jako osobne linie na STDIN:Tylko kod:
(użyj literału
\n
dla deklarowanego wyniku)źródło
$&
będzie zawierać całe dopasowanie, które zostanie ocenione jako pierwsza liczba w kontekście arytmetycznym.$1
będzie zawierać ostatni numer. Następnie zdecydowanie odrzucam wyrażenie regularne za pomocą\A
. Spróbuje więc wszystkich pozycji początkowych i długości do szerokości. Używam bezwzględnej wartości różnicy jako indeksu tablicy i widzę, jak duży rośnie tablica. Perl nie ma wbudowanego,max
więc muszę improwizować-0pi3 -e
w-0pi3e
? Tylko założenie o możliwej redukcji, nie używam perla (stąd moje pytanie).-i
zjada wszystko po nim jako swoją wartość, w tym każdąe
-e
musi to nastąpić tuż przed kodem? Porażka.R,
636256 bajtówBillywob już zapewnił doskonałą odpowiedź R, używając tylko podstawowych funkcji . Chciałem jednak sprawdzić, czy możliwe jest alternatywne podejście, być może przy użyciu niektórych z obszernych pakietów R. Jest to funkcja miły
rollapply
wzoo
opakowaniu zaprojektowanym do zastosowania funkcji do toczenia oknie tablicy tak, że pasuje do naszego przeznaczenia dobrze. Używamy,rollapply
aby znaleźćmax
każde okno i używamy go ponownie, aby znaleźćmin
każde okno. Następnie bierzemy różnicę między wartościami maksymalnymi i minutami, co daje nam odchylenie dla każdego okna, a następnie zwracamymax
te z nich.źródło
gtools::rolling
, ale to jeszcze jeden bajt i nie znam go. Zawsze zastanawiam się nad korzystaniem z pakietów innych niż bazowe: z jednej strony jest to oszustwo, gdy istnieje proste rozwiązanie; Z drugiej strony, pakiety (i społeczność) są jedną z mocnych stron R jako języka.R,
8077 bajtówEdycja: Zapisano 3 bajty dzięki @rturnbull
źródło
1:(length(s)-d+1)
zd:sum(1|s)-d+1
.PowerShell v2 +, 68 bajtów
Iteracyjne rozwiązanie. Pętle
$v
, ale tak naprawdę używamy tego tylko jako licznika, a nie przechodzimy przez wartości. Przy każdej iteracji dzielimy$v
według$i..($i+++$d-1)
, gdzie$i
domyślnie0
. Mamy|sort
te elementy i przechowujemy wynik w$x
. Następnie bierzemy największe[-1]
i odejmujemy najmniejsze[0]
. Następnie|sort
uzyskujemy te wyniki i bierzemy największy[-1]
z nich. Liczba ta pozostanie w potoku, a dane wyjściowe są niejawne.Przykłady
źródło
05AB1E ,
1210 bajtówWykorzystuje kodowanie CP-1252 .
Wypróbuj online!
Wyjaśnienie
źródło
Java 8,
140128Ogoliłem sporo, częściowo dzięki VTCAKAVSMoACE.
Nie golfił
źródło
int l(int[]a,int d){int x=0,i=0,f,j,k;for(;i<=a.length-d;i++)for(j=i;j<i+d;j++)for(k=j;k<i+d;)x=(f=a[j]-a[k++])<0?-f:f>x?f:x;return x;}
Mathematica,
4137 bajtówźródło
{-1,1}
aby tego uniknąćAbs
?Max[BlockMap[MinMax,#,#2,1].{-1,1}]&
.Rubinowy, 45 bajtów
Czuję, że może być o wiele lepiej.
źródło
MATLAB z zestawami statystyk i narzędziami do przetwarzania obrazu, 33 bajty
Definiuje to anonimową funkcję. Przykładowe zastosowanie:
Możesz także wypróbować go na Octave w Ideone (ale Octave, w przeciwieństwie do Matlaba, wymaga jawnego załadowania pakietu obrazu).
Wyjaśnienie
źródło
Scala, 48 bajtów
Nie golfowany:
Wyjaśnienie:
źródło
MATL , 10 bajtów
Wypróbuj online!
Wyjaśnienie
Rozważ dane wejściowe [6,9,4,7,4,1], 3 jako przykład.
źródło
Właściwie 13 bajtów
Wypróbuj online!
-6 bajtów z obserwacji w odpowiedzi Haskella , że wycinki są krótsze niż
d
nie wpływają na maksymalne odchylenie.Wyjaśnienie:
źródło
PHP,
8987 bajtówNie jest szczególnie sprytny ani ładny, ale działa. Użyj jak:
dla
v
=6,9,4,7,4,1
,d
=3
Edycja: 2 bajty zapisane dzięki Jörgowi Hülsermannowi
źródło
echo+$o;
zamiastecho$o?:0;
CJam , 17 bajtów
(Również
q~ew:$z)\(\;.-:e>
)Wypróbuj online!
Wyjaśnienie
źródło
Java 7,159 bajtów
Java = droga (wiem, że można grać w golfa o wiele więcej)
Nie golfił
źródło
Haskell, 56 bajtów
Przykład użycia:
3 # [6,9,4,7,4,1]
->6
.Biorąc pod uwagę zakresy mniej niż
d
nie zmienia ogólnej maksimum, więc możemy uruchomićtake d
w dół do samego końca listy (czyli także zakresy z ostatnimd-1
,d-2
...0
elementów). Rekurencja kończy się na pustej liście, na której ustawiliśmy odchylenie0
.źródło
Java, 126 bajtów
Zainspirowałem się odpowiedzią dpa97 i znalazłem to:
Rozszerzony, golfowy i przykładowy kod
źródło
Rakieta 121 bajtów
Nie golfowany:
Testowanie:
Wynik:
źródło
q, 25 bajtów
mmax
immin
są przesuwanymi oknami odpowiednio maksimum i minimumPrzykład
źródło
C #, 131 bajtów
tutaj jest pełne rozwiązanie linq
źródło
C #, 163 bajty
Gra w golfa:
Nie golfowany:
Test:
Wynik:
źródło
Pyth, 11 bajtów
Wyjaśnienie
źródło
Galaretka , 8 bajtów
Wypróbuj online!
Używa tego samego algorytmu co Dyalog APL, ale sam to wymyśliłem, zanim na to spojrzałem.
Wyjaśnienie:
Uwaga:
x
,y
są w lewo, prawo argumenty odpowiednio.źródło
Perl 6 , 44 bajtów
$^a
i$^b
są dwoma argumentami funkcji, wywołanymiv
id
odpowiednio w opisie problemu.rotor
Sposób powraca sekwencję subsekwencjiv
wielkościd
.źródło
Clojure,
7367 bajtówEdycja: Używanie
#(...)
zamiast(fn[...])
ifor
zamiastmap
.źródło
Python 3, 80 bajtów
źródło
(max(v[i:i+d])-min(v[i:i+d])for i in range(-~len(v)-d)
zamiastmap(lambda g:max(g)-min(g),[v[i:i+d]for i in range(-~len(v)-d)])