Tìm độ lệch tối đa


20

Vấn đề này được "lấy cảm hứng" từ một câu hỏi ban đầu được hỏi trên Quora (không phải để chơi golf mã). Tôi chỉ muốn làm cho nó trở thành một thách thức cho các bạn (và vấn đề đầu tiên của tôi gửi ở đây).

Cho một mảng các phần tử nguyên vvà một số nguyên d(chúng tôi giả sử rằng d thấp hơn hoặc bằng độ dài của mảng), hãy xem xét tất cả các chuỗi của dcác phần tử liên tiếp trong mảng. Đối với mỗi chuỗi, tính toán sự khác biệt giữa giá trị tối đa và tối thiểu của các phần tử trong chuỗi đó và đặt tên cho độ lệch.

Nhiệm vụ của bạn là viết một chương trình hoặc hàm tính giá trị tối đa trong số tất cả các độ lệch của tất cả các chuỗi được xem xét ở trên và trả về hoặc xuất giá trị đó.

Ví dụ làm việc thông qua:

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.

Đây là mã golf, vì vậy câu trả lời ngắn nhất trong byte sẽ thắng.

Câu trả lời:


14

APL Dyalog, 7 byte

⌈/⌈/-⌊/

Kiểm tra nó trên TryAPL .

Làm thế nào nó hoạt động

⌈/⌈/-⌊/  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 cho TIL mà bạn có thể sử dụng withtrên toàn bộ chức năng lambda
Bassdrop Cumberwubwubwub

Trên thực tế , Uncaught SyntaxError: Unexpected token with. Bạn có thể đăng một đoạn làm việc?
Bassdrop Cumberwubwubwub

@BassdropCumberwubwubwub Nếu bạn muốn đặt tên cho lambda, bạn cần đặt bài tập sau with(Math)hoặc sử dụng f=eval("with(Math)(v,d)=>max(...a)))").
Neil

4

Python, 60 byte

Tiết kiệm 5 byte nhờ Neil

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

Lambda đệ quy đầu tiên của tôi!

Sử dụng:

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

1
Tôi nghĩ bạn chỉ có thể sử dụng v and; phạm vi sẽ không tăng nếu bạn loại bỏ các yếu tố.
Neil

4

Perl, 48 byte

Bao gồm +5 cho -0pi

Đưa ra chiều rộng sau -itùy chọn, cung cấp các phần tử dưới dạng các dòng riêng biệt trên STDIN:

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

Chỉ cần mã:

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

(sử dụng một nghĩa đen \ncho điểm số yêu cầu)


Tôi thấy một regex, và sau đó tôi bị lạc. 0,0 Điều gì đang xảy ra ở đây?
Addison Crump

@VTCAKAVSMoACE Về cơ bản, tôi khớp từ 1 đến chiều rộng các dòng liên tiếp. $&sẽ chứa toàn bộ trận đấu sẽ đánh giá là số đầu tiên trong ngữ cảnh số học. $1sẽ chứa số cuối cùng. Sau đó tôi mạnh mẽ thất bại với regex với \A. Vì vậy, nó sẽ thử tất cả các vị trí bắt đầu và chiều dài lên đến chiều rộng. Tôi sử dụng giá trị tuyệt đối của sự khác biệt như một chỉ số mảng và xem mảng phát triển lớn như thế nào. Perl không có nội dung nào maxnên tôi phải ứng biến
TonMedel

Điều đó cực kỳ thông minh. Bất kỳ cách nào bạn có thể đặt -0pi3 -evào -0pi3e? Chỉ là một giả định về việc giảm khả năng, tôi không sử dụng perl (vì vậy câu hỏi của tôi).
Addison Crump

@VTCAKAVSMoACE Không tiếc. -iăn tất cả mọi thứ sau khi nó là giá trị của nó, bao gồm bất kỳe
TonMedel

Và tôi cho rằng -ephải đi ngay trước mã? Bummer.
Addison Crump

4

R, 63 62 56 byte

Billywob đã cung cấp một câu trả lời R tuyệt vời chỉ bằng các hàm cơ bản . Tuy nhiên, tôi muốn xem liệu một phương pháp thay thế có khả thi hay không, có lẽ sử dụng một số gói mở rộng của R. Có một chức năng hay rollapplytrong zoogói được thiết kế để áp dụng một chức năng cho một cửa sổ cuộn của một mảng, do đó rất phù hợp với mục đích của chúng tôi. Chúng tôi sử dụng rollapplyđể tìm maxcửa sổ của mỗi cửa sổ và chúng tôi sử dụng nó một lần nữa để tìm mincửa sổ. Sau đó, chúng tôi lấy sự khác biệt giữa các mức tối đa và phút, điều này cho chúng tôi độ lệch cho mỗi cửa sổ, và sau đó trả lại giá maxtrị của các cửa sổ đó .

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

1
Thật tuyệt, tôi biết có một chức năng để tạo ra các chuỗi con nhưng không thể tìm thấy nó. Ngoài ra, phía sau một proxy tại nơi làm việc vì vậy không thể sử dụng bất kỳ gói bên ngoài nào.
Billywob

1
Một số googling thông báo cho tôi rằng cũng có gtools::rolling, nhưng đó là một byte nữa và tôi không quen với nó. Tôi luôn có hai suy nghĩ về việc sử dụng các gói phi cơ sở: một mặt, cảm giác như gian lận khi có một giải pháp đơn giản; mặt khác, các gói (và cộng đồng) là một trong những thế mạnh của R như một ngôn ngữ, tôi nghĩ vậy.
rturnbull

3

R, 80 77 byte byte

Chỉnh sửa: Đã lưu 3 byte nhờ @rturnbull

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

1
Bạn có thể thay thế 1:(length(s)-d+1)bằng d:sum(1|s)-d+1.
rturnbull

@rturnbull Bắt đẹp!
Billywob

2

PowerShell v2 +, 68 byte

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

Giải pháp lặp lại. Vòng lặp thông qua $v, nhưng thực sự chúng ta chỉ sử dụng nó như một bộ đếm chứ không thực sự đi qua các giá trị. Mỗi lần lặp lại, chúng tôi sẽ cắt $vngang $i..($i+++$d-1), nơi $imặc định 0. Chúng tôi |sortnhững yếu tố đó, và lưu trữ kết quả vào $x. Sau đó, chúng tôi lấy lớn nhất [-1]và trừ nhỏ nhất [0]. Chúng tôi sau đó |sortnhững kết quả và lấy lớn nhất[-1] của điều đó. Con số đó được để lại trên đường ống và đầu ra là ẩn.

Ví dụ

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

Sử dụng mã hóa CP-1252 .

Œù€{øÀ`-ÄZ

Hãy thử trực tuyến!

Giải trình

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

Cạo một bó, một phần nhờ vào 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;}

Ung dung

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

Bạn đang thiếu một dấu ngoặc kết thúc. ;)
Addison Crump

@VTCAKAVSMoACE oops. Lỗi sao chép và dán :(
dpa97

1
Giảm 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 Tôi không tin những gì bạn có sẽ hoạt động - có thể sai. Hãy thử chuyển đổi 7 và 1 trong trường hợp thử nghiệm. Tuy nhiên, tôi có thể sử dụng nó để loại bỏ một vài ý tưởng mới của mình!
dpa97

1
Tôi đã thoát khỏi sự cần thiết của abs (làm cho thuật toán trở nên tồi tệ hơn nhiều trong quá trình, tất nhiên) bằng cách bắt đầu k tại i là tốt. Thủ thuật khá tiện lợi có x = (f = ...) trong cùng một dòng, cảm ơn vì điều đó
dpa97

2

Toán học, 41 37 byte

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

Bạn không thể sử dụng sản phẩm chấm với {-1,1}để tránh Abs?
dặm

@miles Cảm ơn! Chỉnh sửa câu trả lời.
JungHwan Min

@JHM Một byte được lưu với Max[BlockMap[MinMax,#,#2,1].{-1,1}]&.

1

Ruby, 45 byte

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

Tôi cảm thấy như thế này có thể tốt hơn rất nhiều.


1

MATLAB với các hộp công cụ xử lý ảnh và thống kê, 33 byte

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

Điều này xác định một chức năng ẩn danh. Ví dụ sử dụng:

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

Bạn cũng có thể dùng thử trên Octave tại Ideone (nhưng Octave, không giống như Matlab, yêu cầu tải rõ ràng gói hình ảnh).

Giải trình

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

Ung dung:

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

Giải trình:

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

Hãy thử trực tuyến!

Giải trình

Hãy xem xét các đầu vào [6,9,4,7,4,1], 3 làm ví dụ.

       % 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

Trên thực tế , 13 byte

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

Hãy thử trực tuyến!

-6 byte từ quan sát trong câu trả lời Haskell của nimi , lát đó ngắn hơnd don't affect the maximum deviation.

Giải trình:

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

Không đặc biệt thông minh hay xinh đẹp nhưng nó hoạt động. Sử dụng như:

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

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

Chỉnh sửa: 2 byte được lưu nhờ vào Jörg Hülsermann


echo+$o;thay vìecho$o?:0;
Jörg Hülsermann

0

CJam , 17 byte

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

(Ngoài ra q~ew:$z)\(\;.-:e>)

Hãy thử trực tuyến!

Giải trình

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 = đắt tiền (tôi biết nó có thể được chơi gôn nhiều hơn nữa)

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

Ung dung

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

Ví dụ sử dụng: 3 # [6,9,4,7,4,1]-> 6.

Xét dãy dưới dkhông làm thay đổi tối đa tổng thể, vì vậy chúng tôi có thể chạy take dxuống cho đến cuối cùng của danh sách (tức là cũng bao gồm các dãy với người cuối cùng d-1, d-2... 0yếu tố). Đệ quy dừng lại với danh sách trống nơi chúng ta đặt độ lệch thành 0.



0

Vợt 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))))

Ung dung:

(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

Kiểm tra:

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

Đầu ra:

6

0

q, 25 byte

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

mmaxmminlà cửa sổ trượt tối đa và tối thiểu tương ứng

Thí dụ

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

0

C #, 131 byte

đây là một giải pháp linq dài dòng

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

Chơi gôn

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

Ung dung:

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

Kiểm tra:

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

Đầu ra:

6

0

Bình thường, 11 byte

eSms.+Sd.:F

Giải trình

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

Thạch , 8 byte

ṡµṂ€ạṀ€Ṁ

Hãy thử trực tuyến!

Sử dụng thuật toán tương tự như Dyalog APL, nhưng tôi đã tự mình tìm ra điều này trước khi nhìn vào nó.

Giải trình:

ṡµṂ€ạṀ€Ṁ ḷ“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, y are left, right arguments respectively.


0

Perl 6, 44 bytes

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

$^a and $^b are the two arguments to the function, called v and d respectively in the problem statement. The rotor method returns the sequence of subsequences of v of size d.


0

Clojure, 73 67 bytes

Edit: Using #(...) instead of (fn[...]) and for instead of map.

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

0

Python 3, 80 bytes

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

you can use (max(v[i:i+d])-min(v[i:i+d])for i in range(-~len(v)-d) instead of map(lambda g:max(g)-min(g),[v[i:i+d]for i in range(-~len(v)-d)])
Wheat Wizard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.