Tính toán minimax của một mảng


19

Hãy xem xét một mảng xnhư [1 5 3 4]và một số n, ví dụ 2. Viết bài length- nsubarrays trượt: [1 5], [5 3], [3 4]. Đặt minimax của mảng được định nghĩa là cực tiểu của cực đại của các khối trượt. Vì vậy, trong trường hợp này, nó sẽ là tối thiểu 5, 5, 4, đó là 4.

Thử thách

Cho một mảng xvà một số nguyên dương n, xuất ra minimax như được định nghĩa ở trên.

Mảng xsẽ chỉ chứa các số nguyên dương. nsẽ luôn luôn ít nhất 1và nhiều nhất là chiều dài x.

Tính toán có thể được thực hiện bởi bất kỳ thủ tục, không nhất thiết như được xác định ở trên.

Mã golf, ít byte nhất thắng.

Các trường hợp thử nghiệm

x,, nkết quả

[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

Câu trả lời:


19

APL Dyalog, 4 byte

⌊/⌈/

Đây là một hàm hàm đơn trị, dự kiến ​​mảng và số nguyên là các đối số phải và trái, resp.

Hãy thử nó với TryAPL .

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

Một hàm gồm hai hàm là một đỉnh , có nghĩa là hàm bên phải được gọi đầu tiên (với cả hai đối số), sau đó hàm bên trái được gọi ở trên cùng của nó (với kết quả là đối số duy nhất).

Một đơn nguyên f/chỉ đơn giản là giảm đối số của nó bằng cách f. Tuy nhiên, nếu được gọi là dyadally, f/thì n-khôn giảm và lấy kích thước lát làm đối số bên trái của nó.

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

Đợi ... Làm thế nào để bạn giảm một cái gì đó đã được giảm? Không phải nó chỉ là một yếu tố đơn lẻ sao?
Cyoce

@Cyoce Giảm N-khôn mang lại một mảng cực đại. Ví dụ, 2 ⌈/ 1 2 3 4tính cực đại của (1 2) (2 3) (3 4), vì vậy nó trả về 2 3 4.
Dennis

Được. Tôi nghĩ rằng điều đó có nghĩa là việc giảm N-khôn đã lấy các yếu tố N đầu tiên và giảm chúng bằng chức năng, ví dụ như giảm 2 khôn ngoan chỉ là mức giảm bình thường
Cyoce

Có bao nhiêu byte nên được tính là? 1 hoặc 2?
njpipe Organ 16/2/2016

1
@njpipeorgan Điều đó phụ thuộc vào mã hóa. APL có trang mã kế thừa của riêng mình (trước Unicode vài thập kỷ) và nó mã hóa dưới dạng một byte mỗi.
Dennis


5

Ruby 39 byte

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

Trong đó x là mảng và n là số để chunk mảng theo.


ý bạn là each_conssao
Không phải Charles

3

Bình thường, 10 byte

hSmeSd.:QE

Giải trình:

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

Đưa đầu vào theo mẫu list newline int

Hãy thử nó ở đây!

Hoặc chạy Test Suite!

Hoặc cũng 10 byte

hSeCSR.:EE

Giải trình:

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

Test Suite tại đây


3

Oracle SQL 11.2, 261 byte

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;

Không chơi gôn

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

MATL , 6 byte

YCX>X<

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

YC    % Implicitly input array and number. Build a matrix with columns formed
      % by sliding blocks of the array with size given by the number
X>    % maximum of each column
X<    % minimum of all maxima

2

Thạch, 6 byte

ṡ»/€«/

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

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

ṡ»/€«/  Main link. Left input: A (list). Right input: n (integer)

ṡ       Split A into overlapping slices of length n.
 »/€    Reduce each slice by maximum.
    «/  Reduce the maxima by minimum.

2

JavaScript (ES6), 84 83 72 byte

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

Cảm ơn user81655 đã giúp cạo sạch 11 byte


Tất cả đều tích cực:(x,y,M=Math.max)=>-M(...x.slice(y-1).map((a,i)=>-M(...x.slice(i,i+y))))
edc65

2

Julia, 51 byte

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

Không có gì quá đột phá. Đây là một hàm chấp nhận một mảng và một số nguyên và trả về một số nguyên. Nó chỉ sử dụng thuật toán cơ bản. Nó sẽ ngắn hơn rất nhiều nếu minmaxkhông yêu cầu các mảng ghép thành các đối số.

Chúng tôi nhận được từng phân đoạn chồng chéo, lấy tối đa và lấy tối thiểu kết quả.


2

Perl 6 , 32 byte

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

Sử dụng:

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 byte

Yêu cầu sở thú được cài đặt.

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

chỉnh sửa - 6 byte bằng cách nhận ra zoo::rollmaxtồn tại!


2

J, 9 byte

[:<./>./\

Tương tự như câu trả lời của APL. >./\áp dụng >./(tối đa) cho các tập tin (bên trái) của các bên phải. Sau đó, <./tìm thấy mức tối thiểu của điều đó, vì nó được giới hạn [:.

Các trường hợp thử nghiệm

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

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

Các trường hợp thử nghiệm:

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 byte

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

Tính toán đệ quy tối thiểu của hai điều: tối đa của các nmục đầu tiên và hàm đệ quy trong danh sách với phần tử đầu tiên bị xóa. Đối với trường hợp cơ sở của danh sách có ít hơn ncác phần tử, hãy đưa ra danh sách trống, đóng vai trò là vô hạn vì Python 2 đặt danh sách lớn hơn số.


1

JavaScript (ES6), 70 byte

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

Sử dụng currying , chức năng này tiết kiệm 2 byte từ câu trả lời trước.

Bản giới thiệu

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

Toán học, 23 byte

Min@BlockMap[Max,##,1]&

Trường hợp thử nghiệm

%[{1,2,3,4,5},3]
(* 3 *)

1

Java 7, 128 126 124 byte

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

Mã thử nghiệm & mã hóa:

Hãy thử nó ở đây.

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

Đầu ra:

4
3
1
42

1

Vợt 84 byte

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

Ung dung:

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

Kiểm tra:

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

Đầu ra:

4
3
42

1

Clojure, 51 byte

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

1

SmileBASIC, 68 byte

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

Không có gì đặc biệt ở đây. Đầu vào là X[]N

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.