计算数组的maxmax


19

考虑阵列x诸如[1 5 3 4]和一个数n,例如2。写所有的长度- n滑子阵:[1 5][5 3][3 4]。让极小极大阵列的被定义为最小的滑动块的最大值的。所以在这种情况下,这将是最小的5, 5, 4,这是4

挑战

给定一个数组x和一个正整数n,输出如上定义的minimax。

该数组x将仅包含正整数。n将始终至少为1,并且最多为x

计算可以通过任何过程来完成,而不必如上所述。

代码高尔夫,最少的字节数获胜。

测试用例

xn,导致

[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

Answers:


19

Dyalog APL,4个字节

⌊/⌈/

这是一元函数函数,期望分别将数组和整数作为左右参数。

尝试使用TryAPL

怎么运行的

一串由两个函数组成的函数位于atop上,这意味着首先调用右函数(带有两个参数),然后在它的顶部调用左一个(结果作为唯一参数)。

一元数f/仅仅减少了它的论点f。但是,如果以动态方式调用,f/则为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.

等待...您如何减少已经减少的东西?这不只是一个单一的元素吗?
Cyoce '16

@Cyoce N方向的减小产生一个最大值数组。例如,2 ⌈/ 1 2 3 4计算的最大值(1 2) (2 3) (3 4),因此返回2 3 4
丹尼斯

好。我认为这意味着N明智的减少采取了前N个元素并通过函数对其进行归约,例如2明智的减少只是正常的减少
Cyoce

应该算多少个字节?1或2?
njpipeorgan

1
@njpipeorgan取决于编码。APL有自己的旧版代码页(比Unicode早几十年),并且进行编码并且每个字节都是一个字节。
丹尼斯



3

Pyth,10个字节

hSmeSd.:QE

说明:

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

以表格形式输入 list newline int

在这里尝试!

或运行测试套件!

还是10个字节

hSeCSR.:EE

说明:

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

测试套件在这里


3

Oracle SQL 11.2,261个字节

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;

未打高尔夫球

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个字节

YCX>X<

在线尝试!

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

果冻,6个字节

ṡ»/€«/

在线尝试!

怎么运行的

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

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

感谢user81655帮助削减11个字节


都是积极的:(x,y,M=Math.max)=>-M(...x.slice(y-1).map((a,i)=>-M(...x.slice(i,i+y))))
edc65 '16

2

朱莉娅51字节

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

没什么太开创性的。这是一个接受数组和整数并返回整数的函数。它仅使用基本算法。如果min并且max不需要将数组添加到参数中,它将大大缩短。

我们得到每个重叠的子数组,取最大值,取结果的最小值。


2

Perl 6,32个字节

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

用法:

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字节

需要安装动物园。

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

编辑 -通过实现zoo::rollmax存在6个字节!


2

J,9个字节

[:<./>./\

与APL答案相似。>./\>./(最大值)应用于右arg的(左arg)个子集。然后,<./找到它的最小值,因为它的上限是[:

测试用例

   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个字节。

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

测试用例:

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个字节

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

递归计算两件事的最小值:第一个n条目的最大值,以及列表中第一个元素被删除的递归函数。对于列表的少于n元素的基本情况,给出空列表,该列表用作无穷大,因为Python 2将列表的数目大于数字。


1

JavaScript(ES6),70个字节

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

使用currying,此功能可从上一个答案中节省2个字节。

演示版

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个字节

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

测试用例

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

1

Java 7中,128个 126 124字节

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

取消测试代码:

在这里尝试。

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

输出:

4
3
1
42

1

球拍84字节

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

取消高尔夫:

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

测试:

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

输出:

4
3
42

1

Clojure,51个字节

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

1

SmileBASIC,68个字节

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

这里没什么特别的。输入是X[]N

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.