最大偏差を見つける


20

この問題は、Quoraで最初に尋ねられた質問から「インスパイアされた」ものです(コードゴルフではありません)。私はそれを皆さんに挑戦したいだけです(そして、ここでの私の最初の問題提出)。

整数要素の配列vと整数d(dは配列の長さ以下であると仮定します)が与えられた場合、配列内のd連続した要素のすべてのシーケンスを考慮します。各シーケンスについて、そのシーケンス内の要素の最大値と最小値の差を計算し、偏差と名付けます。

あなたの仕事は、上記で考慮したすべてのシーケンスのすべての偏差の中で最大値を計算し、その値を返すか出力するプログラムまたは関数を作成することです。

実施例:

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.

これはコードゴルフであるため、バイト単位の最短回答が優先されます。

回答:


14

Dyalog APL、7バイト

⌈/⌈/-⌊/

TryAPLでテストします

使い方

⌈/⌈/-⌊/  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バイト

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

withラムダ関数全体で使用できるTILの+1
Bassdrop Cumberwubwubwub

実際には、Uncaught SyntaxError: Unexpected token with。作業スニペットを投稿できますか?
バスドロップCumberwubwubwub

@BassdropCumberwubwubwubラムダに名前を付ける場合はwith(Math)、の後に割り当てを配置するか、を使用する必要がありますf=eval("with(Math)(v,d)=>max(...a)))")
ニール

4

Python、60バイト

Neilのおかげで5バイト節約

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

私の最初の再帰ラムダ!

使用法:

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

1
私はあなただけを使用することができると思いますv and。要素を削除しても範囲は上がりません。
ニール

4

Perl、48バイト

+5を含む -0pi

-iオプションの後に幅を指定し、要素をSTDINの個別の行として指定します。

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

コードだけ:

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

\nクレームのスコアにリテラルを使用します)


正規表現を見た後、迷子になります。0.0ここで何が起こっていますか?
アディソンクランプ

@VTCAKAVSMoACE基本的に、1を幅の連続する行に一致させます。$&算術コンテキストの最初の数として評価される完全一致が含まれます。$1最後の番号が含まれます。次に、で正規表現を強制的に失敗させ\Aます。したがって、すべての開始位置と幅までの長さを試行します。差の絶対値を配列インデックスとして使用し、配列が大きくなるのを確認します。Perlは何の組み込みを持っていないmax私が即興する必要がありますので
トンHospel

それは非常に賢いです。あなたが置くことができますどのような方法-0pi3 -e-0pi3e?削減の可能性についての仮定だけで、私はperlを使用しません(したがって、私の質問です)。
アディソンクランプ

@VTCAKAVSMoACE残念ながらありません。-iを含むその値として、それ以降のすべてを食べるe
トンホスペル

そして、私は-eそれがコードの直前に行かなければならないと仮定していますか?残念。
アディソンクランプ

4

R、63 62 56バイト

Billywobは、基本関数のみを使用して、優れたR回答を既に提供しています。しかし、おそらくRの広範なパッケージのいくつかを使用して、別のアプローチが可能かどうかを確認したかったのです。素敵な機能がありますrollapplyzoo、配列のローリング・ウィンドウに関数を適用するように設計されたパッケージはとてもそれがうまく我々の目的に合いました、。各ウィンドウのrollapplyを見つけるために使用しmax、各ウィンドウのを見つけるために再び使用しminます。次に、最大値と最小値の差を取得します。これにより、各ウィンドウの偏差が得られmax、それらの値が返されます。

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

1
ニース、サブシーケンスを生成する機能があることは知っていましたが、見つかりませんでした。また、職場のプロキシの背後にあるため、外部パッケージを使用できません。
ビリーウォブ

1
一部のグーグルは、もあることを私に知らせますがgtools::rolling、それはもう1バイトであり、私はそれに慣れていません。非ベースパッケージの使用については常に2つの考えがあります。一方で、単純な解決策がある場合は不正行為のように感じます。一方、パッケージ(およびコミュニティ)は、言語としてのRの強みの1つです。
rturnbull

3

R、80 77バイトバイト

編集:@rturnbullのおかげで3バイト保存

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

1
あなたは置き換えることができ1:(length(s)-d+1)d:sum(1|s)-d+1
rturnbull

@rturnbull素敵なキャッチ!
ビリーウォブ

2

PowerShell v2 +、68バイト

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

反復ソリューション。ループし$vますが、実際には値を実際に処理するのではなく、単にカウンタとして使用しています。繰り返しごとに、でスライス$vします。デフォルトはです。私たちはそれらの要素、およびに結果を格納。次に、最大のものを取得し、最小のものを減算します。その後、これらの結果を取得し、その最大のものを使用します。その数はパイプラインに残り、出力は暗黙的です。$i..($i+++$d-1)$i0|sort$x[-1][0]|sort[-1]

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

05AB1E12 10バイト

CP-1252エンコードを使用します。

Œù€{øÀ`-ÄZ

オンラインでお試しください!

説明

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

一部は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;}

非ゴルフ

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

エンドブラケットがありません。;)
アディソンクランプ

@VTCAKAVSMoACEおっと。コピーアンドペーストエラー:(
dpa97

1
5バイトの削減: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;}
アディソンクランプ

@VTCAKAVSMoACEあなたが持っているものがうまくいくとは思わない-間違っているかもしれない。テストケースで7と1を切り替えてみてください。ただし、これを使用して、新しいアイデアを少し削り取ることができます。
dpa97

1
私もkをiで開始することで、absの必要性をなくしました(もちろん、プロセスでアルゴリズムをさらに悪化させます)。同じ行にx =(f = ...)を持つかなり気の利いたトリック、そのおかげで
dpa97

2

Mathematica、41 37バイト

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

{-1,1}を回避するためにドット積を使用できませんでしたAbsか?
マイル

@milesありがとう!回答を編集しました。
ジョンファン分

@JHMで保存された1バイトMax[BlockMap[MinMax,#,#2,1].{-1,1}]&

1

Ruby、45バイト

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

これはもっと良くなると思う。


1

統計と画像処理ツールボックスを備えたMATLAB、33バイト

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

これは、匿名関数を定義します。使用例:

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

IdeoneのOctaveでも試すことができます(ただし、Matlabとは異なり、Octaveは明示的にイメージパッケージをロードする必要があります)。

説明

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バイト

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

ゴルフをしていない:

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

説明:

(_: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バイト

YCS5LY)dX>

オンラインでお試しください!

説明

例として、入力[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

実際には、13バイト

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

オンラインでお試しください!

nimiのHaskell answerの観測から-6バイトd。これより短いスライスは最大偏差に影響しません。

説明:

╗╜@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バイト

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

特に賢くもきれいでもありませんが、機能します。次のように使用します:

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

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

編集:JörgHülsermannのおかげで2バイト節約


echo+$o;代わりにecho$o?:0;
ヨルクヒュルサーマン

0

CJam、17バイト

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

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

オンラインでお試しください!

説明

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バイト

Java =高価です(もっとゴルフができることを知っています)

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

非ゴルフ

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バイト

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

使用例:3 # [6,9,4,7,4,1]-> 6

未満の範囲を考慮することはd、我々が実行できるように、全体の最大値を変更しないtake dリストの最後まで(すなわちも最後と範囲を含むd-1d-2、... 0要素)。再帰は、偏差をに設定した空のリストで停止し0ます。



0

ラケット121バイト

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

ゴルフをしていない:

(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

テスト:

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

出力:

6

0

q、25バイト

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

mmaxそしてmmin、それぞれのウィンドウ最大値と最小値をスライドさ

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

0

C#、131バイト

これは冗長なlinqソリューションです

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バイト

ゴルフ:

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

ゴルフをしていない:

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

テスト:

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

出力:

6

0

Pyth、11バイト

eSms.+Sd.:F

説明

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

ゼリー、8バイト

ṡµṂ€ạṀ€Ṁ

オンラインでお試しください!

Dyalog APLと同じアルゴリズムを使用しますが、それを見る前に自分で考えました。

説明:

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

注:はxyそれぞれ左、右の引数です。


0

Perl 6、44バイト

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

$^aand $^bは、関数ステートメントの2つの引数でvあり、dそれぞれ問題ステートメントで呼び出されます。このrotorメソッドは、vサイズのサブシーケンスのシーケンスを返しますd


0

Clojure、73 67バイト

編集:の#(...)代わりに(fn[...])とのfor代わりに使用しmapます。

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

0

Python 3、80バイト

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)代わりに使用できますmap(lambda g:max(g)-min(g),[v[i:i+d]for i in range(-~len(v)-d)])
ウィートウィザード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.