คำนวณ minimax ของอาร์เรย์


19

พิจารณาอาร์เรย์xเช่น[1 5 3 4]และจำนวนตัวอย่างเช่นn 2เขียน length- ทั้งหมดnsubarrays [1 5]เลื่อน: [5 3], [3 4], ปล่อยให้minimaxของ array ถูกกำหนดเป็นค่าต่ำสุดของ maxima ของบล็อกแบบเลื่อน ดังนั้นในกรณีนี้ก็จะเป็นขั้นต่ำของซึ่งเป็น5, 5, 44

ท้าทาย

ให้อาร์เรย์xและจำนวนเต็มบวกnเอาท์พุท minimax ตามที่นิยามไว้ข้างต้น

อาร์เรย์xจะมีจำนวนเต็มบวกเท่านั้น nมักจะเป็นอย่างน้อยและในที่สุดความยาวของ1x

การคำนวณอาจทำได้โดยขั้นตอนใด ๆ โดยไม่จำเป็นต้องเป็นไปตามที่กำหนดไว้ข้างต้น

รหัสกอล์ฟน้อยที่สุดที่จะชนะ

กรณีทดสอบ

x, nส่งผลให้เกิด

[1 5 3 4], 2                    4
[1 2 3 4 5], 3                  3
[1 1 1 1 5], 4                  1
[5 42 3 23], 3                 42

คำตอบ:


19

Dyalog APL ขนาด 4 ไบต์

⌊/⌈/

นี่คือการฝึกฟังก์ชั่น monadic ที่คาดว่าอาเรย์และจำนวนเต็มเป็นอาร์กิวเมนต์ด้านขวาและซ้าย, resp

ลองกับTryAPL

มันทำงานอย่างไร

รถไฟของทั้งสองฟังก์ชั่นคือบนยอดซึ่งหมายความว่าหนึ่งถูกเรียกว่าเป็นครั้งแรก (ด้วยการขัดแย้งทั้งสอง) จากนั้นหนึ่งที่เหลือเรียกว่าด้านบนของมัน (มีผลเป็นอาร์กิวเมนต์เพียงอย่างเดียว)

เอกก็จะช่วยลดการโต้แย้งโดยf/ fอย่างไรก็ตามถ้าเรียกว่า dyadically f/จะลด n-wise และใช้ขนาดชิ้นเป็นอาร์กิวเมนต์ซ้าย

⌊/⌈/    Monadic function. Right argument: A (array). Left argument: n (list)

  ⌈/    N-wise reduce A by maximum, using slices of length n.
⌊/      Reduce the maxima by minimum.

รอสักครู่ ... คุณลดบางสิ่งที่ถูกลดไปแล้วได้อย่างไร? มันไม่ใช่แค่องค์ประกอบที่แปลกประหลาดใช่ไหม
Cyoce

@Cyoce N-wise ลดผลตอบแทนอาร์เรย์ของ maxima ยกตัวอย่างเช่น2 ⌈/ 1 2 3 4การคำนวณสูงสุดของจึงส่งกลับ(1 2) (2 3) (3 4) 2 3 4
เดนนิส

ตกลง. ฉันคิดว่ามันหมายถึงการลด N-wise เอาองค์ประกอบ N แรกและลดพวกเขาด้วยฟังก์ชั่นเช่นการลด 2-wise เป็นเพียงการลดลงตามปกติ
Cyoce

ควรนับเป็นกี่ไบต์ 1 หรือ 2
njpipeorgan

1
@njpipeorgan ขึ้นอยู่กับการเข้ารหัส APL มีหน้ารหัสดั้งเดิมของตัวเอง (ซึ่งมีมาก่อน Unicode หลายทศวรรษ) และมันเข้ารหัสและเป็นไบต์เดียว
เดนนิส


5

ทับทิม 39 ไบต์

->(x,n){x.each_slice(n).map(&:max).min}

โดยที่ x คืออาร์เรย์และ n คือจำนวนที่จะทำให้อาร์เรย์เป็นแถว


คุณไม่หมายถึงeach_consเหรอ
ไม่ใช่ว่า Charles

3

Pyth, 10 ไบต์

hSmeSd.:QE

คำอธิบาย:

           - autoassign Q = eval(input())
      .:QE -   sublists(Q, eval(input())) - all sublists of Q of length num
  meSd     -  [sorted(d)[-1] for d in ^]
hS         - sorted(^)[0]

รับอินพุตในแบบฟอร์ม list newline int

ลองที่นี่!

หรือเรียกใช้ชุดทดสอบ!

หรือ 10 ไบต์

hSeCSR.:EE

คำอธิบาย:

      .:EE -    sublists(Q, eval(input())) - all sublists of Q of length num 
    SR     -   map(sorted, ^)
  eC       -  transpose(^)[-1]
hS         - sorted(^)[0]

ทดสอบชุดที่นี่


3

Oracle SQL 11.2, 261 ไบต์

SELECT MIN(m)FROM(SELECT MAX(a)OVER(ORDER BY i ROWS BETWEEN CURRENT ROW AND :2-1 FOLLOWING)m,SUM(1)OVER(ORDER BY i ROWS BETWEEN CURRENT ROW AND:2-1 FOLLOWING)c FROM(SELECT TRIM(COLUMN_VALUE)a,rownum i FROM XMLTABLE(('"'||REPLACE(:1,' ','","')||'"'))))WHERE:2=c;

ยกเลิกแข็งแรงเล่นกอล์ฟ

SELECT MIN(m)
FROM   (
         SELECT MAX(a)OVER(ORDER BY i ROWS BETWEEN CURRENT ROW AND :2-1 FOLLOWING)m,
                SUM(1)OVER(ORDER BY i ROWS BETWEEN CURRENT ROW AND :2-1 FOLLOWING)c
         FROM   (
                  SELECT TRIM(COLUMN_VALUE)a,rownum i 
                  FROM XMLTABLE(('"'||REPLACE(:1,' ','","')||'"'))
                )
       )
WHERE :2=c;



2

JavaScript (ES6), 84 83 72 ไบต์

(x,y)=>Math.min(...x.slice(y-1).map((a,i)=>Math.max(...x.slice(i,i+y))))

ขอบคุณ user81655 ที่ช่วยให้สามารถโกนได้ 11 ไบต์


เป็นบวกทั้งหมด:(x,y,M=Math.max)=>-M(...x.slice(y-1).map((a,i)=>-M(...x.slice(i,i+y))))
edc65

2

จูเลีย 51 ไบต์

f(x,n)=min([max(x[i-n+1:i]...)for i=m:endof(x)]...)

ไม่มีอะไรแหวกแนวเกินไป นี่คือฟังก์ชั่นที่ยอมรับอาร์เรย์และจำนวนเต็มและส่งกลับจำนวนเต็ม มันใช้อัลกอริธึมพื้นฐาน มันจะสั้นกว่านี้ถ้าminและmaxไม่จำเป็นต้องใช้อาร์เรย์เป็นเครื่องหมายในการโต้เถียง

เราได้รับแต่ละ subarray ที่ทับซ้อนกันรับค่าสูงสุดและรับค่าต่ำสุดของผลลัพธ์


2

Perl 6 , 32 ไบต์

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

การใช้งาน:

my &minimax = {@^a.rotor($^b=>1-$b)».max.min}

say minimax [1,5,3,4], 2;    # 4
say minimax [1,2,3,4,5], 3;  # 3
say minimax [1,1,1,1,5], 4;  # 1
say minimax [5,42,3,23], 3;  # 42

2

R, 41 35 ไบต์

ต้องติดตั้งสวนสัตว์

function(x,n)min(zoo::rollmax(x,n))

แก้ไข - 6 ไบต์โดยการรับรู้zoo::rollmaxอยู่!


2

J, 9 ไบต์

[:<./>./\

คล้ายกับคำตอบ APL >./\ใช้>./(สูงสุด) กับ (arg ซ้าย) - ชุด arg ขวา จากนั้นพบว่าอย่างน้อยว่าเนื่องจากมันปกคลุมด้วย<./[:

กรณีทดสอบ

   f =: [:<./>./\
   2 f 1 5 3 4
4
   3 f 1 2 3 4 5
3
   3 f 1 1 1 1 5
1
   3 f 5 42 3 23
42

1

Python 3, 55 ไบต์

lambda x,n:min(max(x[b:b+n])for b in range(len(x)-n+1))

กรณีทดสอบ:

assert f([1, 5, 3, 4], 2) == 4
assert f([1, 2, 3, 4, 5], 3) == 3
assert f([1, 1, 1, 1, 5], 4) == 1
assert f([5, 42, 3, 23], 3 ) == 42

1

Python 2, 50 ไบต์

f=lambda l,n:l[n-1:]and min(max(l[:n]),f(l[1:],n))

คำนวณซ้ำอย่างน้อยสองสิ่ง: จำนวนสูงสุดของnรายการแรกและฟังก์ชั่นซ้ำในรายการที่มีองค์ประกอบแรกถูกลบ สำหรับกรณีพื้นฐานของรายการที่มีnองค์ประกอบน้อยกว่าให้รายการที่ว่างซึ่งทำหน้าที่เป็นอินฟินิตี้เพราะ Python 2 ทำให้รายการมีค่ามากกว่าตัวเลข


1

JavaScript (ES6), 70 ไบต์

x=>n=>-M(...x.slice(n-1).map((_,i)=>-M(...x.slice(i,i+n)))),M=Math.max

ใช้curryingฟังก์ชั่นนี้จะช่วยประหยัด 2 ไบต์จากคำตอบก่อนหน้านี้

การสาธิต

f=x=>n=>-M(...x.slice(n-1).map((_,i)=>-M(...x.slice(i,i+n)))),M=Math.max
a=[[[1,5,3,4],2,4],[[1,2,3,4,5],3,3],[[1,1,1,1,5],4,1],[[5,42,3,23],3,42]]
document.write(`<pre>${a.map(r=>`${f(r[0])(r[1])==r[2]?'PASS':'FAIL'} ${r[1]}=>${r[2]}`).join`\n`}`)



1

Java 7, 128 126 124 ไบต์

int c(int[]x,int n){int i=-1,j,q,m=0;for(;i++<x.length-n;m=m<1|q<m?q:m)for(q=x[i],j=1;j<n;j++)q=x[i+j]>q?x[i+j]:q;return m;}

Ungolfed & รหัสการทดสอบ:

ลองที่นี่

class M{
  static int c(int[] x, int n){
    int i = -1,
        j,
        q,
        m = 0;
    for(; i++ < x.length - n; m = m < 1 | q < m
                                           ? q
                                           : m){
      for(q = x[i], j = 1; j < n; j++){
        q = x[i+j] > q
             ? x[i+j]
             : q;
      }
    }
    return m;
  }

  public static void main(String[] a){
    System.out.println(c(new int[]{ 1, 5, 3, 4 }, 2));
    System.out.println(c(new int[]{ 1, 2, 3, 4, 5 }, 3));
    System.out.println(c(new int[]{ 1, 1, 1, 1, 5 }, 4));
    System.out.println(c(new int[]{ 5, 42, 3, 23 }, 3));
  }
}

เอาท์พุท:

4
3
1
42

1

แร็กเก็ต 84 ไบต์

(λ(l i)(apply min(for/list((j(-(length l)(- i 1))))(apply max(take(drop l j) i)))))

Ungolfed:

(define f
  (λ (l i)
    (apply min (for/list ((j (- (length l)
                                (- i 1))))
                 (apply max (take (drop l j) i))
                 ))))

การทดสอบ:

(f '[1 5 3 4]  2)
(f '[1 2 3 4 5] 3)
(f '[5 42 3 23] 3)

เอาท์พุท:

4
3
42


1

SmileBASIC ขนาด 68 ไบต์

M=MAX(X)DIM T[N]FOR I=.TO LEN(X)-N-1COPY T,X,I,N
M=MIN(M,MAX(T))NEXT

ไม่มีอะไรพิเศษที่นี่ อินพุตเป็นX[]และN

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