Вы должны написать программу или функцию.
Вход представляет собой «карту» чисел. Вы можете взять карту в виде строки с символами новой строки (\n
) или двухмерного массива строк.
Все карты 5 символов на 5 символов, и символы всегда либо цифры больше 0, либо пробелы.
Вот пример карты:
12 45
11233
233
1
2 899
Ваша задача - найти подключенные компоненты на карте. Допустимый компонент - это серия, состоящая как минимум из трех горизонтально и / или вертикально ( не по диагонали ) соединенных одинаковых цифр ( не пробелов ). Затем вам нужно будет заменить символы действительных подключенных компонентов на x
s и напечатать или вернуть этот результат.
Итак, вывод для приведенного выше примера будет:
x2 45
xx2xx
2xx
1
2 899
Вот еще один тестовый пример (спасибо Мартину Эндеру):
Input:
2 3
4
1 5
111 6
11 7
Output:
2 3
4
x 5
xxx 6
xx 7
Это код гольф, поэтому выигрывает самый короткий код в байтах!
источник
Ответы:
JavaScript (ES6),
171161139137136133132 байтаЭто перевод моего Python ответа. Ввод / вывод как символьные массивы.
Жаль, что нет эффективного способа сделать
sum
...источник
Python 3,
238237200199192181 байтОпределяет функцию,
f(a)
которая принимает входные данные в виде массива символов и возвращает тот же модифицированный массив. ( Массивы символов по умолчанию допустимы в качестве строк. )Неуравновешенный объяснением
Измененный код является рекурсивным, но работает так же.
источник
Рубин, 304 байта
пример использования:
код использует метод blot для вычисления длины пути.
переменные / методы:
Попытка более подробного объяснения:
сделайте копию входной строки, которую мы используем для определения длины пути от любой заданной точки на карте.
определить анонимную функцию «ps» (длина пути) (лямбда), которая принимает индекс карты i в качестве аргумента. он возвращает длину пути от этой точки. он делает это, вызывая метод 'b' (blot), чтобы вставить x в копию исходной карты, а затем подсчитать количество x в возвращенной строке.
следующая часть перебирает каждый символ на карте (индекс i, символ s [i]). он вызывает функцию 'b' (blot) в позиции i карты, если длина пути от позиции i больше 2, и если это не пробел или символ новой строки.
функция b (blot) принимает строку карты и индекс в качестве аргумента. он инициализирует @v (посещаемый массив) и вызывает вспомогательную функцию b2.
функция b2 принимает строку карты, позицию карты (i) и символ в текущем пути (c). он вызывает себя рекурсивно, чтобы заменить связанные разделы цифр символом «x». он возвращает входную строку (это так, чтобы функция ps могла вызвать scan () возвращаемого значения).
оператор if проверяет, что заданная позиция карты (i) находится в пределах строки (0 ... s.size) и что символ в s [i] совпадает с начальным символом. также @v [i] проверяется, чтобы избежать бесконечной рекурсии.
это бит, который заменяет символ в индексе (i) на символ «x». он также помечает этот индекс как посещенный.
это где b2 вызывает себя рекурсивно в поисках пути. i + 1 - один символ справа, i-1 - один символ слева, i + 6 - одна строка вниз (5 цифр + 1 новая строка = 6 символов), i-6 - одна строка вверх.
источник
С (Анси)
243233179188 байтGolfed:
С аннотациями:
}
Входные данные:
Ожидается новая строка в начале и конце строки.
Пример ввода:
Пример вывода:
Обновить
Исправление сетки позволило мне сбрить почти 60 байтов.
источник
Mathematica, 180 байт
Объяснение:
Чистая функция, которая принимает
5x5
массив.
3-байтовый символ частного использования,U+F3C7
представляющий оператор транспонирования postfix\[Transpose]
.(f=Flatten@#;p=Partition)
: Выравнивает список ввода и сохраняет его вf
. Устанавливаетp = Partition
и возвращает его.g=p[r,5]
: Массив{{1,2,3,4,5}, ..., {21,22,23,24,25}}
(это потому, чтоr
устанавливается вRange@25
).Join[g=p[r,5],g]
: список строк и столбцовg
.p[#,2,1]&
: Pure функция, которая разбивает список#
на подсписки длины2
с перекрытием1
; т.е. список соседних пар в#
.##&@@p[#,2,1]&
: То же, что и выше, но возвращает aSequence
.##&@@p[#,2,1]&/@Join[g=p[r,5],g]
: Сопоставляет предыдущую функцию строк и столбцов,g
чтобы получить список всех смежных записей вg
. Моя интуиция говорит, что есть более короткий способ сделать это.r~Graph~Cases[...]
: Граф, вершины которого являются целыми числами,1, ..., 25
а ребра - ребрами между смежными записями, вg
которых есть одинаковые соответствующие записи во входном массиве (кроме" "
){a_,b_}/;(A=f[[a]])==f[[b]]&&A!=" "
: Шаблон, который соответствует{a,b}
такомуf[[a]] == f[[b]]
(то же значение во входном массиве) и который не равен" "
. Установите,A = f[[a]]
чтобы сохранить1
байт....:>a<->b
: Заменять каждое совпадение ненаправленным ребром от a до b.VertexComponent
Возвращает связанный компонент второго аргумента (вершины) в первом аргументе (графе).Tr[1^VertexComponent[...]]
: Размер подключенного компонента. Сохраняет1
байт изLength@VertexComponent[...]
.If[Tr[...]<3,f[[#]],"x"]&
: Чистая функция, которая принимает запись#
вg
. Если размер подключенного компонента меньше чем3
, замените его соответствующей записью на входе. В противном случае замените его на"x"
.(f=Flatten@#;p=Partition)[...,5]
И, наконец, измените результат в5x5
массив.источник
Clojure, 188 байт
Это довольно подавляюще: D
Вызывается так (требуется 1D вектор символов):
Слишком лениво, чтобы разгрузить его, но в основном
for[m(range 30)]
посещает каждый индекс, и для каждого индекса внутреннийlet[n(for[p[-1 -6 1 6]...(+ m p))]
создает список от 0 до 4 элементов, в котором перечислены местоположения, которые имеют то же значение (1 - 9), что и среднее местоположение. Если более одного соседа соответствует средней части, это означает, что все они образуют кластер, поэтому эти местоположения добавляются в набор, используемый в(if((set(flatten(...)))i)
. Если индексi
найден из набора, то\x
испускается, а исходное значение в противном случае. Это:when( ... )
довольно интересно ...источник