Вы дали 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
Это код-гольф, поэтому выигрывает самый короткий код на каждом языке. Я призываю людей публиковать ответы на языках, которые уже используются, даже если они не короче, чем первый.
Ответы:
Октава, 30 байт
Попробуйте онлайн!
источник
Желе ,
119 байтСохранено 2 байта благодаря @ Деннис .
Попробуйте онлайн!
объяснение
источник
+3\⁺€F÷9Ṃ
сохраняет пару байтов.+3\
сначала и дубликат как+3\€
? Не ожидал , что произойдет\
выскакивает3
и+
и нажимает на быструю ссылку+3\
,⁺
извлекает быструю ссылку и выдвигает две копии, затем€
выскакивает самую верхнюю копию и выдвигает версию сопоставления.Октава, 38 байт
источник
MATL ,
139 байтПорт ответа @ rahnema1 .
Попробуйте онлайн!
Как это устроено
Рассмотрим вход
В качестве примера.
источник
Mathematica,
3735 байтСпасибо @MartinEnder за 2 байта!
объяснение
источник
Python 2 ,
93818079 байтовПопробуйте онлайн!
Как это устроено
f является рекурсивной функцией, которая берет список кортежей (или любой другой индексируемой двумерной итерируемой, которая представляет матрицу M ) и рекурсивно вычисляет минимум среднего значения подматрицы 3 × 3 в верхнем левом углу, а f применяется рекурсивно к M без его первый ряд и М без первого столбца.
f(M)
делает следующее.Если M имеет менее трех строк,
M[2:]
это пустой список, который возвращает f .Обратите внимание, что, поскольку n> 3 при первом запуске, начальный не может вернуть пустой список.
Если M имеет три строки или более,
M[2:]
является непустым и, следовательно, правдивым, поэтому код справа отand
выполняется, возвращая минимум из трех следующих значений.M[:3]
возвращает первые три строки M ,zip(*...)
транспонирует строки и столбцы (получая список кортежей),sum(...,())
объединяет все кортежи (это работает, потому что+
это конкатенация) иsum(...)/9
вычисляет среднее значение результирующего списка из девяти целых чисел.рекурсивно применяет f к M с удалением первого ряда.
транспонирует строки и столбцы, удаляет первую строку результата (поэтому первый столбец M и рекурсивно применяет f к результату.
Обратите внимание, что ранее удаленный слой в рекурсивном вызове всегда будет строкой, поэтому всегда будет достаточно проверить , достаточно ли в M строк.
Наконец, можно ожидать, что некоторые рекурсивные вызовы возвращаются
[]
будет проблемой. Однако в Python 2 всякий раз, когда n является числом и A является итеративным, сравнениеn < A
возвращает True , поэтому вычисление минимума одного или нескольких чисел и одной или нескольких итераций всегда будет возвращать наименьшее число.источник
J , 21 байт
Попробуйте онлайн!
Правильный способ работы с подмассивами в J - использовать третью (
_3
) форму обрезки,;.
гдеx (u;._3) y
означает применение глагола.u
к каждому полномуx
массиву размера массиваy
. Решение, использующее это, требует только 1 байт, но будет намного более эффективным на больших массивах.Попробуйте онлайн!
объяснение
источник
[]
они выглядят, но на самом деле это не так.[
или|
:)Желе , 18 байт
Пропустил трюк, использованный милями в своем ответе , с использованием n-мудрого кумулятивного уменьшения сложения - всю первую строку можно заменить
+3\
на 11.Попробуйте онлайн!
Обходит все смежные подсписки, фильтры для хранения только тех, которые имеют длину 3 и суммы (которые векторизируются), затем повторяются для каждого результирующего списка, чтобы получить суммы всех 3 на 3 подматрицы и, наконец, объединить их в один список, взять минимум и делится на 9 (количество элементов, составляющих эту минимальную сумму).
источник
Pyth, 19 байт
Программа, которая принимает ввод списка списков и печатает результат.
Тестирование
Как это устроено
[Объяснение будет позже]
источник
Python 3 ,
111103 байтаПопробуйте онлайн!
источник
Python 2, 96 байт
Тестовые случаи на Repl.it
Безымянная функция, принимающая список списков,
a
- строки матрицы.Вспомогательная функция
h
перебирает три соседних среза и отображает функцию суммы по транспонированию,zip(*s)
каждого из них. Это приводит к суммированию всех высот трех срезов отдельных столбцов.Неименованная функция вызывает вспомогательную функцию, транспонирует и снова вызывает вспомогательную функцию для результата, затем находит минимум каждого и минимум результата, на который она затем делится,
9.
чтобы получить среднее значение.источник
JavaScript (ES6),
1079896 байтФункция, которая вычисляет суммы триплетов по строкам, а затем вызывает себя, чтобы сделать то же самое со столбцами, отслеживая минимальное значение
M
.JS немного многословен для такого рода вещей и не имеет собственного
zip()
метода. Мне потребовалось довольно много времени, чтобы сэкономить всего дюжину байтов по сравнению с более наивным подходом. (Тем не менее, более короткий метод, вероятно, существует.)Нерекурсивная версия, 103 байта
Сохранено 2 байта с помощью Нила
Контрольные примеры
Показать фрагмент кода
источник
(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
.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
05AB1E ,
2116 байтПопробуйте онлайн!
объяснение
источник
Haskell , 87 байт
Попробуйте онлайн!
источник