Calculer la minimax d'un tableau

19

Considérons un tableau xtel que [1 5 3 4]et un nombre n, par exemple 2. Écrivez tous longueur - nsous - tableaux coulissants: [1 5], [5 3], [3 4]. Soit le minimax du tableau défini comme le minimum des maxima des blocs glissants. Donc, dans ce cas, ce serait le minimum de 5, 5, 4, ce qui est 4.

Défi

Étant donné un tableau xet un entier positif n, affichez le minimax tel que défini ci-dessus.

Le tableau xne contiendra que des entiers positifs. nsera toujours au moins 1et au plus la longueur de x.

Le calcul peut être effectué par n'importe quelle procédure, pas nécessairement comme défini ci-dessus.

Code golf, le moins d'octets gagne.

Cas de test

x, n, Résultat

[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
la source

Réponses:

19

Dyalog APL, 4 octets

⌊/⌈/

Il s'agit d'un train de fonctions monadique qui attend un tableau et un entier comme arguments droit et gauche, resp.

Essayez-le avec TryAPL .

Comment ça fonctionne

Un train de deux fonctions est un sommet , ce qui signifie que celui de droite est appelé en premier (avec les deux arguments), puis celui de gauche est appelé au-dessus (avec le résultat comme seul argument).

Un monadique f/réduit simplement son argument de f. Cependant, s'il est appelé dyadiquement, il f/est réduit n et prend la taille de tranche comme argument de gauche.

⌊/⌈/    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
la source
Attendez ... Comment réduisez-vous quelque chose qui a déjà été réduit? N'est-ce pas juste un élément singulier?
Cyoce
@Cyoce La réduction N-sage donne un tableau de maxima. Par exemple, 2 ⌈/ 1 2 3 4calcule les maxima de (1 2) (2 3) (3 4), donc il revient 2 3 4.
Dennis
D'accord. Je pensais que cela signifiait qu'une réduction N-sage prenait les premiers N éléments et les réduisait avec la fonction, par exemple une réduction 2-sage est juste une réduction normale
Cyoce
Combien d'octets doivent être comptés comme? 1 ou 2?
njpipeorgan
1
@njpipeorgan Cela dépend de l'encodage. APL a sa propre page de codes héritée (qui est antérieure à Unicode de plusieurs décennies), et elle code et comme un seul octet chacune.
Dennis
7

CJam (11 octets)

{ew::e>:e<}

Démo en ligne

Peter Taylor
la source
3
Un programme complet serait q~ew::e>:e<, qui est également de 11 octets
GamrCorps
5

Ruby 39 octets

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

Où x est le tableau et n est le nombre par lequel découper le tableau.

ryantk
la source
tu ne veux pas dire each_cons?
Pas que Charles
3

Pyth, 10 octets

hSmeSd.:QE

Explication:

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

Prend entrée dans le formulaire list newline int

Essayez-le ici!

Ou lancez une suite de tests!

Ou aussi 10 octets

hSeCSR.:EE

Explication:

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

Test Suite ici

Bleu
la source
3

Oracle SQL 11.2, 261 octets

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;

Non 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
la source
2

MATL , 6 octets

YCX>X<

Essayez-le en ligne!

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
la source
2

Gelée, 6 octets

ṡ»/€«/

Essayez-le en ligne!

Comment ça fonctionne

ṡ»/€«/  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
la source
2

JavaScript (ES6), 84 83 72 octets

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

Merci à user81655 pour avoir aidé à raser 11 octets

Mwr247
la source
Être tout positif:(x,y,M=Math.max)=>-M(...x.slice(y-1).map((a,i)=>-M(...x.slice(i,i+y))))
edc65
2

Julia, 51 octets

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

Rien de trop révolutionnaire. Il s'agit d'une fonction qui accepte un tableau et un entier et renvoie un entier. Il utilise simplement l'algorithme de base. Ce serait beaucoup plus court simin et maxne nécessitait pas de répartir les tableaux en arguments.

Nous obtenons chaque sous-tableau qui se chevauchent, prenons le max et prenons le min du résultat.

Alex A.
la source
2

Perl 6 , 32 octets

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

Usage:

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
la source
2

R, 41 35 octets

Nécessite l'installation d'un zoo.

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

edit - 6 octets en réalisant qu'il zoo::rollmaxexiste!

mnel
la source
2

J, 9 octets

[:<./>./\

Similaire à la réponse APL. >./\s'applique >./(maximum) aux sous-ensembles (arg gauche) de l'arg droit. Ensuite, <./trouve le minimum, car il est plafonné avec[: .

Cas de test

   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
la source
1

Python 3, 55 octets.

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

Cas de test:

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
la source
1

Python 2, 50 octets

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

Calcule récursivement le minimum de deux choses: le maximum des premières nentrées et la fonction récursive de la liste avec le premier élément supprimé. Pour un cas de base de la liste ayant moins de que néléments, donne la liste vide, qui sert d'infini car Python 2 place les listes comme supérieures aux nombres.

xnor
la source
1

JavaScript (ES6), 70 octets

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

En utilisant le curry , cette fonction enregistre 2 octets de la réponse précédente.

Démo

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
la source
1

Mathematica, 23 octets

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

Cas de test

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

Java 7, 128 126 124 octets

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

Code non testé et testé:

Essayez-le ici.

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

Production:

4
3
1
42
Kevin Cruijssen
la source
1

Raquette 84 octets

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

Non golfé:

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

Essai:

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

Production:

4
3
42
rnso
la source
1

Clojure, 51 octets

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

SmileBASIC, 68 octets

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

Rien de spécial ici. Les entrées sont X[]etN

12Me21
la source