вход
Доска: 2D контейнер (матрица, список списков и т. Д.) Букв, таких как:
["B", "C", "C", "C", "C", "B", "B", "C", "A", "A"],
["B", "A", "C", "B", "B", "A", "B", "B", "A", "A"],
["B", "C", "B", "C", "A", "A", "A", "B", "C", "B"],
["B", "B", "B", "A", "C", "B", "A", "C", "B", "A"],
["A", "A", "A", "C", "A", "C", "C", "B", "A", "C"],
["A", "B", "B", "A", "A", "C", "B", "C", "C", "C"],
["C", "B", "A", "A", "C", "B", "B", "C", "A", "A"]
Если вы выбираете список списков, вы можете предположить, что все списки имеют одинаковую длину.
правила
- Чтобы сделать правильный прямоугольник, вам нужны все углы прямоугольника с одинаковыми буквами.
- Пример, посмотрите образец платы с X ниже. Вы можете увидеть 'X' на (1,0) также на (4,0) также на (1,3) и на (4,3), тогда у вас есть прямоугольник [1,0,4,3], что означает из (1,0) - (4,3):
Образец платы с X :
["B", "X", "C", "C", "X", "B", "B", "C", "A", "A"],
["B", "A", "C", "B", "B", "A", "B", "B", "A", "A"],
["B", "C", "B", "C", "A", "A", "A", "B", "C", "B"],
["B", "X", "B", "A", "X", "B", "A", "C", "B", "A"],
["A", "A", "A", "C", "A", "C", "C", "B", "A", "C"],
["A", "B", "B", "A", "A", "C", "B", "C", "C", "C"],
["C", "B", "A", "A", "C", "B", "B", "C", "A", "A"]
- Цель состоит в том, чтобы найти прямоугольник или один из прямоугольников с наибольшей площадью, рассчитанной по формуле (правый левый + 1) * (нижний верх + 1)
- Если имеется несколько прямоугольников с одинаковой максимальной площадью, выведите любой. Опционально тот, который (верхняя координата, левая координата, правая координата, нижняя координата) лексикографически наименьший.
- Прямоугольники должны иметь края, параллельные краю доски.
- Каждая буква представляет собой печатный символ ASCII от A до Z (оба включены).
Выход
Выходными данными должны быть положения слева и справа от углов прямоугольника наибольшей площади. Для первого примера «доски» большой квадрат - желтый:
И ответ должен быть:
[1, 1, 8, 4]
Второй пример теста
Ввод:
["C", "D", "D", "D", "A", "A"],
["B", "D", "C", "D", "A", "A"],
["B", "D", "D", "C", "A", "C"],
["B", "D", "B", "C", "A", "C"]
Должен дать один из этих трех списков координат, идентифицирующих область из шести прямоугольников:
[1, 0, 2, 2]
[1, 0, 3, 1]
[3, 2, 5, 3]
Этот вопрос размещен в переполнении стека с заголовком: Как найти самый большой прямоугольник в двумерном массиве, образованном четырьмя одинаковыми углами? и с этим грубым решением JS (я могу сказать "грубо", потому что это мой код;):
Хорошо, это мой первый пост, будь терпим со мной, пожалуйста. Я изменю все, что вы говорите, чтобы улучшить тест.
((left,top),(right,bottom))
этого тоже должно быть хорошо. Я удалил свой ответ и снова отвечу, когда вопрос будет полностью уточнен.Ответы:
Python 2 ,
148130 байтПопробуйте онлайн!
источник
Сетчатка ,
163162 байтаПопробуйте онлайн! Редактировать: 1 байт сохранен, потому что конечное
)
соответствие$.(
неявно. Объяснение:Это регулярное выражение соответствует прямоугольникам. Группы следующие: 1) Верхний ряд (по количеству захвата) 2) Левый столбец (как длина) 3) Балансировка для выравнивания левых углов 4) Буква для углов 5) Ширина + 1 (как длина) 6) Балансировка чтобы обеспечить выравнивание правых углов 7) Правый столбец (как длина) 8) Неиспользуемый 9) Высота (как счетчик захвата). В
w
опции гарантирует , что все возможные ширины прямоугольников совпадающие для каждого заданных в левом верхнем углу. В$
опции приведены результаты , используя следующую схему замещения.Подстановки следующие: правый столбец, верхний ряд, левый столбец, отрицание площади прямоугольника (буквально рассчитывается как длина повторения строки ширины на единицу больше высоты число раз), левый столбец верхний ряд, правый столбец, за которым следует выражение, которое оценивает нижний ряд (перехват стоил бы 12 байт плюс у меня кончились однозначные переменные). Первые четыре захвата представляют порядок сортировки в порядке приоритета. Поскольку Retina сортирует стабильно, сортировка по нескольким столбцам может быть установлена путем сортировки по каждому столбцу сортировки по очереди от наименьшего к наибольшему приоритету. (Область должна быть отсортирована в порядке убывания, поэтому нельзя использовать сортировку по одной строке.)
Затем выполняется четыре числовых вида.
Столбец сортировки затем удаляется после каждой сортировки.
Поэтому первая запись теперь является желаемым результатом.
Примечание. С тех пор ограничение на выбор прямоугольника для данной области было ослаблено, и следующая
144-байтовая версия144предпочитает более широкий, а не более высокий прямоугольник:Попробуйте онлайн!
источник
Желе , (27?)
2928 байт27, если разрешена индексация на основе 1 - удалить трейлинг
’
Полная программа.
Попробуйте онлайн! (или посмотрите другой контрольный пример )
Как?
источник
Perl 6 ,
8373 байтаПопробуйте онлайн!
Возвращает список списков
((x0 y0) (x1 y1))
.объяснение
источник
Haskell , 144 байта
Попробуйте онлайн!
источник
b<=d
, пока вы держитеa<=c
.Желе , 24 байта
Попробуйте онлайн!
⁺
оказывается полезным.Формат вывода: [вверху, внизу], [слева, справа] . 1 индексации.
источник
JavaScript (ES6), 121 байт
-1 байт благодаря @ l4m2
-1 байт благодаря @tsh
+2 байта за соблюдение нового правила оценки прямоугольников
Принимает ввод в виде матрицы строк. Возвращает 0-индексированные координаты: [x0, y0, x1, y1] .
Попробуйте онлайн!
источник
a=>a.map(b=(r,y)=>r.map((v,x)=>a.map((R,Y)=>R.map((V,X)=>V+R[x]+r[X]!=v+v+v|(A=(X-x)*(Y-y))<=b||(o=[x,y,X,Y],b=A)))))&&o
(A=...)<=b
->(A=...)<b
?APL (Dyalog Classic) , 38 байт
Попробуйте онлайн!
источник
Java 8,
208205 байтОпределенно можно играть в гольф ... Сейчас я использую наиболее очевидный подход, используя
четыретри вложенных цикла .-3 байта благодаря @ceilingcat, объединяющему внутренние циклы строк и столбцов в один цикл.
Объяснение:
Попробуйте онлайн.
источник