Сценарий
Я еду по дороге с моей машиной, и начинается дождь. Капли дождя падают на мое окно случайным образом, и теперь я спрашиваю себя, где находится самая большая связанная влажная зона?
Задание
Чтобы было проще, окно разбито на матрицу из 10 * 10 квадратов. Ваша работа состоит в том, чтобы найти самую большую соединенную область капли воды на окне.
вход
Есть два возможных входа, вы можете использовать 2-мерный массив или 1-мерный. Вы можете выбирать между любыми входными данными, такими как стандартный ввод и т. Д.
Пример:
// 2-dimensional:
[[0,1,0,0,0,0,1,0,0,0],
[0,1,1,0,0,0,0,1,1,0],
[0,1,1,0,0,0,0,1,0,0],
[0,1,0,0,0,0,0,0,0,0],
[0,0,0,0,0,0,0,0,1,0],
[0,0,0,1,1,0,0,0,1,0],
[0,0,0,1,1,0,0,0,1,0],
[0,0,0,0,0,1,1,0,1,0],
[0,0,0,0,0,1,1,0,1,0],
[0,0,0,0,0,0,0,0,0,0]]
// 1-dimensional
[0,1,0,0,0,0,1,0,0,0,
0,1,1,0,0,0,0,1,1,0,
0,1,1,0,0,0,0,1,0,0,
0,1,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,0,
0,0,0,1,1,0,0,0,1,0,
0,0,0,1,1,0,0,0,1,0,
0,0,0,0,0,1,1,0,1,0,
0,0,0,0,0,1,1,0,1,0,
0,0,0,0,0,0,0,0,0,0]
Выход
Ваш код должен указывать размер самой большой соединенной области и координаты x и y капель воды, которые принадлежат этой области, в формате
«Размер: Z Координаты: (X1, Y1) (X2, Y2) .. . "
Пример для предыдущего ввода:
Size: 6 Coordinates: (1,0) (1,1) (2,1) (1,2) (2,2) (1,3)
Порядок координат не имеет значения.
правила
- Капли воды связаны, если они касаются друг друга ортогонально
- Диагональные соединения не учитываются
- Там может быть много областей, и ваш код должен найти самую большую
- Пустое поле представлено как «0», а мокрое поле как «1»
- Опубликуйте свое решение с кратким объяснением и выводом предыдущего ввода
- Самый короткий код в течение следующих 7 дней выиграет
- Если есть две области с одинаковым размером, вы можете выбрать одну
Ответы:
Рубин, 171 символов
Ввод через параметр командной строки в виде одномерного массива.
Выход для образца ввода:
Size: 6 Coordinates: (1,0) (1,1) (1,2) (1,3) (2,2) (2,1)
В этом ответе используется простой подход с заливкой, строящий список координат для каждого кластера дождевой капли. Большая часть кода фактически используется для проверки границ и ввода / вывода.
источник
Питон - 192
Ввод (вставить перед кодом):
Спасибо Calvin's Hobbies за предложенные изменения!
источник
map(f,range(100))
вместо того,[f(i)for i in range(100)]
чтобы сохранить 8 символов. Также я считаю, что ваши координаты (у, х) не (х, у).C # -
548523522511503476(до 500 ... год)
Я уверен, что есть много возможностей для улучшения.
Способ ввода данных состоял в том, чтобы инициализировать массив. Я не включил этот массив в оценку (если вы думаете, что это обман, я могу изменить код, но он добавит относительно много кода, потому что C # не очень хорош при разборе массивов)
Проверьте это на http://ideone.com/UCVCPM
Примечание: текущая версия не работает в ideone, потому что она не нравится
using l=System.Collections...
, поэтому версия ideone немного устарела (и больше)Как это устроено
Это в основном проверяет, есть ли
1
. Если он находит его, он использует алгоритм Flood Fill для замены всех соседних1
объектов0
и добавляет замененные координаты во временный список. Затем он сравнивает верхний список (m
) для временного списка (t
) и наборовm
дляt
еслиt
содержит больше элементов.источник
Mathematica - 180 байт
Эта функция принимает двумерный массив.
Golfed
милая
пример
Вывод слегка аномальный. Mathematica начинает индексировать с 1 вместо 0 и использует
{}
для обозначения позиции. Добавьте 2 байта (-1
), если позиции должны быть проиндексированы 0. Добавьте много байтов, если их нужно использовать()
вместо{}
:(объяснение
f
является функциейx
. Он определяетсяc
как преобразованиеx
, где каждый (i, j) теперь равен целому числу, соответствующему связанному компоненту, которому он принадлежит. Это предполагает основную работу:Затем
m
вычисляет, сколько элементов содержится в каждом компоненте, сортирует их по этому количеству и получает последний результат (то есть, с наибольшим количеством элементов). Последняя строка выводит счетчик и позиции вc
индексе, содержащиеся вm
.источник
Хаскелл, 246
вход
Два измерения и вставьте перед кодом, как
g
, например:Ungolfed
источник
C # 374 байт
Это сильно измененная версия моего ответа на вопрос : Вы в самой большой комнате? , Он принимает одномерный массив целых и возвращает строку в требуемом стиле. Он работает путем создания непересекающихся наборов из входных данных (первый цикл), подсчета размера каждого набора и нахождения наибольшего набора (второй цикл), а затем добавления любых ячеек в этом наборе к выходной строке (третий цикл), которая затем возвращается ,
Меньше гольфа (и с тестовым кодом):
источник
JavaScript (EcmaScript 6) 183
189Функция с массивом ввода и возвращаемым значением строки. Если нужен реальный вывод (не ясно для меня), добавьте 7 байт для функции alert ().
Тестовый вывод
Более читаемый
объяснение
Получите массив одного измерения и необязательный параметр с размером строки. Функция работает также с различными размерами массива, даже x! = Y.
Псевдокод:
источник
JavaScript, 273
Функция принимает массив и возвращает строку. Моя первая попытка была ~ 500 символов и не использовал Flood Fill. Этот делает. Я изучаю JavaScript, поэтому любые предложения будут оценены.
Эта функция проходит по входному массиву и для каждого найденного 1 начинается там и заменяет все подключенные значения от 1 до 0, используя функцию Fill. При этом он запоминает блоб с наибольшим количеством единиц. Функция Fill изменяет текущую позицию на 0, а затем вызывает себя на позиции выше, справа, внизу и слева.
Проверьте здесь: http://goo.gl/9Hz5OH
Читаемый код
источник
Скала, 420
Привет, моя запись принимает 2d массив
List[List[Int]]
, возвращаетString
объяснение
Учитывая окно как
List[List[Int]]
, сначала мы находим каждую «1» и сохраняем координаты в списке. Затем мы превращаем этот список вMap
координату каждой "1", чтобы получить список координат каждой соседней "1". Затем используйте карту смежности, чтобы транзитивно связать субблоки в BLOB-объекты, и, наконец, мы возвращаем самый большой BLOB-объект (и игнорируем дублирующиеся BLOB-объекты, поскольку порядок возвращаемых координат не имеет значения).Более читаемый
Критика очень ценится.
источник