Berechnen Sie die Minimax eines Arrays

19

Betrachten wir eine Anordnung , xwie beispielsweise [1 5 3 4]und eine Anzahl n, beispielsweise 2. Schreiben Sie alle längs- nSchiebe Subarrays: [1 5], [5 3], [3 4]. Die Minimax des Arrays sei definiert als das Minimum der Maxima der Gleitblöcke. Also in diesem Fall wäre es das Minimum von 5, 5, 4, was ist 4.

Herausforderung

Geben Sie bei einem Array xund einer positiven Ganzzahl ndie oben definierte Minimax aus.

Das Array xenthält nur positive ganze Zahlen. nwird immer mindestens 1und höchstens die Länge von x.

Die Berechnung kann durch ein beliebiges Verfahren erfolgen, das nicht unbedingt wie oben definiert ist.

Code Golf, gewinnt die wenigsten Bytes.

Testfälle

x, nErgeben sich

[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
quelle

Antworten:

19

Dyalog APL, 4 Bytes

⌊/⌈/

Dies ist ein monadischer Funktionszug, der Array und Integer als rechtes bzw. linkes Argument erwartet.

Probieren Sie es mit TryAPL .

Wie es funktioniert

Ein Zug von zwei Funktionen ist eine Spitze , was bedeutet, dass die rechte zuerst (mit beiden Argumenten) und die linke darüber (mit dem Ergebnis als alleinigem Argument) aufgerufen wird.

Eine Monade f/reduziert einfach ihre Argumentation um f. Wenn es jedoch dyadisch aufgerufen wird, f/wird es n- fach reduziert und die Slice-Größe als linkes Argument verwendet.

⌊/⌈/    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
quelle
Warten Sie ... Wie können Sie etwas reduzieren, das bereits reduziert wurde? Ist es nicht nur ein einzigartiges Element?
Cyoce
@Cyoce Die N-weise Reduktion ergibt eine Reihe von Maxima. 2 ⌈/ 1 2 3 4Berechnet zum Beispiel das Maximum von (1 2) (2 3) (3 4)und gibt es zurück 2 3 4.
Dennis
Okay. Ich dachte, es bedeutete, dass eine N-weise Reduktion die ersten N Elemente nahm und sie mit der Funktion reduzierte, z. B. ist eine 2-weise Reduktion nur eine normale Reduktion
Cyoce
Wie viele Bytes sollen gezählt werden? 1 oder 2?
njpipeorgan
1
@njpipeorgan Das hängt von der Kodierung ab. APL hat seine eigene Legacy - Code - Seite (die von mehreren Jahrzehnten Unicode früher), und es kodiert und als ein einziges Byte jeder.
Dennis
7

CJam (11 Bytes)

{ew::e>:e<}

Online-Demo

Peter Taylor
quelle
3
Ein volles Programm wäre q~ew::e>:e<, was auch 11 Bytes sind
GamrCorps
5

Ruby 39 Bytes

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

Dabei ist x das Array und n die Zahl, nach der das Array aufgeteilt werden soll.

Ryantk
quelle
Meinst du nicht each_cons?
Nicht dass Charles
3

Pyth, 10 Bytes

hSmeSd.:QE

Erläuterung:

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

Nimmt Eingaben in das Formular auf list newline int

Probieren Sie es hier aus!

Oder führen Sie eine Testsuite aus!

Oder auch 10 Bytes

hSeCSR.:EE

Erläuterung:

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

Test Suite hier

Blau
quelle
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;

Nicht golfen

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
quelle
2

MATL , 6 Bytes

YCX>X<

Probieren Sie es 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
quelle
2

Gelee, 6 Bytes

ṡ»/€«/

Probieren Sie es online!

Wie es funktioniert

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

Vielen Dank an user81655 für die Hilfe bei der Reduzierung von 11 Bytes

Mwr247
quelle
Alles positiv:(x,y,M=Math.max)=>-M(...x.slice(y-1).map((a,i)=>-M(...x.slice(i,i+y))))
edc65
2

Julia, 51 Bytes

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

Nichts zu bahnbrechend. Dies ist eine Funktion, die ein Array und eine Ganzzahl akzeptiert und eine Ganzzahl zurückgibt. Es wird nur der grundlegende Algorithmus verwendet. Es wäre viel kürzer, wenn minundmax nicht splatting Arrays in Argumente erforderlich ist.

Wir erhalten jedes überlappende Subarray, nehmen das Maximum und das Minimum des Ergebnisses.

Alex A.
quelle
2

Perl 6 , 32 Bytes

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

Verwendung:

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
quelle
2

R 41 35 Bytes

Erfordert die Installation des Zoos.

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

bearbeiten - 6 Bytes durch Realisieren zoo::rollmaxvorhanden!

mnel
quelle
2

J 9 Bytes

[:<./>./\

Ähnlich wie bei der APL-Antwort. >./\gilt >./(maximal) für die (left arg) -Untergruppen des rechten Arg. Dann <./findet man das Minimum davon, da es mit einer Kappe versehen ist[: .

Testfälle

   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
quelle
1

Python 3, 55 Bytes.

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

Testfälle:

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
quelle
1

Python 2, 50 Bytes

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

Berechnet rekursiv das Minimum von zwei Dingen: das Maximum der ersten nEinträge und die rekursive Funktion in der Liste, bei der das erste Element entfernt wurde. Gibt für einen Basisfall der Liste mit weniger als nElementen die leere Liste an, die als unendlich dient, da Python 2 Listen als größer als Zahlen einfügt.

xnor
quelle
1

JavaScript (ES6), 70 Byte

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

Bei Verwendung von currying werden mit dieser Funktion 2 Bytes der vorherigen Antwort eingespart.

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
quelle
1

Mathematica, 23 Bytes

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

Testfall

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

Java 7, 128 126 124 Bytes

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 & Testcode:

Probieren Sie es hier aus.

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

Ausgabe:

4
3
1
42
Kevin Cruijssen
quelle
1

Schläger 84 Bytes

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

Testen:

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

Ausgabe:

4
3
42
rnso
quelle
1

Clojure, 51 Bytes

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

SmileBASIC, 68 Bytes

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

Nichts besonderes hier. Eingänge sind X[]undN

12Me21
quelle