ค้นหาความเบี่ยงเบนสูงสุด


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

+1 สำหรับ TIL ที่คุณสามารถใช้ได้withกับฟังก์ชั่นแลมบ์ดาทั้งหมด
Bassdrop Cumberwubwubwub

Uncaught SyntaxError: Unexpected token withอันที่จริงแล้ว คุณสามารถโพสต์ตัวอย่างข้อมูลที่ใช้งานได้หรือไม่
Bassdrop Cumberwubwubwub

@BassdropCumberwubwubwub ถ้าคุณต้องการที่จะตั้งชื่อแลมบ์ดาคุณจะต้องใส่มอบหมายหลังหรือการใช้งานwith(Math) f=eval("with(Math)(v,d)=>max(...a)))")
Neil

4

Python ขนาด 60 ไบต์

บันทึก 5 ไบต์ด้วย Neil

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; ช่วงไม่เพิ่มขึ้นหากคุณลบองค์ประกอบออก
Neil

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สำหรับคะแนนที่อ้างสิทธิ์)


ฉันเห็น regex และจากนั้นฉันก็หลงทาง 0.0 เกิดอะไรขึ้นที่นี่?
Addison Crump

@VTCAKAVSMoACE โดยทั่วไปฉันจับคู่ 1 ถึงความกว้างของเส้นติดต่อกัน $&จะมีการแข่งขันทั้งหมดซึ่งจะประเมินเป็นหมายเลขแรกในบริบททางคณิตศาสตร์ $1จะมีหมายเลขสุดท้าย จากนั้นผมก็ล้มเหลวอย่างแข็งขัน regex \Aด้วย ดังนั้นจะลองตำแหน่งและความยาวเริ่มต้นทั้งหมดจนถึงความกว้าง ฉันใช้ค่าสัมบูรณ์ของความแตกต่างเป็นดัชนีอาเรย์และดูว่าอาเรย์โตขึ้นเท่าใด Perl ไม่มี builtin maxดังนั้นฉันต้องโพล่งออกมา
Ton Hospel

มันฉลาดมาก วิธีใดที่คุณสามารถใส่-0pi3 -eลงไป-0pi3e? เพียงข้อสันนิษฐานเกี่ยวกับการลดที่เป็นไปได้ฉันไม่ได้ใช้ Perl (ดังนั้นคำถามของฉัน)
Addison Crump

@VTCAKAVSMoACE ไม่น่าเสียดาย -iกินทุกอย่างหลังจากมันเป็นค่าของมันรวมถึงใด ๆe
Ton Hospel

และฉันสมมติว่า-eต้องไปก่อนโค้ดหรือไม่ คนเกียจคร้าน
Addison Crump

4

R, 63 62 56 ไบต์

Billywob ได้ให้คำตอบ Rยอดเยี่ยมไว้แล้วโดยใช้ฟังก์ชันพื้นฐานเท่านั้น อย่างไรก็ตามฉันต้องการดูว่ามีวิธีการอื่นที่เป็นไปได้หรือไม่โดยใช้แพ็คเกจที่ครอบคลุมของ R มีฟังก์ชั่นที่ดีrollapplyในzooแพ็คเกจที่ออกแบบมาเพื่อใช้ฟังก์ชั่นกับหน้าต่างกลิ้งของอาเรย์เพื่อให้เหมาะกับวัตถุประสงค์ของเรา เราใช้rollapplyเพื่อค้นหาmaxหน้าต่างแต่ละบานและเราใช้มันอีกครั้งเพื่อค้นหาminหน้าต่างแต่ละบาน จากนั้นเราก็นำความแตกต่างระหว่าง maxes และ mins ซึ่งทำให้เราเบี่ยงเบนสำหรับแต่ละหน้าต่างแล้วคืนค่าmaxของพวกนั้น

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

1
ดีฉันรู้ว่ามีฟังก์ชั่นสำหรับการสร้างองค์ประกอบ แต่ไม่สามารถหาได้ นอกจากนี้เบื้องหลังการทำงานของพร็อกซีจึงไม่สามารถใช้แพ็คเกจภายนอกได้
Billywob

1
googling บางคนบอกฉันว่ามีgtools::rollingแต่ก็มีอีกหนึ่งไบต์และฉันไม่คุ้นเคยกับมัน ฉันมักจะคิดสองเรื่องเกี่ยวกับการใช้แพคเกจที่ไม่ใช่ฐาน: ในแง่หนึ่งมันรู้สึกเหมือนโกงเมื่อมีวิธีแก้ปัญหาง่ายๆ ในทางกลับกันแพ็คเกจ (และชุมชน) เป็นหนึ่งในจุดแข็งของ R ในภาษาที่ฉันคิด
rturnbull

3

R, 80 77 ไบต์ไบต์

แก้ไข: บันทึกแล้ว 3 ไบต์ขอบคุณ @rturnbull

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

@rtbull จับดี!
Billywob

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)ที่ค่าเริ่มต้น$i 0เราองค์ประกอบเหล่านั้นและเก็บผลเข้ามา|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

05AB1E , 12 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;}

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

คุณไม่มีวงเล็บเหลี่ยมสิ้นสุด ;)
Addison Crump

@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;}
Addison Crump

@VTCAKAVSMoACE ฉันไม่เชื่อว่าสิ่งที่คุณมีจะทำงาน - อาจจะผิด ลองสลับ 7 และ 1 ในกรณีทดสอบ อย่างไรก็ตามฉันสามารถใช้เพื่อกำจัดความคิดใหม่ของฉัน!
dpa97

1
ฉันไม่จำเป็นต้องใช้กล้ามเนื้อหน้าท้อง (ทำให้อัลโกแย่ลงกว่าเดิมในกระบวนการ) โดยเริ่มต้นที่ k เช่นกัน เคล็ดลับที่ดีงามมี x = (f = ... ) ในบรรทัดเดียวกันขอบคุณสำหรับที่
dpa97

2

Mathematica, 41 37 ไบต์

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

ไม่สามารถคุณใช้ผลิตภัณฑ์ที่มีจุด{-1,1}ที่จะหลีกเลี่ยงAbs?
ไมล์

@miles ขอบคุณ! แก้ไขคำตอบแล้ว
JungHwan Min

@JHM Max[BlockMap[MinMax,#,#2,1].{-1,1}]&หนึ่งไบต์บันทึกด้วย


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

คุณสามารถลองที่ Octave ที่ Ideone (แต่ Octave ซึ่งแตกต่างจาก Matlab จะต้องโหลดแพคเกจอิมเมจอย่างชัดเจน)

คำอธิบาย

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

สกาลา, 48 ไบต์

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

คำอธิบาย:

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

ลองออนไลน์!

-6 bytes จากการสังเกตในคำตอบของHaskellของ nimi ซึ่งจะสั้นกว่า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

สำหรับv=6,9,4,7,4,1 , d=3

แก้ไข: บันทึก 2 ไบต์ด้วยJörgHülsermann


echo+$o;แทนecho$o?:0;
JörgHülsermann


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

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 ไบต์

_#[]=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-1, d-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))))

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

การทดสอบ:

(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 ไบต์

นี่คือวิธีการแก้ปัญหา verbose 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();}

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

ทดสอบ:

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.”

หมายเหตุ: x, yถูกทิ้งไว้, อาร์กิวเมนต์ที่ถูกต้องตามลำดับ


0

Perl 6 , 44 ไบต์

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

$^aและ$^bเป็นสองอาร์กิวเมนต์ของฟังก์ชันที่เรียกvและdตามลำดับในคำสั่งปัญหา rotorวิธีการส่งกลับลำดับของ subsequences ของขนาดvd


0

Clojure, 73 67 ไบต์

แก้ไข: ใช้#(...)แทน(fn[...])และแทนformap

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.