Dieses Problem ist von einer Frage "inspiriert", die ursprünglich auf Quora gestellt wurde (nicht für Code-Golf). Ich möchte es nur zu einer Herausforderung für euch machen (und meine erste Problemmeldung hier).
Berücksichtigen Sie bei einem Array von Ganzzahlelementen v
und einer Ganzzahl d
(wir nehmen an, dass d kleiner oder gleich der Länge des Arrays ist) alle Folgen d
aufeinanderfolgender Elemente im Array. Berechnen Sie für jede Sequenz die Differenz zwischen dem Maximal- und Minimalwert der Elemente in dieser Sequenz und nennen Sie sie die Abweichung.
Ihre Aufgabe ist es, ein Programm oder eine Funktion zu schreiben, die den Maximalwert aller Abweichungen aller oben betrachteten Sequenzen berechnet und diesen Wert zurückgibt oder ausgibt.
Aufgearbeitetes Beispiel:
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.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort in Bytes.
with
für eine gesamte Lambda-Funktion verwenden könnenUncaught SyntaxError: Unexpected token with
. Kannst du ein funktionierendes Snippet posten?with(Math)
oder verwendenf=eval("with(Math)(v,d)=>max(...a)))")
.Python, 60 Bytes
5 Bytes sparen dank Neil
Mein erstes rekursives Lambda!
Verwendung:
quelle
v and
; Der Bereich steigt nicht an, wenn Sie Elemente entfernen.Perl, 48 Bytes
Beinhaltet +5 für
-0pi
Geben Sie die Breite nach der
-i
Option an und geben Sie die Elemente als separate Linien in STDIN an:Nur der Code:
(Verwenden Sie ein Literal
\n
für die beanspruchte Punktzahl)quelle
$&
Enthält die gesamte Übereinstimmung, die als erste Zahl im arithmetischen Kontext ausgewertet wird.$1
wird die letzte Nummer enthalten. Ich versage dann mit Nachdruck die Regex mit\A
. Es werden also alle Startpositionen und Längen bis zur Breite ausprobiert. Ich verwende den absoluten Wert der Differenz als Array-Index und sehe, wie groß das Array wird. Perl hat keine eingebauten,max
also muss ich improvisieren-0pi3 -e
reinstecken-0pi3e
? Nur eine Vermutung über eine mögliche Reduzierung, ich benutze kein Perl (daher meine Frage).-i
isst alles danach als seinen Wert, einschließlich einese
-e
das kurz vor dem Code gehen muss? Schade.R,
636256 BytesBillywob hat bereits eine großartige R-Antwort geliefert , bei der nur die Basisfunktionen verwendet wurden . Ich wollte jedoch herausfinden, ob ein alternativer Ansatz möglich ist, vielleicht unter Verwendung einiger der umfangreichen Pakete von R. Es gibt eine nette Funktion
rollapply
in demzoo
Paket, die entwickelt wurde, um eine Funktion auf ein rollendes Fenster eines Arrays anzuwenden, so dass dies gut zu unseren Zwecken passt. Wir verwendenrollapply
, um dasmax
von jedem Fenster zu finden , und wir verwenden es erneut, um dasmin
von jedem Fenster zu finden . Dann nehmen wir die Differenz zwischen den Maxima und Minima, die uns die Abweichung für jedes Fenster gibt, und geben dann diemax
von diesen zurück.quelle
gtools::rolling
, aber das ist noch ein Byte und ich bin nicht vertraut damit. Ich habe immer zwei Gedanken über die Verwendung von Nicht-Basis-Paketen: Einerseits fühlt es sich an, als würde man schummeln, wenn es eine einfache Lösung gibt. Andererseits sind die Pakete (und die Community) eine der Stärken von R als Sprache, denke ich.R,
8077 Bytes BytesBearbeiten: 3 Bytes dank @rturnbull gespeichert
quelle
1:(length(s)-d+1)
mitd:sum(1|s)-d+1
.PowerShell v2 +, 68 Byte
Iterative Lösung. Schleifen durch
$v
, aber im Grunde verwenden wir das nur als Zähler, anstatt die Werte tatsächlich durchzugehen. Jede Iteration können wir schneiden$v
durch$i..($i+++$d-1)
, wo$i
standardmäßig0
. Wir|sort
diese Elemente und speichern das Ergebnis in$x
. Dann nehmen wir das Größte[-1]
und subtrahieren das Kleinste[0]
. Wir dann|sort
diese Ergebnisse und nehmen das größte[-1]
davon. Diese Nummer bleibt in der Pipeline und die Ausgabe ist implizit.Beispiele
quelle
05AB1E ,
1210 BytesVerwendet die CP-1252- Codierung.
Probieren Sie es online!
Erläuterung
quelle
Java 8,
140128Zum Teil dank VTCAKAVSMoACE.
Ungolfed
quelle
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 Bytesquelle
{-1,1}
, um das zu vermeidenAbs
?Max[BlockMap[MinMax,#,#2,1].{-1,1}]&
.Ruby, 45 Bytes
Ich denke, das könnte viel besser sein.
quelle
MATLAB mit Statistik- und Bildverarbeitungs-Toolboxen, 33 Byte
Dies definiert eine anonyme Funktion. Beispiel Verwendung:
Sie können es auch auf Octave bei Ideone ausprobieren (Octave erfordert jedoch im Gegensatz zu Matlab das explizite Laden des Image-Pakets).
Erläuterung
quelle
Scala, 48 Bytes
Ungolfed:
Erläuterung:
quelle
MATL , 10 Bytes
Probieren Sie es online!
Erläuterung
Betrachten Sie als Beispiel die Eingänge [6,9,4,7,4,1], 3.
quelle
Eigentlich 13 Bytes
Probieren Sie es online!
-6 Bytes von der Beobachtung in Nimis Haskell-Antwort , dass Scheiben kürzer als
d
die maximale Abweichung nicht beeinflussen.Erläuterung:
quelle
PHP,
8987 BytesNicht besonders schlau oder hübsch, aber es funktioniert. Verwenden Sie wie:
für
v
=6,9,4,7,4,1
,d
=3
Edit: 2 Bytes gespeichert dank Jörg Hülsermann
quelle
echo+$o;
stattecho$o?:0;
CJam , 17 Bytes
(Auch
q~ew:$z)\(\;.-:e>
)Probieren Sie es online!
Erläuterung
quelle
Java 7.159 Bytes
Java = teuer (ich weiß, es kann viel mehr Golf gespielt werden)
Ungolfed
quelle
Haskell, 56 Bytes
Anwendungsbeispiel:
3 # [6,9,4,7,4,1]
->6
.In Anbetracht Bereiche weniger als
d
, nicht das Gesamt Maximum ändern , damit wir laufen könnentake d
(dh auch die Bereiche mit dem letzten bis zum Ende der Liste nach untend-1
,d-2
...0
Elemente). Die Rekursion stoppt mit der leeren Liste, auf die wir die Abweichung setzen0
.quelle
Java, 126 Bytes
Ich habe mich von der Antwort von dpa97 inspirieren lassen und Folgendes gefunden:
Erweiterter, Golf- und Beispielcode
quelle
Schläger 121 Bytes
Ungolfed:
Testen:
Ausgabe:
quelle
q, 25 Bytes
mmax
undmmin
sind Schiebefenster Maximum und MinimumBeispiel
quelle
C # 131 Bytes
Hier ist eine ausführliche Linq-Lösung
quelle
C # 163 Bytes
Golf gespielt:
Ungolfed:
Prüfung:
Ausgabe:
quelle
Pyth, 11 Bytes
Erläuterung
quelle
Gelee , 8 Bytes
Probieren Sie es online!
Verwendet den gleichen Algorithmus wie Dyalog APL, aber ich habe das selbst herausgefunden, bevor ich es mir ansah.
Erläuterung:
Hinweis:
x
,y
sind links, rechts Argumente sind.quelle
Perl 6 , 44 Bytes
$^a
und$^b
sind die beiden Argumente für die Funktion, die in der problem-Anweisung aufgerufenv
bzw.d
angegeben werden. Dierotor
Methode gibt die Folge von Teilsequenzenv
der Größe zurückd
.quelle
Clojure,
7367 BytesBearbeiten: Verwenden von
#(...)
anstelle von(fn[...])
undfor
anstelle vonmap
.quelle
Python 3, 80 Bytes
quelle
(max(v[i:i+d])-min(v[i:i+d])for i in range(-~len(v)-d)
anstelle vonmap(lambda g:max(g)-min(g),[v[i:i+d]for i in range(-~len(v)-d)])