Temukan deviasi maksimum

20

Masalah ini "terinspirasi" dari pertanyaan yang awalnya ditanyakan pada Quora (bukan untuk kode golf). Saya hanya ingin menjadikannya sebuah tantangan untuk kalian (dan pengiriman masalah pertama saya di sini).

Diberikan array elemen integer vdan integer d(kami menganggap bahwa d lebih rendah atau sama dengan panjang array), pertimbangkan semua urutan delemen berurutan dalam array. Untuk setiap urutan, hitung perbedaan antara nilai maksimum dan minimum elemen dalam urutan itu dan beri nama deviasinya.

Tugas Anda adalah menulis program atau fungsi yang menghitung nilai maksimum di antara semua penyimpangan dari semua urutan yang dipertimbangkan di atas, dan mengembalikan atau menampilkan nilai itu.

Contoh Worked-through:

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.

Ini adalah kode golf, jadi jawaban tersingkat dalam byte menang.

Todeale
sumber

Jawaban:

14

Dyalog APL, 7 byte

⌈/⌈/-⌊/

Uji di TryAPL .

Bagaimana itu bekerja

⌈/⌈/-⌊/  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
sumber
5

JavaScript (ES6), 73 byte

with(Math)(v,d)=>max(...v.map((a,i)=>max(...a=v.slice(i,i+d))-min(...a)))
Neil
sumber
+1 untuk TIL yang dapat Anda gunakan withpada seluruh fungsi lambda
Bassdrop Cumberwubwubwub
Sebenarnya Uncaught SyntaxError: Unexpected token with,. Bisakah Anda memposting cuplikan yang berfungsi?
Bassdrop Cumberwubwubwub
@BassdropCumberwubwubwub Jika Anda ingin memberi nama lambda Anda harus menempatkan tugas setelah with(Math), atau menggunakan f=eval("with(Math)(v,d)=>max(...a)))").
Neil
4

Python, 60 byte

Menyimpan 5 byte berkat Neil

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

Lambda rekursif pertama saya!

Pemakaian:

print f([6,9,4,7,4,1], 3)
Karl Napf
sumber
1
Saya pikir Anda bisa menggunakan v and; rentang tidak naik jika Anda menghapus elemen.
Neil
4

Perl, 48 byte

Termasuk +5 untuk -0pi

Berikan lebar setelah -iopsi, berikan elemen sebagai garis terpisah pada STDIN:

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

Hanya kode:

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

(gunakan literal \nuntuk skor yang diklaim)

Ton Hospel
sumber
Saya melihat regex, dan kemudian saya tersesat. 0,0 Apa yang terjadi di sini?
Addison Crump
@ VTCAKAVSMoACE Pada dasarnya saya mencocokkan 1 dengan lebar garis berturut-turut. $&akan berisi seluruh kecocokan yang akan dievaluasi sebagai angka pertama dalam konteks aritmatika. $1akan berisi nomor terakhir. Saya kemudian secara paksa gagal dengan regex \A. Jadi itu akan mencoba semua posisi awal dan panjang hingga lebar. Saya menggunakan nilai absolut dari perbedaan sebagai indeks array dan melihat seberapa besar array tumbuh. Perl tidak memiliki builtin maxjadi saya harus berimprovisasi
Ton Hospel
Itu sangat pintar. Cara apapun yang Anda dapat menempatkan -0pi3 -eke dalam -0pi3e? Hanya asumsi tentang kemungkinan pengurangan, saya tidak menggunakan perl (jadi pertanyaan saya).
Addison Crump
@VTCAKAVSMoACE Tidak sayangnya. -imakan semuanya setelah nilainya, termasuk apa pune
Ton Hospel
Dan saya berasumsi bahwa -eharus sebelum kode? Gelandangan.
Addison Crump
4

R, 63 62 56 byte

Billywob telah memberikan jawaban R yang bagus hanya dengan menggunakan fungsi-fungsi dasar . Namun, saya ingin melihat apakah pendekatan alternatif itu mungkin, mungkin menggunakan beberapa paket R yang luas. Ada fungsi yang bagus rollapplydalam zoopaket yang dirancang untuk menerapkan fungsi ke jendela bergulir array, sehingga sesuai dengan tujuan kita dengan baik. Kami menggunakan rollapplyuntuk menemukan maxsetiap jendela, dan kami menggunakannya lagi untuk menemukan minmasing-masing jendela. Lalu kami mengambil perbedaan antara maks dan menit, yang memberi kami deviasi untuk setiap jendela, dan kemudian mengembalikannya max.

function(v,d)max((r=zoo::rollapply)(v,d,max)-r(v,d,min))
rturnbull
sumber
1
Bagus, saya tahu ada fungsi untuk menghasilkan selanjutnya tetapi tidak bisa menemukannya. Juga di belakang proxy di tempat kerja sehingga tidak dapat menggunakan paket eksternal apa pun.
Billywob
1
Beberapa googling memberi tahu saya bahwa ada juga gtools::rolling, tapi itu satu byte lagi dan saya tidak terbiasa dengannya. Saya selalu dalam dua pikiran tentang menggunakan paket non-basis: di satu sisi, rasanya seperti curang ketika ada solusi sederhana; di sisi lain, paket (dan komunitas) adalah salah satu kekuatan R sebagai bahasa, saya pikir.
rturnbull
3

R, 80 77 byte byte

Sunting: Disimpan 3 byte berkat @rturnbull

function(s,d)max(sapply(d:sum(1|s)-d+1,function(i)diff(range(s[i:(i+d-1)]))))
Billywob
sumber
1
Anda bisa menggantinya 1:(length(s)-d+1)dengan d:sum(1|s)-d+1.
rturnbull
@rturnbull Tangkapan bagus!
Billywob
2

PowerShell v2 +, 68 byte

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

Solusi berulang. Loop melalui $v, tapi sebenarnya kita hanya menggunakannya sebagai penghitung daripada benar-benar melalui nilai-nilai. Setiap iterasi, kami mengiris $voleh $i..($i+++$d-1), di mana $idefaultnya 0. Kami |sortelemen-elemen itu, dan menyimpan hasilnya $x. Lalu kami mengambil yang terbesar [-1]dan mengurangi yang terkecil [0]. Kami kemudian |sorthasil itu dan mengambil yang terbesar [-1]dari itu. Angka itu ditinggalkan di jalur pipa dan hasilnya tersirat.

Contohnya

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
sumber
2

05AB1E , 12 10 byte

Menggunakan pengodean CP-1252 .

Œù€{øÀ`-ÄZ

Cobalah online!

Penjelasan

Π             # 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
sumber
2

Java 8, 140 128

Memotong banyak, sebagian berkat 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;}

Tidak disatukan

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
sumber
Anda kehilangan braket ujung. ;)
Addison Crump
@VTCAKAVSMoACE oops. Kesalahan salin dan tempel :(
dpa97
1
Pengurangan 5 byte: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 Saya tidak percaya apa yang Anda miliki akan berhasil - bisa salah. Coba alihkan angka 7 dan angka 1 dalam test case. Namun, saya dapat menggunakannya untuk mencukur beberapa ide baru saya!
dpa97
1
Saya menyingkirkan kebutuhan untuk abs (membuat algo jauh lebih buruk dalam proses, tentu saja) dengan memulai k pada saya juga. Trik yang cukup bagus memiliki x = (f = ...) di baris yang sama, terima kasih untuk itu
dpa97
2

Mathematica, 41 37 byte

Max[MovingMap[MinMax,#,#2-1].{-1,1}]&
JungHwan Min
sumber
Tidak bisakah Anda menggunakan produk titik dengan {-1,1}untuk menghindari Abs?
mil
@miles, terima kasih! Jawaban yang diedit.
JungHwan Min
@ JHM Satu byte disimpan dengan Max[BlockMap[MinMax,#,#2,1].{-1,1}]&.
1

Ruby, 45 byte

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

Saya merasa ini bisa menjadi jauh lebih baik.

Lee W
sumber
1

MATLAB dengan Kotak Alat Statistik dan Pemrosesan Gambar, 33 byte

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

Ini mendefinisikan fungsi anonim. Contoh penggunaan:

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

Anda juga dapat mencobanya di Octave at Ideone (tetapi Octave, tidak seperti Matlab, membutuhkan pemuatan paket gambar secara eksplisit).

Penjelasan

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
sumber
1

Scala, 48 byte

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

Tidak Terkumpul:

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

Penjelasan:

(_: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
sumber
1

MATL , 10 byte

YCS5LY)dX>

Cobalah online!

Penjelasan

Pertimbangkan input [6,9,4,7,4,1], 3 sebagai contoh.

       % 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
sumber
1

Sebenarnya , 13 byte

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

Cobalah online!

-6 byte dari pengamatan dalam jawaban Haskell nimi , bahwa irisan lebih pendek daripada dtidak mempengaruhi deviasi maksimum.

Penjelasan:

╗╜@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
sumber
1

PHP, 89 87 byte

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

Tidak terlalu pintar atau cantik tetapi berhasil. Gunakan seperti:

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

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

Sunting: 2 byte disimpan berkat Jörg Hülsermann

pengguna59178
sumber
echo+$o;bukannyaecho$o?:0;
Jörg Hülsermann
0

CJam , 17 byte

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

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

Cobalah online!

Penjelasan

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
sumber
0

Java 7.159 byte

Java = mahal (saya tahu ini bisa bermain golf lebih banyak)

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

Tidak disatukan

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
sumber
0

Haskell, 56 byte

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

Contoh penggunaan: 3 # [6,9,4,7,4,1]-> 6.

Mengingat rentang kurang dari dtidak mengubah maksimum keseluruhan, sehingga kami dapat menjalankan take dturun ke akhir daftar (yaitu juga termasuk rentang dengan yang terakhir d-1, d-2, ... 0elemen). Rekursi berhenti dengan daftar kosong tempat kami mengatur penyimpangan 0.

nimi
sumber
0

Java, 126 byte

Saya terinspirasi oleh jawaban dpa97 dan menemukan ini:

int f(int v[],int d){int m=0,i=0,j,t,l=v.length;for(;i<l;i++)for(j=i;j<l;j++)m=j-i<d&&(t=Math.abs(v[i]-v[j]))>m?t:m;return m;}

Kode diperluas, golf, dan contoh

AlexRacer
sumber
0

Racket 121 byte

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

Tidak Terkumpul:

(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

Pengujian:

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

Keluaran:

6
juga
sumber
0

q, 25 byte

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

mmaxdan mminjendela geser maksimum dan minimum masing-masing

Contoh

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

C #, 131 byte

di sini adalah solusi linq verbose

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
sumber
0

C #, 163 byte

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

Tidak Terkumpul:

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

Uji:

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

Keluaran:

6
Pete Arden
sumber
0

Pyth, 11 byte

eSms.+Sd.:F

Penjelasan

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

sumber
0

Jelly , 8 byte

ṡµṂ€ạṀ€Ṁ

Cobalah online!

Menggunakan algoritme yang sama dengan Dyalog APL, tapi saya pikir ini sendiri sebelum melihatnya.

Penjelasan:

ṡµṂ€ạṀ€Ṁ ḷ“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.”

Catatan: x, yyang tersisa, argumen kanan masing-masing.

Erik the Outgolfer
sumber
0

Perl 6 , 44 byte

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

$^adan $^badalah dua argumen untuk fungsi, yang dipanggil vdan dmasing - masing dalam pernyataan masalah. The rotorMetode mengembalikan urutan subsequences dari vukuran d.

Sean
sumber
0

Clojure, 73 67 byte

Edit: Menggunakan #(...)bukan (fn[...])dan forbukannya map.

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

Python 3, 80 byte

lambda v,d:max(map(lambda g:max(g)-min(g),[v[i:i+d]for i in range(-~len(v)-d)]))
Cormac
sumber
Anda dapat menggunakan (max(v[i:i+d])-min(v[i:i+d])for i in range(-~len(v)-d)sebagai gantinyamap(lambda g:max(g)-min(g),[v[i:i+d]for i in range(-~len(v)-d)])
Wheat Wizard