Этот вопрос похож на Biggest Square в сетке .
Вызов
Учитывая матрицу 1
и 0
в строковом формате "xxxx,xxxxx,xxxx,xx.."
или формате массива ["xxxx","xxxx","xxxx",...]
, Вы создадите функцию, которая определяет область самой большой квадратной подматрицы, которая содержит все 1
.
Квадратная подматрица имеет одинаковую ширину и высоту, и ваша функция должна возвращать область самой большой подматрицы, которая содержит только 1
.
Например:
Учитывая "10100,10111,11111,10010"
, это выглядит как следующая матрица:
1 0 1 0 0
1 0 1 1 1
1 1 1 1 1
1 0 0 1 0
Вы можете видеть выделенную жирным шрифтом 1
самую большую квадратную подматрицу размером 2x2, поэтому ваша программа должна вернуть область, которая равна 4.
правила
- Подматрица должна быть одинаковой ширины и высоты
- Подматрица должна содержать только значения
1
- Ваша функция должна вернуть область наибольшей подматрицы
- Если подматрица не найдена, вернуть
1
- Вы можете рассчитать площадь подматрицы, посчитав количество
1
в подматрице
Контрольные примеры
Вход: "10100,10111,11111,10010"
Выход: 4
Вход: "0111,1111,1111,1111"
Выход: 9
Входной "0111,1101,0111"
Выход: 1
Это Код-гольфТаким образом, самый короткий ответ в байтах побеждает.
Ответы:
Желе , 18 байт
+2 для обработки выходных данных подсписка no-all-1
Попробуйте онлайн! Или посмотрите набор тестов
Как?
источник
Haskell ,
113 121 118117 байтПопробуйте онлайн!
-3 байта благодаря Лайкони !
-1 байт благодаря Линн !
+8 байтов за нелепое требование возврата 1, если нет подматрицы all-1s.
Объяснение / Ungolfed
Следующая вспомогательная функция просто создает смещения,
x
позволяющие уменьшить их наs
:x#y
удалитy
элементы из списка и затем возьметx
:Функция
f
перебирает все возможные размеры для подматриц по порядку, генерирует каждую подматрицу соответствующего размера, проверяет, содержит ли она только'1'
s, и сохраняет размер. Таким образом, решение будет последней записью в списке:источник
Haskell ,
9997 байтПроверяет, является ли input квадратной матрицей, состоящей из единиц с
s==('1'<$s<$s)
, если она есть, answer является длина ^ 2, иначе 0. Затем рекурсивно обрезает первый / последний столбец / строку и принимает максимальное значение, которое находит где угодно.Попробуйте онлайн!
источник
K (нгн / к) ,
3328 байтПопробуйте онлайн!
источник
J ,
3327 байт-6 байт благодаря FrownyFrog!
Попробуйте онлайн!
Объяснение:
Я буду использовать первый тестовый пример в моем объяснении:
Я генерирую все возможные квадратные подматрицы размером от 1 до количества строк ввода.
,~@#\
создает список пар для размеров подматриц,,.
соединяя длину последовательных префиксов#\
ввода:Затем я использую их, чтобы разрезать
x u ;. _3 y
входные данные на подматрицы. У меня уже естьx
(список размеров);y
правильный аргумент]
(вход).Для каждой подматрицы я проверяю, состоит ли она целиком из 1:
(#**/)@,
- выровнять матрицу и подсчитать количество элементов по их продукту. Если все элементы равны 1 с, результатом будет их сумма, в противном случае - 0:Наконец, я выравниваю список результатов для каждой подматрицы и нахожу максимум:
>./@,
источник
,~@#\
и"1 2
->"$
"$
#
короче, чем сложение 1 с.APL (Dyalog Unicode) ,
353432 байтаПопробуйте онлайн!
SBCS Адама содержит все символы в коде
Объяснение придет в конце концов!
источник
Сетчатка , 143 байта
Попробуйте онлайн! Ссылка включает в себя тестовые случаи. Принимает ввод как разделенные запятыми строки. Объяснение:
Добавьте a,
,
чтобы завершить последнюю строку, a,;
чтобы отделить строки от#
s и a#
в качестве счетчика.Повторяйте блок до тех пор, пока больше не произойдет подстановок (потому что каждая строка теперь имеет только одну цифру).
Тройной строкой, установив счетчик на 1 в первой строке и увеличивая его в последней строке.
В первой строке удалите первую цифру каждой строки, а во второй строке удалите все цифры, кроме первой.
В третьей строке поразрядно и первые две цифры вместе.
В этот момент каждая строка состоит из двух значений: а) счетчика горизонтальной ширины и б) побитового числа и того количества битов, взятых из каждой строки. Преобразуйте все оставшиеся
1
s в#
s, чтобы их можно было сравнить со счетчиком.Найдите любые последовательности битов (по вертикали), которые соответствуют счетчику (по горизонтали), соответствующие квадратам
1
s в исходном входе, и возведите в квадрат длину.Сортировать численно.
Возьми самый большой.
Особый случай нулевой матрицы.
источник
JavaScript, 92 байта
Показать фрагмент кода
источник
APL (Dyalog Classic) ,
2120 байтПопробуйте онлайн!
источник
Питон 2 ,
117109 байтБлагодарю @etene за указание на неэффективность, которая стоила мне дополнительного байта.
Попробуйте онлайн!
Принимает ввод в виде строки через запятую. Это основанный на регулярных выражениях подход, который пытается сопоставить входную строку с шаблонами формы
111.....111.....111
для всех возможных размеров квадрата.В моих вычислениях, выполнение этого с анонимной лямбдой чуть короче определенной функции или полной программы.
or 1
Часть , в конце концов , необходимо только обрабатывать странный край случай, когда мы должны выход ,1
если нет в них вход.источник
Python 2 ,
116115117109 байтБлагодарю @Kirill за помощь в игре в гольф и за умное и раннее решение
Изменить : Гольф 1 байт с использованием лямбда, я не знал, присвоение его переменной не учитывается в счетчик байтов.
Редактировать 2 : Кирилл указал, что мое решение не работает для случаев, когда вход содержит только
1
s, я должен был исправить это и потерял два драгоценных байта ...Редактировать 3 : больше игры в гольф благодаря Кириллу
Принимает строку через запятую, возвращает целое число.
Попробуйте онлайн!
Я независимо нашел ответ, близкий к ответу Кирилла, то есть основанный на регулярных выражениях, за исключением того, что я использую
re.search
и a.def
Он использует регулярное выражение, построенное во время каждого цикла, чтобы соответствовать постепенно увеличивающемуся квадрату и возвращает наибольшее или 1.
источник
if
подход как «слишком длинный наверняка», но затем мне пришлось придумать какой-то другой способ сделать значение bool из матча. К сожалению, ваше решение пропускает один пункт - вы не можете иметь простоrange(l)
- оно упустит случай, когда нет нулей вообще. Например, возьмите 2-й контрольный пример и сделайте все 1 с - должно быть 16, а не 9.find
. Теперь, когда наши коды больше не идентичны, я предлагаю, по крайней мере, исправить очевидные ошибки друг друга - в вашем случае дополнительный байт получается при использовании кортежа("1"*i,)
вместо списка.find
, это было умно с вашей стороны.Рубин
-n
, 63 байтаПопробуйте онлайн!
Ruby-версия моего Python-ответа . Golfier как полная программа. Или анонимная лямбда:
Рубин ,
7068 байтПопробуйте онлайн!
источник
Perl 6 ,
616058 байтПопробуйте онлайн!
источник
Python 2 ,
138128 байтПопробуйте онлайн!
Сохраненный
источник
Clojure, 193 байта
Ух, все обострилось: o
Менее гольф:
источник