Найти подматрицу с наименьшим средним


21

Вы дали n-м-м матрица целых чисел × , где n, m> 3 . Ваша задача - найти подматрицу 3 на 3, которая имеет наименьшее среднее значение, и вывести это значение.

Правила и разъяснения:

  • Целые числа будут неотрицательными
  • Дополнительный формат ввода и вывода
  • Вывод должен быть точным, по крайней мере, до 2 десятичных точек (если это не целое число)
  • Подматрицы должны состоять из последовательных строк и столбцов

Тестовые случаи:

35    1    6   26   19   24
 3   32    7   21   23   25
31    9    2   22   27   20
 8   28   33   17   10   15
30    5   34   12   14   16
 4   36   29   13   18   11 

Minimum mean: 14

100    65     2    93
  3    11    31    89
 93    15    95    65
 77    96    72    34

Minimum mean: 46.111

1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1
1   1   1   1   1   1   1   1

Minimum mean: 1

4   0   0   5   4
4   5   8   4   1
1   4   9   3   1
0   0   1   3   9
0   3   2   4   8
4   9   5   9   6
1   8   7   2   7
2   1   3   7   9

Minimum mean: 2.2222

Это поэтому выигрывает самый короткий код на каждом языке. Я призываю людей публиковать ответы на языках, которые уже используются, даже если они не короче, чем первый.


Также было бы интересно иметь задачу с необязательно смежными строками и столбцами
Луис Мендо,

Нет, иди вперед сам :-)
Луис Мендо

Вы имеете в виду целые числа в математическом смысле или смысле типа данных, то есть можем ли мы взять матрицу целочисленных чисел с плавающей точкой?
Деннис

Математический смысл Это одна вещь, которую я узнал здесь, это то, что вы можете делать предположения о типах данных на разных языках ...
Stewie Griffin

Сладкий, это сохраняет байт. Спасибо за разъяснение.
Деннис

Ответы:



11

Желе , 11 9 байт

+3\⁺€F÷9Ṃ

Сохранено 2 байта благодаря @ Деннис .

Попробуйте онлайн!

объяснение

+3\⁺€F÷9Ṃ  Main link. Input: 2d matrix
+3\        Reduce overlapping sublists of size 3 by addition
   ⁺€      Repeat previous except over each row
     F     Flatten
      ÷9   Divide by 9
        Ṃ  Minimum

1
О,> _ <конечно: D
Джонатан Аллан

Я был бы заинтересован в нежелой версии желе, так как в нем так много полезных функций.
Дж Аткин

1
+3\⁺€F÷9Ṃсохраняет пару байтов.
Деннис

@ Деннис Вау, это действительно обработка +3\сначала и дубликат как +3\€? Не ожидал , что произойдет
миль

1
Парсер по существу основан на стеке; \выскакивает 3и +и нажимает на быструю ссылку +3\, извлекает быструю ссылку и выдвигает две копии, затем выскакивает самую верхнюю копию и выдвигает версию сопоставления.
Деннис


8

MATL , 13 9 байт

3thYCYmX<

Порт ответа @ rahnema1 .

Попробуйте онлайн!

Как это устроено

Рассмотрим вход

[100 65  2 93;
   3 11 31 89;
  93 15 95 65;
  77 96 72 34]

В качестве примера.

3th   % Push [3 3]
      % STACK: [3 3]
YC    % Input matrix implicitly. Convert 3x3 sliding blocks into columns
      % STACK: [100   3  65  11;
                  3  93  11  15;
                 93  77  15  96;
                 65  11   2  31;
                 11  15  31  95;
                 15  96  95  72;
                  2  31  93  89;
                 31  95  89  65;
                 95  72  65  34]
Ym    % Mean of each column
      % STACK: [46.1111 54.7778 51.7778 56.4444]
X<    % Minimum of vector. Display implicitly
      % STACK: [46.1111]

7

Mathematica, 37 35 байт

Спасибо @MartinEnder за 2 байта!

Min@BlockMap[Mean@*Mean,#,{3,3},1]&

объяснение

Min@BlockMap[Mean@*Mean,#,{3,3},1]&
    BlockMap[                    ]&  (* BlockMap function *)
                        #            (* Divide the input *)
                          {3,3}      (* Into 3x3 matrices *)
                                1    (* With offset 1 *)
             Mean@*Mean              (* And apply the Mean function twice to
                                        each submatrix *)
Min                                  (* Find the minimum value *)

Очень очень гладко!
Грег Мартин

5

Python 2 , 93 81 80 79 байтов

f=lambda M:M[2:]and min(sum(sum(zip(*M[:3])[:3],()))/9,f(M[1:]),f(zip(*M)[1:]))

Попробуйте онлайн!

Как это устроено

f является рекурсивной функцией, которая берет список кортежей (или любой другой индексируемой двумерной итерируемой, которая представляет матрицу M ) и рекурсивно вычисляет минимум среднего значения подматрицы 3 × 3 в верхнем левом углу, а f применяется рекурсивно к M без его первый ряд и М без первого столбца.

f(M) делает следующее.

  • Если M имеет менее трех строк, M[2:]это пустой список, который возвращает f .

    Обратите внимание, что, поскольку n> 3 при первом запуске, начальный не может вернуть пустой список.

  • Если M имеет три строки или более, M[2:]является непустым и, следовательно, правдивым, поэтому код справа от andвыполняется, возвращая минимум из трех следующих значений.

    min(sum(sum(zip(*M[:3])[:3],()))/9

    M[:3]возвращает первые три строки M , zip(*...)транспонирует строки и столбцы (получая список кортежей), sum(...,())объединяет все кортежи (это работает, потому что +это конкатенация) и sum(...)/9вычисляет среднее значение результирующего списка из девяти целых чисел.

    f(M[1:])

    рекурсивно применяет f к M с удалением первого ряда.

    f(zip(*M)[1:])

    транспонирует строки и столбцы, удаляет первую строку результата (поэтому первый столбец M и рекурсивно применяет f к результату.

Обратите внимание, что ранее удаленный слой в рекурсивном вызове всегда будет строкой, поэтому всегда будет достаточно проверить , достаточно ли в M строк.

Наконец, можно ожидать, что некоторые рекурсивные вызовы возвращаются [] будет проблемой. Однако в Python 2 всякий раз, когда n является числом и A является итеративным, сравнение n < Aвозвращает True , поэтому вычисление минимума одного или нескольких чисел и одной или нескольких итераций всегда будет возвращать наименьшее число.


3

J , 21 байт

[:<./@,9%~3+/\3+/\"1]

Попробуйте онлайн!

Правильный способ работы с подмассивами в J - использовать третью ( _3) форму обрезки, ;.где x (u;._3) yозначает применение глагола.u к каждому полному xмассиву размера массива y. Решение, использующее это, требует только 1 байт, но будет намного более эффективным на больших массивах.

[:<./@,9%~3 3+/@,;._3]

Попробуйте онлайн!

объяснение

[:<./@,9%~3+/\3+/\"1]  Input: 2d array M
                    ]  Identity. Get M
                  "1   For each row
              3  \       For each overlapping sublist of size 3
               +/          Reduce by addition
          3  \         For each overlapping 2d array of height 3
           +/            Reduce by addition
       9%~             Divide by 9
[:    ,                Flatten it
  <./@                 Reduce by minimum

1
Мне нравится, как []они выглядят, но на самом деле это не так.
Линн

1
@ Линн Подожди секунду, это не правильно. J должен отвлекать зрителей несколькими несбалансированными скобками. Должен был использовать [или |:)
миль

2

Желе , 18 байт

Пропустил трюк, использованный милями в своем ответе , с использованием n-мудрого кумулятивного уменьшения сложения - всю первую строку можно заменить +3\на 11.

ẆµL=3µÐfS€
ÇÇ€FṂ÷9

Попробуйте онлайн!

Обходит все смежные подсписки, фильтры для хранения только тех, которые имеют длину 3 и суммы (которые векторизируются), затем повторяются для каждого результирующего списка, чтобы получить суммы всех 3 на 3 подматрицы и, наконец, объединить их в один список, взять минимум и делится на 9 (количество элементов, составляющих эту минимальную сумму).


Мне нравится идея фильтрующих списков. Полезно, если размер подсписка зависит от вычисленного значения.
миль

2

Pyth, 19 байт

chSsMsMs.:R3C.:R3Q9

Программа, которая принимает ввод списка списков и печатает результат.

Тестирование

Как это устроено

[Объяснение будет позже]



1

Python 2, 96 байт

h=lambda a:[map(sum,zip(*s))for s in zip(a,a[1:],a[2:])]
lambda a:min(map(min,h(zip(*h(a)))))/9.

Тестовые случаи на Repl.it

Безымянная функция, принимающая список списков, a- строки матрицы.

Вспомогательная функция hперебирает три соседних среза и отображает функцию суммы по транспонированию,zip(*s) каждого из них. Это приводит к суммированию всех высот трех срезов отдельных столбцов.

Неименованная функция вызывает вспомогательную функцию, транспонирует и снова вызывает вспомогательную функцию для результата, затем находит минимум каждого и минимум результата, на который она затем делится, 9.чтобы получить среднее значение.


1

JavaScript (ES6), 107 98 96 байт

Функция, которая вычисляет суммы триплетов по строкам, а затем вызывает себя, чтобы сделать то же самое со столбцами, отслеживая минимальное значение M.

f=m=>m.map((r,y)=>r.map((v,x)=>M=(z[x<<9|y]=v+=r[x+1]+r[x+2])<M?v:M),z=[M=1/0])&&m[1]?f([z]):M/9

JS немного многословен для такого рода вещей и не имеет собственного zip()метода. Мне потребовалось довольно много времени, чтобы сэкономить всего дюжину байтов по сравнению с более наивным подходом. (Тем не менее, более короткий метод, вероятно, существует.)

Нерекурсивная версия, 103 байта

Сохранено 2 байта с помощью Нила

m=>m.map((r,y)=>y>1?r.map((v,x)=>[..."12345678"].map(i=>v+=m[y-i%3][x+i/3|0])&&(M=v<M?v:M)):M=1/0)&&M/9

Контрольные примеры


Меня несколько интересует ваш так называемый наивный подход, поскольку лучшее, что я мог сделать с достаточно чистым подходом, было 113 байтов:(a,b=a.map(g=a=>a.slice(2).map((e,i)=>a[i]+a[i+1]+e)))=>eval(`Math.min(${b[0].map((_,i)=>g(b.map(a=>a[i])))})`)/9
Нил

@ Нил Я думаю, что это было что-то близкое m=>m.map((r,y)=>r.map((v,x)=>[..."12345678"].map(i=>v+=(m[y+i/3|0]||[])[x+i%3])&&(M=v<M?v:M)),M=1/0)&&M/9, хотя я думаю, что моя первая попытка была на самом деле больше, чем это.
Арно

Приятно, хотя мне удалось побрить байт: m=>m.map((r,y)=>y>1&&r.map((v,x)=>[..."12345678"].map(i=>v+=m[y-i%3][x+i/3|0])&&(M=v<M?v:M)),M=1/0)&&M/9 .
Нил

@Neil Круто. Это позволяет сохранить один байт сm=>m.map((r,y)=>y>1?r.map((v,x)=>[..."12345678"].map(i=>v+=m[y-i%3][x+i/3|0])&&(M=v<M?v:M)):M=1/0)&&M/9
Arnauld

1

05AB1E , 21 16 байт

2FvyŒ3ùO})ø}˜9/W

Попробуйте онлайн!

объяснение

2F         }       # 2 times do:
  v     }          # for each row in the matrix
   yŒ3ù            # get all sublists of size 3
       O           # reduce by addition
         )ø        # transpose matrix
            ˜      # flatten the matrix to a list
             9/    # divide each by 9
               W   # get the minimum

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.