Одна из моих любимых математических игр - нарисовать прямоугольную сетку, а затем найти все прямоугольники, которые видны в этой сетке. Вот, возьми этот вопрос и рискни для себя!
Можете ли вы посчитать количество прямоугольников?
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
| | | | |
| | | | |
+-----+-----+-----+-----+
Общее количество прямоугольников для этой мини-шахматной доски 4 x 4 точно
100
Вы были правы?
Связанная математика: Сколько прямоугольников на шахматной доске 8 × 8?
Соревнование
Напишите самую короткую функцию / программу, которая подсчитывает общее количество видимых прямоугольников на неториоидальной сетке / изображении .
Задачи, связанные с данной : Подсчитайте уникальные прямоугольники! , Найти количество прямоугольников в массиве байтов 2D .
Формат ввода
Ваша функция или программа может работать с текстовым или графическим вводом.
Ввод текста
Сетка будет представлять собой сетку ASCII размером m- by- n ( m строк, n столбцов), состоящую из следующих символов:
- пространства,
-
для частей горизонтального отрезка,|
для частей сегмента вертикальной линии, и+
для углов.
Вы можете представить эту сетку ASCII в качестве входных данных / аргумента для вашей программы / функции в виде
- одна строка, разделенная переносами строк,
- строка без перевода строки, но с одним или двумя целыми числами, кодирующими размеры сетки, или
- массив строк.
Примечание . Текстовый ввод содержит не менее 1 строки и не менее 1 столбца.
Графический ввод
В качестве альтернативы сетки кодируются как черно-белые PNG- изображения шириной 5 * n пикселей и высотой 5 * m пикселей. Каждое изображение состоит из 5 пикселей * 5 пикселей блоков, которые соответствуют входу ASCII:
- Пробелы преобразуются в белые блоки. Эти блоки называются пробельными блоками.
- Сегменты и углы линий преобразуются в блоки без пробелов. Центральный пиксель таких блоков черный.
- Редактировать: Если два угла (на входе ASCII) соединены отрезком, соответствующие центры блоков (на графическом входе) также должны быть соединены черной линией.
Это означает, что каждый блок может быть выбран только из (Нажмите здесь, чтобы увеличить изображение) .
Примечание . Синие границы приведены только для иллюстрации. Графический ввод имеет ширину не менее 5 пикселей и высоту 5 пикселей. Вы можете преобразовать графический ввод в любое монохромное изображение, возможно, в другие форматы файлов изображений). Если вы решили конвертировать, пожалуйста, укажите в ответе. Там нет штрафов за конвертацию.
Выходной формат
Если вы пишете программу, она должна отображать неотрицательное число, указывающее общее количество прямоугольников во входных данных.
Если вы пишете функцию, она также должна возвращать неотрицательное число, указывающее общее количество прямоугольников во входных данных.
Примеры случаев
Случай 1, Графика: ( 30 пикселей * 30 пикселей), ASCII: ( 6 строк, 6 столбцов)
+--+
| |
| ++-+
+-++ |
| |
+--+
Ожидаемый результат: 3
Случай 2, Графика: ( 20 пикселей * 20 пикселей), ASCII: ( 4 строки, 4 столбца)
++-+
|+++
+++|
+-++
Ожидаемый результат: 6
Случай 3, Графика: ( 55 пикселей * 40 пикселей), ASCII: ( 8 строк, 11 столбцов)
+++--+
+-+++ |
| | ++--+
+--+--++ ++
| ||
| ||
++ +--++
++
Ожидаемый результат: 9
Случай 4, Графика: ( 120 пикселей * 65 пикселей), ASCII: ( 13 строк, 24 столбца)
+--+--+ +--+ +--+ +--+
| | | | | | | | |
+--+--+ | | | | | |
| | | +--+--+--+--+--+
+--+--+ | | | |
| | | | ++
+-+-+-+-+ +--+ +--+ ++
| | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
| | | | | | | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+
Ожидаемый результат: 243
Случай 5, Graphic: ( 5 точек * 5 . Точек Да, это есть!), ASCII: Просто один пробел.
Ожидаемый результат: 0
Случай 6, Графика: ( 35 пикселей * 20 пикселей), ASCII: ( 4 строки, 7 столбцов)
+--+--+
|++|++|
|++|++|
+--+--+
Ожидаемый результат: 5
Предположения
Чтобы облегчить жизнь, вам гарантировано, что:
- Будучи не тороидальной , сетка не оборачивается ни по горизонтали, ни по вертикали.
- Там нет свободных концов, например,
+---
или+- -+
. Все отрезки имеют два конца. - Две линии, которые встречаются в,
+
должны пересекаться друг с другом в этой точке. - Вам не нужно беспокоиться о неверных вводах.
Применяются правила против стандартных лазеек. Пожалуйста, рассматривайте квадраты как прямоугольники. При желании вы можете удалить замыкающие пробелы в каждом ряду сетки.
Это код-гольф , поэтому сделайте запись максимально короткой. Текстовые и графические решения будут конкурировать вместе.
Leaderboard
источник
Ответы:
Грязь ,
3128 байтПопробуйте онлайн!
Принимает ввод в формате ASCII.
объяснение
Синтаксис Гриме очень близок к регулярным выражениям. Каждая строка определяет шаблон, который может соответствовать или не соответствовать прямоугольнику символов.
T
соответствует прямоугольнику, верхняя строка и левый столбец которого выглядят корректно.Второй ряд - «основная программа».
источник
JavaScript (ES6),
176171 байтПринимает ввод как массив строк одинаковой длины. Объяснение: Создает серию регулярных выражений, которые соответствуют прямоугольникам всех возможных значений ширины и высоты (и некоторых невозможных значений ширины и высоты, но для вас это гольф-код) и подсчитывает, сколько совпадений они все производят. Поскольку в регулярном выражении есть группа захвата,
split
возвращается2n+1
дляn
совпадений, поэтому я сдвигаю вправо на 1, чтобы получить количество совпадений, поскольку это экономит байт, делая группу без захвата.источник
J ,
1039586807670 байтПопробуйте онлайн!
Принимает входные данные в виде массива строк с конечными пробелами (чтобы каждая строка имела одинаковый размер). Использует оператор полного подмассива
;._3
для итерации каждого возможного размера подмассива, превышающего 2 x 2, и подсчитывает подмассивы, которые являются допустимыми прямоугольниками. Завершает все тестовые случаи практически мгновенно.источник
Mathematica,
136134132 байтаИспользование: (для старой 136-байтовой версии, но новая версия в основном идентична)
Заметка:
@*
является новым в версии 10. В более старых версиях используйтеTr~Composition~Flatten
вместоTr@*Flatten
.источник
"Tr@" cannot be followed by "*Flatten".
@*
(сокращение отComposition
) является новым в версии 10.RectangleCount[]
?Желе ,
60 53 52 5150 байтПолная программа, принимающая список строк (строк равной длины) и печатающая счетчик.
Попробуйте онлайн!
... или для простоты копирования и вставки ввода используйте эту полную программу (с дополнительным байтом для разделения строк)
- обратите внимание, строки должны содержать пробелы для правильной работы программы.
Как?
источник
Слип ,
3229 байтПопробуйте онлайн!
27 байт кода + 2 байта
n
иo
флагов. Принимает входные данные в том же формате, который указан в вопросе (т. Е. Блок строк с разделителями новой строки).источник
Haskell,
180167166 байтПопробуйте онлайн!
Пройдите все возможные угловые позиции с помощью четырех вложенных циклов и проверьте, все ли символы в строках между ними состоят из
+-
(горизонтального) или+|
(вертикального).источник
Желе ,
41393433 байтаПопробуйте онлайн! или просмотреть все дела.
На основании моего ответа в J.
объяснение
источник