配列のミニマックスを計算する


19

アレイ検討xなど[1 5 3 4]と番号nたとえば、2。すべての長さ-書くnスライディングサブアレイを:[1 5][5 3][3 4]。配列のミニマックスをスライディングブロックの最大値の最小値として定義します。それで、この場合5, 5, 4、それは最小であるでしょう、それは4です。

チャレンジ

配列xと正の整数を指定すると、n上記で定義されたミニマックスを出力します。

配列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

回答:


19

Dyalog APL、4バイト

⌊/⌈/

これは、配列と整数を左右の引数として受け取る単項関数列です。

TryAPLで試してください。

使い方

2つの関数の列はatopで、右側の関数が最初に(両方の引数で)呼び出され、次に左側の関数が(その結果を唯一の引数として)呼び出されます。

モナドはf/単純に引数をで減らしますf。ただし、dyadicallyに呼び出された場合、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 N-wise reduceは最大値の配列を生成します。たとえば2 ⌈/ 1 2 3 4、の最大値を計算する(1 2) (2 3) (3 4)ため、を返します2 3 4
デニス

OK。N-wise reduceは最初のN個の要素を取り、関数でそれらを削減することを意味すると考えました。たとえば、2-wise reduceは単なる通常の削減です
16

何バイトをカウントする必要がありますか?1または2?
njpipeorgan

1
@njpipeorganそれはエンコーディングに依存します。APLには独自のレガシーコードページ(Unicodeよりも数十年前に作成されたもの)があり、それぞれ1バイトとしてエンコードます。
デニス



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

JavaScript(ES6)、84 83 72バイト

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

11バイトを削るのを助けてくれたuser81655に感謝


すべてがポジティブであること:(x,y,M=Math.max)=>-M(...x.slice(y-1).map((a,i)=>-M(...x.slice(i,i+y))))
edc65

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の回答に似ています。(最大)を右引数の(左引数)サブセットに>./\適用します>./。次に、で<./上限が設定されて[:いるため、その最小値を見つけます。

テストケース

   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エントリの最大値と、最初の要素が削除されたリストの再帰関数の2つの最小値を再帰的に計算します。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

ジャワ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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.