Простое состязание, вдохновленное вопросом о переполнении стека :
Вам дается изображение поверхности, сфотографированной спутником. Изображение представляет собой растровое изображение, на котором вода помечена как «
.
, а земля помечена*
». Группы соседей*
образуют остров. (Два '*
' смежны, если они являются соседями по горизонтали, вертикали или диагонали). Ваша задача - напечатать количество островов в растровом изображении.
Сингл *
также считается островом.
Пример ввода:
.........**
**......***
...........
...*.......
*........*.
*.........*
Пример вывода:
5
Победителем становится запись с наименьшим количеством байтов в коде.
*
остров*
s также острова.Ответы:
Mathematica
188 185 170 115 130 4648 символовобъяснение
В более ранних версиях я строил график позиций с расстоянием шахматной доски 1 друг от друга.
GraphComponents
затем выявлено количество островов, по одному на компонент.Настоящая версия использует
MorphologicalComponents
для поиска и нумерации кластеров единиц в массиве - области, где1
они физически смежны. Поскольку в графике нет необходимости, это приводит к огромной экономии кода.Код
пример
5
Как это работает
Данные вводятся в виде массива; в Mathematica это список списков.
Во входном массиве данные преобразуются в
1
's0
' и 's' путем замены.где
/.
- инфиксная форма, за которойReplaceAll
следуют правила замены. Это по существу преобразует массив в черно-белое изображение. Все, что нам нужно сделать, это применить функциюImage
.Белые квадраты соответствуют ячейкам, имеющим значение 1.
На рисунке ниже показаны некоторые шаги, которые использует этот подход. Входная матрица содержит только
1
«и0
». Выходная матрица маркирует каждый морфологический кластер числом. (Я обернул входную и выходную матрицы,MatrixForm
чтобы выделить их двумерную структуру.)MorphologicalComponents
заменяет1
s на целое число, соответствующее номеру кластера каждой ячейки.Max
возвращает наибольшее число кластеров.Отображение островов
Colorize
раскрасит каждый остров по-своему.источник
MorphologicalComponents
хочетImage
, но даже на v9 это не должно бытьMax@MorphologicalComponents[d/.{"."->0,"*"->1}]
? То есть замена сделана первой?Max
исчезнет до того, как замена будет сделана, не так ли?Max@MorphologicalComponents@d/.{"."->0,"*"->1}
не работает, что имеет смыслMax@MorphologicalComponents[d /. {"." -> 0, "*" -> 1}]
, так что у вас есть еще один символ.Рубин 1.9 (
134121113110)Принимает карту в stdin или имя файла карты в качестве первого аргумента командной строки и печатает количество островов в стандартный вывод. Используя базовую рекурсивную заливку. Улучшения приветствуются как всегда!
Подобно раскрасить Давид, вы также можете получить его для отображения различных островов, изменяя
$_[i]=?.
к$_[i]=c.to_s
иp c
кputs$_
, который даст вам что - то вроде этого:(по крайней мере, пока у вас не кончатся цифры!)
Некоторые тестовые случаи:
5
9
1
2
3
источник
C 169 символов
Читает карту со стандартного ввода. Не повезло в улучшении рекурсивной функции заливки,
r(j)
хотя похоже, что так и могло быть.источник
Python 2,
223203 байтаСпасибо Step Hen и Арнольду Палмеру за то, что вы сбрили 20 символов пробелов и лишние скобки!
Я думал, что использование списочных пониманий может уменьшить количество байтов, но это не дало существенного улучшения.
Попробуй это здесь.
Я продолжаю пытаться обрезать его по списку n (соседей), но у меня ничего не получилось. Возможно, у кого-то еще будут какие-то идеи для этого раздела.
источник
(s.index(l),i)
иfor
,enumerate(l)
иif
,-v[0])<2
иand
,p=0:
иp
, иbool(x&n[p])
иelse
. У вас также есть больше скобок, чем необходимо в вашем операторе печати, так как у вас есть 2 окружающие группыset
. Edit: Beat by StepHen, потому что делать вещи на мобильном телефоне не идеально.Perl 5 , 100 байт
98 байт кода + 2 байта для
-p0
флагов.Попробуйте онлайн!
Адаптация (или, скорее, упрощение) моего ответа на вызов « Сколько отверстий»? , Вы можете найти объяснения того, как этот код работает с другим ответом (объяснение немного длинное, поэтому я предпочитаю не перепечатывать все объяснения полностью).
источник
Python 2, 233 байта
Слишком долго, по сравнению с другими ответами. Порт моего ответа на этот вопрос .
Попробуйте онлайн
источник
JavaScript, 158 байт
Неконкурентный ответ ES6 (вызов языковых постдатов) для 132 байтов:
Порт моего ответа на Сколько дырок? (да, я прыгаю на подножку, теперь, когда я видел, как два других человека портируют свои ответы).
источник
Python 2 , 225 байт
Попробуйте онлайн!
источник