Trouver l'écart maximum

20

Ce problème est "inspiré" d'une question posée à l'origine sur Quora (pas pour le golf à code). Je veux juste en faire un défi pour vous les gars (et ma première soumission de problème ici).

Étant donné un tableau d'éléments entiers vet un entier d(nous supposons que d est inférieur ou égal à la longueur du tableau), considérons toutes les séquences d' déléments consécutifs dans le tableau. Pour chaque séquence, calculez la différence entre la valeur maximale et minimale des éléments de cette séquence et nommez-la l'écart.

Votre tâche consiste à écrire un programme ou une fonction qui calcule la valeur maximale parmi tous les écarts de toutes les séquences considérées ci-dessus, et à retourner ou à sortir cette valeur.

Exemple élaboré:

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.

C'est le golf de code, donc la réponse la plus courte en octets l'emporte.

todeale
la source

Réponses:

14

Dyalog APL, 7 octets

⌈/⌈/-⌊/

Testez-le sur TryAPL .

Comment ça fonctionne

⌈/⌈/-⌊/  Dyadic chain. Left argument: d. Right argument: v

     ⌊/  Reduce v by d-wise minimum, yielding the minima of all slices of length d.
  ⌈/     Reduce v by d-wise maximum, yielding the maxima of all slices of length d.
    -    Subtract, yielding the ranges of all slices of length d.
⌈/       Take the maximum.
Dennis
la source
5

JavaScript (ES6), 73 octets

with(Math)(v,d)=>max(...v.map((a,i)=>max(...a=v.slice(i,i+d))-min(...a)))
Neil
la source
+1 pour TIL que vous pouvez utiliser withsur une fonction lambda entière
Bassdrop Cumberwubwubwub
En fait, Uncaught SyntaxError: Unexpected token with. Pouvez-vous publier un extrait de travail?
Bassdrop Cumberwubwubwub
@BassdropCumberwubwubwub Si vous voulez nommer le lambda, vous devez placer l'affectation après le with(Math), ou utiliser f=eval("with(Math)(v,d)=>max(...a)))").
Neil
4

Python, 60 octets

Économiser 5 octets grâce à Neil

f=lambda v,d:v and max(max(v[:d])-min(v[:d]),f(v[1:],d))or 0

Ma première lambda récursive!

Usage:

print f([6,9,4,7,4,1], 3)
Karl Napf
la source
1
Je pense que vous pouvez simplement utiliser v and; la plage ne monte pas si vous supprimez des éléments.
Neil
4

Perl, 48 octets

Comprend +5 pour -0pi

Donnez la largeur après l' -ioption, donnez les éléments sous forme de lignes distinctes sur STDIN:

perl -0pi3 -e '/(^.*\n){1,$^I}(?{\$F[abs$1-$&]})\A/m;$_=$#F'
6
9
4
7
4
1
^D

Juste le code:

/(^.*\n){1,$^I}(?{\$F[abs$1-$&]})\A/m;$_=$#F

(utilisez un littéral \npour le score revendiqué)

Ton Hospel
la source
Je vois une expression régulière, puis je me perds. 0.0 Que se passe-t-il ici?
Addison Crump
@VTCAKAVSMoACE Fondamentalement, je fais correspondre 1 à la largeur des lignes consécutives. $&contiendra la correspondance entière qui sera évaluée comme le premier nombre dans le contexte arithmétique. $1contiendra le dernier numéro. J'échoue alors avec force le regex avec \A. Il essaiera donc toutes les positions de départ et toutes les longueurs jusqu'à la largeur. J'utilise la valeur absolue de la différence comme index de tableau et vois la taille du tableau. Perl n'a pas de fonction intégrée max, je dois donc improviser
Ton Hospel
C'est extrêmement intelligent. De toute façon , vous pouvez mettre l' -0pi3 -een -0pi3e? Juste une hypothèse sur une éventuelle réduction, je n'utilise pas perl (donc ma question).
Addison Crump
@VTCAKAVSMoACE Non malheureusement. -imange tout après sa valeur, y compris toute
Ton Hospel
Et je suppose que cela -edoit aller juste avant le code? Bummer.
Addison Crump
4

R, 63 62 56 octets

Billywob a déjà fourni une excellente réponse R en utilisant uniquement les fonctions de base . Cependant, je voulais voir si une approche alternative était possible, peut-être en utilisant certains des packages complets de R. Il y a une belle fonction rollapplydans le zoopackage conçue pour appliquer une fonction à une fenêtre déroulante d'un tableau, ce qui correspond bien à nos besoins. Nous utilisons rollapplypour trouver le maxde chaque fenêtre, et nous l'utilisons à nouveau pour trouver le minde chaque fenêtre. Ensuite, nous prenons la différence entre les maximales et les minutes, ce qui nous donne l'écart pour chaque fenêtre, puis renvoyons la maxde celles-ci.

function(v,d)max((r=zoo::rollapply)(v,d,max)-r(v,d,min))
rturnbull
la source
1
Bien, je savais qu'il y avait une fonction pour générer les sous-séquences mais je ne pouvais pas la trouver. Également derrière un proxy au travail, vous ne pouvez donc pas utiliser de packages externes.
Billywob
1
Une recherche sur Google m'informe qu'il y en a aussi gtools::rolling, mais c'est un octet de plus et je ne le connais pas. J'ai toujours deux idées sur l'utilisation de packages non-base: d'une part, on a l'impression de tricher quand il y a une solution simple; d'autre part, les packages (et la communauté) sont l'un des points forts de R en tant que langage, je pense.
rturnbull
3

R, 80 77 octets octets

Edit: sauvé 3 octets grâce à @rturnbull

function(s,d)max(sapply(d:sum(1|s)-d+1,function(i)diff(range(s[i:(i+d-1)]))))
Billywob
la source
1
Vous pouvez remplacer 1:(length(s)-d+1)par d:sum(1|s)-d+1.
rturnbull
@rturnbull Nice catch!
Billywob
2

PowerShell v2 +, 68 octets

param($v,$d)($v|%{($x=$v[$i..($i+++$d-1)]|sort)[-1]-$x[0]}|sort)[-1]

Solution itérative. Boucles à travers $v, mais nous utilisons vraiment cela comme un compteur plutôt que de passer réellement par les valeurs. Chaque itération, nous sommes découpage en tranches $vpar $i..($i+++$d-1), où la $ivaleur par défaut 0. Nous |sortces éléments et stockons le résultat dans $x. Ensuite, nous prenons le plus grand [-1]et soustrayons le plus petit [0]. Nous avons ensuite |sortces résultats et prenons le plus grand [-1]de cela. Ce nombre est laissé sur le pipeline et la sortie est implicite.

Exemples

PS C:\Tools\Scripts\golfing> .\find-the-maximum-deviation.ps1 @(6,9,4,7,4,1) 3
6

PS C:\Tools\Scripts\golfing> .\find-the-maximum-deviation.ps1 @(1,2,3,4,5,6) 3
2

PS C:\Tools\Scripts\golfing> .\find-the-maximum-deviation.ps1 @(7,2,3,4,5,6) 3
5
AdmBorkBork
la source
2

05AB1E , 12 10 octets

Utilise l' encodage CP-1252 .

Œù€{øÀ`-ÄZ

Essayez-le en ligne!

Explication

Œ              # sublists of v
 ù             # of length d
  €{           # sort each
    ø          # zip
     À         # rotate left (last 2 lists will be largest and smallest)
      `        # flatten (lists with smallest and largest item will be on top)
       -       # subtract largest from smallest
        Ä      # take absolute value (as we will have negatives after the previous step)
         Z     # take the largest
Emigna
la source
2

Java 8, 140 128

Rasé un tas, en partie grâce à VTCAKAVSMoACE.

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=i;k<i+d;)x=(f=a[j]-a[k++])>x?f:x;return x;}

Non golfé

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=i;k<i+d;)
                x=(f=a[j]-a[k++])>x?f:x;
    return x;
}
dpa97
la source
Il vous manque un support d'extrémité. ;)
Addison Crump
@VTCAKAVSMoACE oups. Erreur de copier-coller :(
dpa97
1
Réduction de 5 octets: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;}
Addison Crump
@VTCAKAVSMoACE Je ne crois pas que ce que vous aurez fonctionnera - pourrait être faux. Essayez de changer le 7 et le 1 dans le cas de test. Cependant, je peux l'utiliser pour raser quelques-uns de ma nouvelle idée!
dpa97
1
Je me suis débarrassé du besoin d'abs (ce qui rend l'algo bien pire dans le processus, bien sûr) en commençant également par k à i. Truc assez astucieux ayant x = (f = ...) dans la même ligne, merci pour cela
dpa97
2

Mathematica, 41 37 octets

Max[MovingMap[MinMax,#,#2-1].{-1,1}]&
JungHwan Min
la source
Ne pourriez-vous pas utiliser le produit scalaire avec {-1,1}pour éviter cela Abs?
miles
@miles Merci! Réponse modifiée.
JungHwan Min
@JHM Un octet enregistré avec Max[BlockMap[MinMax,#,#2,1].{-1,1}]&.
1

Rubis, 45 octets

->a,d{a.each_cons(d).map{|b|b.max-b.min}.max}

Je pense que cela pourrait être beaucoup mieux.

Lee W
la source
1

MATLAB avec statistiques et boîtes à outils de traitement d'image, 33 octets

@(v,d)max(range(im2col(v,[1 d])))

Cela définit une fonction anonyme. Exemple d'utilisation:

>> f = @(v,d)max(range(im2col(v,[1 d])));
>> f([6,9,4,7,4,1], 3)
ans =
     6

Vous pouvez également l' essayer sur Octave à Ideone (mais Octave, contrairement à Matlab, nécessite de charger explicitement le paquet d'images).

Explication

im2col(v,[1 d]))   % Takes overlapping blocks of size d from v, and arranges them as
                   % columns of a matrix
range(...)         % Maximum minus minimum of each column. Gives a row vector
max(...)           % Maximum of the above row vector
Luis Mendo
la source
1

Scala, 48 octets

(_:Seq[Int])sliding(_:Int)map(s=>s.max-s.min)max

Non golfé:

(a:Seq[Int],d:Int)=>a.sliding(d).map(s=>s.max-s.min).max

Explication:

(_:Seq[Int])   //define a function with a seq of ints as an argument
sliding(_:Int) //get the sequences with the length of an int argument
map(s=>        //map each sequence
  s.max-s.min    //to its deviation
)max           //and take the maximum value
corvus_192
la source
1

MATL , 10 octets

YCS5LY)dX>

Essayez-le en ligne!

Explication

Prenons l'exemple des entrées [6,9,4,7,4,1], 3.

       % Implicitly take the two inputs: v, d
       % STACK: [6,9,4,7,4,1], 3
YC     % Matrix of overlapping d-blocks of v
       % STACK: [6 9 4 7
                 9 4 7 4
                 4 7 4 1]
S      % Sort each column
       % STACK: [4 4 4 1
                 6 7 4 4
                 9 9 7 7]
5LY)   % Keep first and last rows
       % STACK: [4 4 4 1
                 9 9 7 7]
d      % Differences along each column
       % STACK: [5 5 3 6]
X>     % Maximum
       % STACK: 6
       % Implicitly display
Luis Mendo
la source
1

En fait , 13 octets

╗╜@V`;m@M-`MM

Essayez-le en ligne!

-6 octets de l'observation dans la réponse Haskell de nimi , que les tranches plus courtes que dn'affectent pas l'écart maximum.

Explication:

╗╜@V`;m@M-`MM
╗              store d in register 0
 ╜@            push d, swap so v is on top
   V           push all slices of v whose length is in [1, d]
    `;m@M-`M   map (for each slice):
     ;m@M-       get minimum and maximum, subtract min from max
           M  get maximum of list of deviations
Mego
la source
1

PHP, 89 87 octets

for($i=1;$r=array_slice($argv,++$i,$argv[1]);$d=max($r)-min($r))$o=$d>$o?$d:$o;echo+$o;

Pas particulièrement intelligent ou joli mais ça marche. Utilisez comme:

php -r "for($i=1;$r=array_slice($argv,++$i,$argv[1]);$d=max($r)-min($r))$o=$d>$o?$d:$o;echo+$o;" 3 6 9 4 7 1

pour v= 6,9,4,7,4,1, d=3

Edit: 2 octets enregistrés grâce à Jörg Hülsermann

user59178
la source
echo+$o;au lieu deecho$o?:0;
Jörg Hülsermann
0

CJam , 17 octets

q~ew{$)\(\;-}%:e>

(Aussi q~ew:$z)\(\;.-:e>)

Essayez-le en ligne!

Explication

q~                   e# Read the two inputs. Evaluate
  ew                 e# Overlapping blocks
    {       }%       e# For each block
     $               e# Sort
      )              e# Get last element (that is, maximum)
       \(            e# Swap, get first element (minimum)
         \;          e# Swap, delete rest of the block
           -         e# Subtract (maximum minus minimum)
              :e>    e# Maximum of array
Luis Mendo
la source
0

Java 7,159 octets

Java = cher (je sais qu'il peut être joué beaucoup plus)

int c(int[]a,int d){int[]b=new int[d];int i,j,s=0;for(i=-1;i<a.length-d;){for(j=++i;j<i+d;)b[i+d-1-j]=a[j++];Arrays.sort(b);s=(j=b[d-1]-b[0])>s?j:s;}return s;}

Non golfé

static int c ( int []a , int d){
    int []b = new int[ d ];
    int i , j , s = 0 ;
    for ( i = -1 ; i < a.length - d ;) {
        for ( j = ++i ; j < i + d ;)
        b[ i + d - 1 - j ] = a[ j++ ] ;
        Arrays.sort( b ) ;
        s = ( j = b[ d - 1 ] - b[ 0 ] ) > s ? j : s ;
    }
    return s ;
    }
Numberknot
la source
0

Haskell, 56 octets

_#[]=0 
d#l|m<-take d l=max(maximum m-minimum m)$d#tail l

Exemple d'utilisation: 3 # [6,9,4,7,4,1]-> 6.

Compte tenu des plages moins dne change pas le maximum d' ensemble, afin que nous puissions courir take djusqu'à la fin de la liste (c. -à inclure également les gammes avec les derniers d-1, d-2... 0éléments). La récursivité s'arrête avec la liste vide où nous définissons l'écart 0.

nimi
la source
0

Raquette 121 octets

(let p((v v)(j 0))(let*((l(take v d))(k(-(apply max l)(apply min l)))
(j(if(> k j)k j)))(if(= d(length v))j(p(cdr v)j))))

Non golfé:

(define (f d v)
  (let loop ((v v)
             (mxdev 0))                     ; start with max deviation as 0
    (let* ((l (take v d))                   ; take initial d elements in v
           (dev (- (apply max l)            ; find deviation
                    (apply min l)))
           (mxdev (if(> dev mxdev)          ; note max deviation
                   dev
                   mxdev)))
      (if (= d (length v)) mxdev            ; if all combinations tested, print max deviation
          (loop (rest v) mxdev))            ; else test again 
      )))                                   ; with first element of list removed

Essai:

(f 3 '(6 9 4 7 4 1))

Production:

6
rnso
la source
0

q, 25 octets

{max mmax[y;x]-mmin[y;x]}

mmaxet mminsont des fenêtres coulissantes maximum et minimum respectivement

Exemple

q){max mmax[y;x]-mmin[y;x]}[6 9 4 7 4 1;3]
6
skeevey
la source
0

C #, 131 octets

voici une solution linq verbeuse

int c(int[]a){var x=from j in Enumerable.Range(0,a.Length-2)let p=new[]{a[j],a[j+1],a[j+2]}select p.Max()-p.Min();return x.Max();}
downrep_nation
la source
0

C #, 163 octets

Golfé:

int m(List<int> v,int d){var l=new List<List<int>>();for(int i=0;i<v.Count;i++){if(v.Count-i>=d)l.Add(v.GetRange(i,d));}return l.Select(o=>o.Max()-o.Min()).Max();}

Non golfé:

public int m(List<int> v, int d)
{
  var l = new List<List<int>>();

  for (int i = 0; i < v.Count; i++)
  {
    if (v.Count - i >= d)
      l.Add(v.GetRange(i, d));
  }

  return l.Select(o => o.Max() - o.Min()).Max();
}

Tester:

var maximumDeviation = new MaximumDeviation();
Console.WriteLine(maximumDeviation.f(new List<int> {6,9,4,7,4,1}, 3));

Production:

6
Pete Arden
la source
0

Pyth, 11 octets

eSms.+Sd.:F

Explication

eSms.+Sd.:FQ   Implicit input
          FQ   Unpack the input (v, d)
        .:     Get all subsequences of length d
  m   Sd       Sort each
   s.+         Take the sum of differences to get the deviation
eS             Get the maximum

la source
0

Gelée , 8 octets

ṡµṂ€ạṀ€Ṁ

Essayez-le en ligne!

Utilise le même algorithme que Dyalog APL, mais je l'ai compris moi-même avant de le regarder.

Explication:

ṡµṂ€ạṀ€Ṁ ḷ“Main link. Arguments: v d.”
ṡ        ḷ“Overlapping sublists of x of length y.”
 µ       ḷ“Start a new monadic chain.”
  Ṃ€ạṀ€  ḷ“Find the deviation of each of the elements of x.”
       Ṁ ḷ“Take the maximum of x.”

Note: x, ysont à gauche, à droite respectivement arguments.

Erik le Outgolfer
la source
0

Perl 6 , 44 octets

{$^a.rotor($^b=>1-$^b).map({.max-.min}).max}

$^aet $^bsont les deux arguments de la fonction, appelés vet drespectivement dans l'énoncé du problème. La rotorméthode renvoie la séquence de sous-séquences vde taille d.

Sean
la source
0

Clojure, 73 67 octets

Modifier: utiliser à la #(...)place de (fn[...])et forau lieu de map.

#(apply max(for[p(partition %2 1 %)](-(apply max p)(apply min p))))
NikoNyrh
la source
0

Python 3, 80 octets

lambda v,d:max(map(lambda g:max(g)-min(g),[v[i:i+d]for i in range(-~len(v)-d)]))
Cormac
la source
vous pouvez utiliser à la (max(v[i:i+d])-min(v[i:i+d])for i in range(-~len(v)-d)place demap(lambda g:max(g)-min(g),[v[i:i+d]for i in range(-~len(v)-d)])
Wheat Wizard