Учитывая непустой прямоугольный массив целых чисел от 0
до 9
, выведите количество ячеек, которые есть 8
и не имеют соседа, который есть 8
. Соседство здесь понимается в смысле Мура , то есть включает диагонали. Таким образом, каждая ячейка имеет 8
соседей, за исключением ячеек по краям массива.
Например, учитывая вход
8 4 5 6 5
9 3 8 4 8
0 8 6 1 5
6 7 9 8 2
8 8 7 4 2
выход должен быть 3
. Следующие три ячейки будут отмечены звездочкой (но должно быть выведено только количество таких записей):
* 4 5 6 5
9 3 8 4 *
0 8 6 1 5
6 7 9 * 2
8 8 7 4 2
Дополнительные правила
При желании вы можете взять два числа, определяющих размер массива, в качестве дополнительных входных данных.
Вклад может быть сделан любым разумным способом . Формат, как обычно, гибкий. Например, это может быть двумерный массив символов, или список списков чисел, или плоский список.
Программы или функции разрешены на любом языке программирования . Стандартные лазейки запрещены.
Самый короткий код в байтах побеждает.
Контрольные примеры
Входные данные:
8 4 5 6 5 9 3 8 4 8 0 8 6 1 5 6 7 9 8 2 8 8 7 4 2
Выход:
3
вход
8 8 2 3
Выход:
0
Входные данные:
5 3 4 2 5 2
Выход:
0
Входные данные:
5 8 3 8
Выход:
2
Входные данные:
8 0 8
Выход:
2
.Входные данные:
4 2 8 5 2 6 1 8 8 5 5 8
Выход:
1
Входные данные:
4 5 4 3 8 1 8 2 8 2 7 7 8 3 9 3 9 8 7 8 5 4 2 8 4 5 0 2 1 8 6 9 1 5 4 3 4 5 6 1
Выход
3
.Входные данные:
8
Выход:
1
Входные данные:
8 5 8 1 6 8 7 7 9 9 2 8 2 7 8 3 2 8 4 9 7 3 2 7 9 2 9 7 1 9 5 6 6 9 8 7 3 1 5 2 1 9 9 7 1 8 8 2 3 5 6 8 1 4 7 5
Выход:
4
.Входные данные:
8 1 8 2 5 7 8 0 1
Выход:
3
.
Входы в формате MATLAB:
[8 4 5 6 5; 9 3 8 4 8; 0 8 6 1 5; 6 7 9 8 2; 8 8 7 4 2]
[8 8; 2 3]
[5 3 4; 2 5 2]
[5 8 3 8]
[8; 0; 8]
[4 2 8 5; 2 6 1 8; 8 5 5 8]
[4 5 4 3 8 1 8 2; 8 2 7 7 8 3 9 3; 9 8 7 8 5 4 2 8; 4 5 0 2 1 8 6 9; 1 5 4 3 4 5 6 1]
[8]
[8 5 8 1 6 8 7 7; 9 9 2 8 2 7 8 3; 2 8 4 9 7 3 2 7; 9 2 9 7 1 9 5 6; 6 9 8 7 3 1 5 2; 1 9 9 7 1 8 8 2; 3 5 6 8 1 4 7 5]
[8 1 8; 2 5 7; 8 0 1]
Входные данные в формате Python:
[[8, 4, 5, 6, 5], [9, 3, 8, 4, 8], [0, 8, 6, 1, 5], [6, 7, 9, 8, 2], [8, 8, 7, 4, 2]]
[[8, 8], [2, 3]]
[[5, 3, 4], [2, 5, 2]]
[[5, 8, 3, 8]]
[[8], [0], [8]]
[[4, 2, 8, 5], [2, 6, 1, 8], [8, 5, 5, 8]]
[[4, 5, 4, 3, 8, 1, 8, 2], [8, 2, 7, 7, 8, 3, 9, 3], [9, 8, 7, 8, 5, 4, 2, 8], [4, 5, 0, 2, 1, 8, 6, 9], [1, 5, 4, 3, 4, 5, 6, 1]]
[[8]]
[[8, 5, 8, 1, 6, 8, 7, 7], [9, 9, 2, 8, 2, 7, 8, 3], [2, 8, 4, 9, 7, 3, 2, 7], [9, 2, 9, 7, 1, 9, 5, 6], [6, 9, 8, 7, 3, 1, 5, 2], [1, 9, 9, 7, 1, 8, 8, 2], [3, 5, 6, 8, 1, 4, 7, 5]]
[[8, 1, 8], [2, 5, 7], [8, 0, 1]]
Выходы:
3, 0, 0, 2, 2, 1, 3, 1, 4, 3
источник
Ответы:
MATL ,
211710 байтПопробуйте онлайн!
Спасибо Луису Мендо за помощь в чате и за предложение 2D свертки.
Объяснение:
источник
R ,
117 6359 байтПопробуйте онлайн!
dist
вычисляет расстояния (по умолчанию - евклидово) между строками матрицы.which
со вторым аргументомTRUE
возвращает координаты, где предикат является истинным.Координаты являются соседями, если расстояние между ними не превышает квадратный корень из 2, но внутренняя часть
<2
достаточно хорошая, потому что возможное расстояние прыгает отsqrt(2)
ro2
.источник
colSums()^2<=2
работать.sqrt(2)
прыжков2
(напримерsort(c(dist(expand.grid(1:6,1:6))), decreasing = TRUE))
), поэтому мы были слишком умны там.APL (Dyalog Classic) ,
292825 байтПопробуйте онлайн!
источник
1
(кроме явно не установлен). В этом есть смысл.Желе ,
1815 байтПопробуйте онлайн!
Как это работает
Предыдущее решение, 18 байт
Попробуйте онлайн!
Хотел поделиться другим подходом, хотя это на 1 байт длиннее решения Джонатана Аллана .
Как это работает
источник
JavaScript (Node.js) ,
8885 байтПопробуйте онлайн!
Спасибо Арно за 2 байта
источник
J ,
43, 4037 байт-3 байта благодаря Bubbler
Попробуйте онлайн!
Объяснение:
Первая часть алгоритма гарантирует, что мы можем применить скользящее окно 3x3 для ввода. Это достигается путем добавления ряда нулей и поворота на 90 градусов, повторяется 4 раза.
источник
@:
и перемещаясь|.
. Обратите внимание, что@
вместо@:
не работает.Сетчатка 0.8.2 , 84 байта
Попробуйте онлайн! Объяснение:
Оберните каждую строку не
8
символами, чтобы все8
s имели хотя бы один символ с каждой стороны.Это последний этап, поэтому подсчет матчей подразумевается.
m
Модификатор делает^
и$
символы совпадают в начале или в конце каждой строки.Не сопоставляйте персонажа сразу после 8 или ...
... символ ниже 8;
(?(1).)^(?<-1>.)*
совпадает с тем же столбце, что и¶(.)*
на следующей строке, но.?.?
позволяет8
быть 1 слева или справа от символа после того , как.
на следующей строке.Матч
8
с.Не сопоставляйте 8 непосредственно перед 8, или ...
... персонаж с цифрой 8 в строке ниже; опять же ,
(?<-2>.)*$(?(2).)
совпадает с тем же столбце, что и(.)*¶
на предыдущей строке, но.?.?
позволяет8
быть 1 влево или вправо из8
прежде , чем.
на предыдущей строке.источник
Желе , 17 байт
Попробуйте онлайн! Или посмотрите набор тестов .
Как?
источник
J, 42 байта
Попробуйте онлайн!
объяснение
Высокоуровневый подход здесь аналогичен подходу, используемому в классическом APL-решении игры жизни: https://www.youtube.com/watch?v=a9xAKttWgP4. .
В этом решении мы сдвигаем нашу матрицу в 8 возможных соседних направлениях, создавая 8 дубликатов входных данных, складываем их вместе, а затем складываем «плоскости» вместе, чтобы получить количество соседей.
Здесь мы используем трюк «умножение на бесконечность», чтобы адаптировать решение для этой проблемы.
источник
~
а>
Java 8,
181157156 байт-24 байта благодаря @ OlivierGrégoire .
Принимает размеры в качестве дополнительных параметров
R
(количество строк) иC
(количество столбцов).Ячейки проверены очень похоже, как я сделал в моем ответе симулятора Fryer .
Попробуйте онлайн.
Объяснение:
источник
Python 2 , 130 байт
Попробуйте онлайн!
источник
Powershell, 121 байт
Менее гольф тестовый скрипт:
Выход:
Объяснение:
Сначала скрипт рассчитывает длину первой строки.
Во-вторых, это добавляет дополнительную границу к строкам. Строка дополненной
реальности:представляет многострочную строку:
Примечание 1: количество
=
достаточно для строки любой длины.Примечание 2: большое количество
=
не влияет на поиск восьмерок.Затем регулярное выражение
(?<=[^8]{3}.{$l}[^8])8(?=[^8].{$l}[^8]{3})
ищет цифру8
с предыдущими не-восьмыми(?<=[^8]{3}.{$l}[^8])
и следующими не-восьмыми(?=[^8].{$l}[^8]{3})
:Наконец, количество совпадений возвращается в результате.
источник
Желе , 12 байт
Попробуйте онлайн!
Как это работает
источник
JavaScript (ES6), 106 байт
Попробуйте онлайн!
Побитовый подход, 110 байтов
Попробуйте онлайн!
источник
[[7]]
Clojure ,
227198 байтУч. Определенно не самый короткий здесь, во всяком случае. 54 байта скобки - убийца. Я все еще относительно доволен, хотя.
-29 байт пути создания вспомогательной функции , которая генерирует диапазон , так как я делал это дважды, меняя
reduce
к(count (filter
установке, и избавиться от заправочного макроса после игры в гольфе.Где
test-cases
находится массив, содержащий все «тестовые примеры Python»Попробуйте онлайн!
источник