Обчисліть мінімакс масиву


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.

Обчислення може проводитися будь-якою процедурою, не обов'язково як визначено вище.

Код гольфу, виграє найменше байтів.

Тестові справи

x, n, Результат

[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

Діалог APL, 4 байти

⌊/⌈/

Це поїзд монадичних функцій, який очікує масив і ціле число як аргументи справа, так і ліворуч, відповідно.

Спробуйте це з TryAPL .

Як це працює

Потяг з двох функцій знаходиться вгорі , тобто правий називається спочатку (з обома аргументами), потім лівий викликається зверху (з результатом як єдиним аргументом).

Монадік 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 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 протягом декількох десятиліть), і вона кодує і як один байт кожен.
Денніс


5

Рубін 39 байт

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

Де x - масив, а n - це число, за яким потрібно відрізати масив.


ти не маєш на увазі each_cons?
Не те, що Чарльз

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

Завдяки користувачеві81655 за те, що він допомагає голити 11 байт


(x,y,M=Math.max)=>-M(...x.slice(y-1).map((a,i)=>-M(...x.slice(i,i+y))))
Будьте

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

редагувати - 6 байт, зрозумівши, що zoo::rollmaxіснує!


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записів та рекурсивну функцію у списку із видаленим першим елементом. Для базового випадку списку, що містить менше 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

Математика, 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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.