Maksimum sapmayı bulun


20

Bu sorun aslında Quora (kod golf için değil) sorulan bir sorudan "ilham" . Sadece sizin için bir meydan okuma yapmak istiyorum (ve burada ilk sorun sunumum).

Bir tamsayı öğesi dizisi vve bir tamsayı dverildiğinde (d'nin dizinin uzunluğuna eşit veya daha düşük olduğunu varsayarız), dizideki dardışık öğelerin tüm dizilerini dikkate alın . Her sekans için, o sekanstaki elemanların maksimum ve minimum değerleri arasındaki farkı hesaplayın ve sapmaya adını verin.

Göreviniz, yukarıda dikkate alınan tüm dizilerin tüm sapmaları arasında maksimum değeri hesaplayan bir program veya işlev yazmak ve bu değeri döndürmek veya çıktısını almaktır.

Üzerinde çalışılan örnek:

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.

Bu kod golf, yani bayt en kısa cevap kazanır.

Yanıtlar:


14

Dyalog APL, 7 bayt

⌈/⌈/-⌊/

TryAPL üzerinde test edin .

Nasıl çalışır

⌈/⌈/-⌊/  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 bayt

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

withBütün bir lambda fonksiyonunda kullanabileceğiniz TIL için +1
Bassdrop Cumberwubwubwub

Aslında Uncaught SyntaxError: Unexpected token with,. Çalışan bir pasaj gönderebilir misiniz?
Bassdrop Cumberwubwubwub

@BassdropCumberwubwubwub Lambda adını vermek istiyorsanız, ödevi sonrasına koymanız with(Math)veya kullanmanız gerekir f=eval("with(Math)(v,d)=>max(...a)))").
Neil

4

Python, 60 bayt

Neil sayesinde 5 bayt tasarruf

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

İlk özyinelemeli lambda!

Kullanımı:

print f([6,9,4,7,4,1], 3)

1
Bence sadece kullanabilirsiniz v and; öğeleri kaldırırsanız aralık yükselmez.
Neil

4

Perl, 48 bayt

İçin +5 içerir -0pi

Seçenekten sonra genişliği -iverin, öğeleri STDIN'de ayrı çizgiler olarak verin:

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

Sadece kod:

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

( \ntalep edilen puan için bir değişmez değer kullanın )


Bir normal ifade görüyorum ve sonra kayboluyorum. 0.0 Burada neler oluyor?
Addison Crump

@VTCAKAVSMoACE Temel olarak 1 ardışık satır genişliğini eşleştiriyorum. $&aritmetik bağlamda ilk sayı olarak değerlendirilecek tüm maçı içerecektir. $1son numarayı içerecektir. Sonra regex ile zorla başarısız \A. Böylece tüm başlangıç ​​pozisyonlarını ve genişliğe kadar uzunlukları deneyecek. Bir dizi dizini olarak fark mutlak değeri kullanın ve dizi ne kadar büyür görmek. Perl yerleşik değil maxbu yüzden doğaçlama yapmak zorunda
Ton Hospel

Bu çok zekice. Eğer koyabilirsiniz herhangi bir şekilde -0pi3 -eiçine -0pi3e? Sadece olası bir azalma hakkında bir varsayım, perl kullanmıyorum (dolayısıyla sorum).
Addison Crump

@VTCAKAVSMoACE Maalesef yok. -iherhangi biri de dahil olmak üzere her şey onun değeri olarak yiyore
Ton Hospel

Ve -ebunun koddan hemen önce gitmesi gerektiğini varsayıyorum ? Aylak.
Addison Crump

4

R, 63 62 56 bayt

Billywob zaten sadece temel fonksiyonları kullanarak harika bir R yanıtı sağlamıştır . Ancak, belki de R'nin geniş paketlerinden bazılarını kullanarak alternatif bir yaklaşımın mümkün olup olmadığını görmek istedim. Orada güzel bir fonksiyonu var rollapplyiçinde zoobir dizinin bir haddeleme penceresine bir işlevi uygulamak için tasarlanmış paket, böylece uyan bizim amacımız iyi. Biz kullanmak rollapplybulmak için maxher pencerenin ve biz bulmak için yeniden kullanmak minher pencerenin. Daha sonra, her bir pencere için sapmayı veren maksimumlar ve dakikalar arasındaki farkı alırız ve sonra bunları geri veririz max.

function(v,d)max((r=zoo::rollapply)(v,d,max)-r(v,d,min))

1
Güzel, alt dizileri oluşturmak için bir işlev olduğunu biliyordum ama bulamadım. Ayrıca iş yerinde bir proxy arkasında herhangi bir dış paket kullanamazsınız.
Billywob

1
Bazı googlingler de var olduğunu bana bildirir gtools::rolling, ancak bu bir bayt daha var ve bunu bilmiyorum. Her zaman temel olmayan paketleri kullanma konusunda iki aklımdayım: bir yandan, basit bir çözüm olduğunda hile gibi geliyor; Öte yandan, paketler (ve topluluk) R'nin dil olarak güçlü yanlarından biri olduğunu düşünüyorum.
rturnbull

3

R, 80 77 bayt bayt

Düzenle: @rturnbull sayesinde 3 bayt kaydedildi

function(s,d)max(sapply(d:sum(1|s)-d+1,function(i)diff(range(s[i:(i+d-1)]))))

1
Sen yerini alabilir 1:(length(s)-d+1)ile d:sum(1|s)-d+1.
rturnbull

@rturnbull Güzel yakala!
Billywob

2

PowerShell v2 +, 68 bayt

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

Yinelemeli çözüm. Döngüler $v, ama gerçekten bunu gerçekten değerlerden geçmek yerine bir sayaç olarak kullanıyoruz. Her yineleme, biz dilimleme konum $vtarafından $i..($i+++$d-1), $ivarsayılan için 0. Biz |sortbu unsurları ve sonucu saklarız $x. Sonra en büyüğünü alırız [-1]ve en küçüğünü çıkarırız [0]. Sonra |sortbu sonuçları alıyoruz ve en büyüğünü alıyoruz [-1]. Bu sayı ardışık düzende bırakılır ve çıktı örtüktür.

Örnekler

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 bayt

CP-1252 kodlamasını kullanır .

Œù€{øÀ`-ÄZ

Çevrimiçi deneyin!

açıklama

Œ              # 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

Kısmen VTCAKAVSMoACE sayesinde bir grup traş etti.

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

Ungolfed

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

Bir uç braketiniz eksik. ;)
Addison Crump

@VTCAKAVSMoACE ayy. Kopyalama ve yapıştırma hatası :(
dpa97

1
5 bayt azaltma: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 Elinizde ne işe yarayacağına inanmıyorum - yanlış olabilir. Test kutusundaki 7 ve 1'i değiştirmeyi deneyin. Ancak, yeni fikrimden bir kaçını tıraş etmek için kullanabilirim!
dpa97

1
Ben de k başlayarak abs (tabii ki süreçte algo çok daha kötü hale) ihtiyacından kurtuldum. Aynı satırda x = (f = ...) olan oldukça şık numara, bunun için teşekkürler
dpa97

2

Mathematica, 41 37 bayt

Max[MovingMap[MinMax,#,#2-1].{-1,1}]&

Nokta ürününü kullanmaktan {-1,1}kaçınamaz Absmısınız?
mil

@miles Teşekkürler! Düzenlenmiş cevap.
JungHwan Min

@JHM Bir bayt kaydedildi Max[BlockMap[MinMax,#,#2,1].{-1,1}]&.

1

Ruby, 45 bayt

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

Bunun daha iyi olabileceğini hissediyorum.


1

İstatistik ve Görüntü İşleme Araç Kutularına sahip MATLAB, 33 bayt

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

Bu anonim bir işlevi tanımlar. Örnek kullanım:

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

Ayrıca Ideone'de Octave üzerinde de deneyebilirsiniz (ancak Matlab'ın aksine Octave, görüntü paketinin açıkça yüklenmesini gerektirir).

açıklama

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 bayt

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

Ungolfed:

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

Açıklama:

(_: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 bayt

YCS5LY)dX>

Çevrimiçi deneyin!

açıklama

Örnek olarak [6,9,4,7,4,1], 3 girdilerini ele alalım.

       % 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

Aslında 13 bayt

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

Çevrimiçi deneyin!

Nimi Haskell cevabındaki gözlemden -6 bayt, dilimlerin dmaksimum sapmayı etkilemediğinden daha kısa .

Açıklama:

╗╜@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 bayt

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

Özellikle zeki veya güzel değil ama işe yarıyor. Gibi kullanın:

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

için v= 6,9,4,7,4,1, d=3

Düzenleme: Jörg Hülsermann sayesinde 2 bayt kaydedildi


echo+$o;yerineecho$o?:0;
Jörg Hülsermann

0

CJam , 17 bayt

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

(Ayrıca q~ew:$z)\(\;.-:e>)

Çevrimiçi deneyin!

açıklama

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 bayt

Java = pahalı (çok daha fazla golf yapılabileceğini biliyorum)

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

Ungolfed

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 bayt

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

Kullanım örneği: 3 # [6,9,4,7,4,1]-> 6.

Aralıkları dgenel maksimum değeri değiştirmediğinden daha az düşünürsek take d, listenin en sonuna kadar uzanabiliriz (yani son d-1, d-2vb. Aralıkları da dahil edebiliriz 0). Özyineleme sapmayı ayarladığımız boş liste ile durur 0.



0

Raket 121 bayt

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

Ungolfed:

(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

Test yapmak:

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

Çıktı:

6

0

q, 25 bayt

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

mmaxve mminsırasıyla sürgülü pencere maksimum ve minimum

Misal

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

0

C #, 131 bayt

İşte ayrıntılı linq çözümü

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 bayt

golfed:

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

Ungolfed:

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

Ölçek:

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

Çıktı:

6

0

Pyth, 11 bayt

eSms.+Sd.:F

açıklama

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

Jöle , 8 bayt

ṡµṂ€ạṀ€Ṁ

Çevrimiçi deneyin!

Dyalog APL ile aynı algoritmayı kullanır, ancak bakmadan önce bunu kendim anladım.

Açıklama:

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

Not: x, ysırasıyla sağ argümanları bırakılır.


0

Perl 6 , 44 bayt

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

$^ave $^bdenilen işleve iki argüman vardır vve dsorun açıklamada sırasıyla. rotorYöntem aşağıdaki dizilerinden dizisini verir vbüyüklüğü d.


0

Clojure, 73 67 bayt

Düzenleme: #(...)yerine (fn[...])ve foryerine kullanma map.

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

0

Python 3, 80 bayt

lambda v,d:max(map(lambda g:max(g)-min(g),[v[i:i+d]for i in range(-~len(v)-d)]))

(max(v[i:i+d])-min(v[i:i+d])for i in range(-~len(v)-d)yerine kullanabilirsinizmap(lambda g:max(g)-min(g),[v[i:i+d]for i in range(-~len(v)-d)])
Wheat Wizard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.