Hitung minimax dari array


19

Pertimbangkan sebuah array xseperti [1 5 3 4]dan angka n, misalnya 2. Menulis semua panjang- nsubarrays geser: [1 5], [5 3], [3 4]. Biarkan minimax dari array didefinisikan sebagai minimum dari maksimum blok geser. Jadi dalam hal ini akan menjadi minimum 5, 5, 4, yaitu 4.

Tantangan

Diberikan array xdan bilangan bulat positif n, output minimax seperti didefinisikan di atas.

Array xhanya akan berisi bilangan bulat positif. nakan selalu setidaknya 1dan paling banyak panjangnya x.

Komputasi dapat dilakukan dengan prosedur apa pun, tidak harus seperti yang didefinisikan di atas.

Golf kode, byte paling sedikit menang.

Uji kasus

x,, nhasil

[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

Jawaban:


19

Dyalog APL, 4 byte

⌊/⌈/

Ini adalah fungsi kereta monadik yang mengharapkan array dan integer sebagai argumen kanan dan kiri, resp.

Cobalah dengan TryAPL .

Bagaimana itu bekerja

Kereta dua fungsi adalah di atas , yang berarti bahwa yang kanan disebut pertama (dengan kedua argumen), lalu yang kiri disebut di atasnya (dengan hasil sebagai argumen tunggal).

Monadik f/hanya mengurangi argumennya dengan f. Namun, jika disebut secara dua arah, f/adalah n-bijaksana mengurangi, dan mengambil ukuran irisan sebagai argumen kirinya.

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

Tunggu ... Bagaimana Anda mengurangi sesuatu yang sudah berkurang? Bukankah itu hanya elemen tunggal?
Cyoce

@Cyoce N-Wise mengurangi menghasilkan array maxima. Misalnya 2 ⌈/ 1 2 3 4menghitung maksimal (1 2) (2 3) (3 4), sehingga kembali 2 3 4.
Dennis

Baik. Saya pikir itu berarti pengurangan N-bijaksana mengambil elemen N pertama dan menguranginya dengan fungsi, misalnya pengurangan 2-bijaksana hanya pengurangan normal
Cyoce

Berapa byte yang harus dihitung? 1 atau 2?
njpipeorgan

1
@ njpipeorgan Itu tergantung pada penyandian. APL memiliki halaman kode warisan sendiri (yang mendahului Unicode oleh beberapa dekade), dan encode dan sebagai satu byte setiap.
Dennis


5

Ruby 39 byte

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

Di mana x adalah array dan n adalah nomor untuk memotong array dengan.


Anda tidak berarti each_cons?
Bukan berarti Charles

3

Pyth, 10 byte

hSmeSd.:QE

Penjelasan:

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

Mengambil input dalam formulir list newline int

Coba di sini!

Atau jalankan Test Suite!

Atau juga 10 byte

hSeCSR.:EE

Penjelasan:

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

Test Suite di sini


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;

Tidak bermain golf

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<

Cobalah online!

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

Jelly, 6 byte

ṡ»/€«/

Cobalah online!

Bagaimana itu bekerja

ṡ»/€«/  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))))

Terima kasih kepada user81655 untuk membantu mengurangi 11 byte


Menjadi semua positif:(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)]...)

Tidak ada yang terlalu inovatif. Ini adalah fungsi yang menerima array dan integer dan mengembalikan integer. Itu hanya menggunakan algoritma dasar. Ini akan menjadi jauh lebih singkat jika mindan maxtidak memerlukan array array ke argumen.

Kami mendapatkan setiap subarray yang tumpang tindih, mengambil maks, dan mengambil min hasilnya.


2

Perl 6 , 32 byte

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

Pemakaian:

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

Membutuhkan kebun binatang untuk diinstal.

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

sunting - 6 byte dengan menyadari zoo::rollmaxada!


2

J, 9 byte

[:<./>./\

Mirip dengan jawaban APL. >./\berlaku >./(maksimum) ke (arg kiri) -subset dari arg kanan. Kemudian, <./temukan minimumnya, karena ditutup dengan [:.

Uji kasus

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

Kasus uji:

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

Secara rekursif menghitung minimum dua hal: maks dari nentri pertama , dan fungsi rekursif pada daftar dengan elemen pertama dihapus. Untuk kasus dasar dari daftar yang memiliki lebih sedikit dari nelemen, berikan daftar kosong, yang berfungsi sebagai tak terhingga karena Python 2 menempatkan daftar lebih besar daripada angka.


1

JavaScript (ES6), 70 byte

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

Menggunakan currying , fungsi ini menyimpan 2 byte dari jawaban sebelumnya.

Demo

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

Mathematica, 23 byte

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

Kasus cobaan

%[{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;}

Tidak digabungkan & kode uji:

Coba di sini.

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

Keluaran:

4
3
1
42

1

Racket 84 byte

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

Tidak Disatukan:

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

Pengujian:

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

Keluaran:

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

Tidak ada yang istimewa di sini. Inputnya adalah X[]danN

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.