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
Luis Mendo
sumber

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.
Dennis
sumber
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
7

CJam (11 byte)

{ew::e>:e<}

Demo online

Peter Taylor
sumber
3
Sebuah program penuh akan menjadi q~ew::e>:e<, yang juga 11 byte
GamrCorps
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.

ryantk
sumber
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

Biru
sumber
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;
Jeto
sumber
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
Luis Mendo
sumber
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.
Dennis
sumber
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

Mwr247
sumber
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.

Alex A.
sumber
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
Brad Gilbert b2gills
sumber
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!

mnel
sumber
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
Conor O'Brien
sumber
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
Morgan Thrapp
sumber
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.

Tidak
sumber
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`}`)

Patrick Roberts
sumber
1

Mathematica, 23 byte

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

Kasus cobaan

%[{1,2,3,4,5},3]
(* 3 *)
njpipeorgan
sumber
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
Kevin Cruijssen
sumber
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
juga
sumber
1

Clojure, 51 byte

#(apply min(for[p(partition %2 1 %)](apply max p)))
NikoNyrh
sumber
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

12Me21
sumber