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.

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.

5

JavaScript (ES6), 73 octets

with(Math)(v,d)=>max(...v.map((a,i)=>max(...a=v.slice(i,i+d))-min(...a)))

+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)

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é)


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))

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)]))))

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

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

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;
}

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}]&

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.


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

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

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

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

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


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

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 ;
    }

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.



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

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

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();}

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

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

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.


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.


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))))

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)]))

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.