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.

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.

5

JavaScript (ES6), 73 byte

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

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

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)


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

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

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

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

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

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

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.


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

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

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

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

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


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

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

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.



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

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

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

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

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

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.


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.


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

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.