... или Тороидальные окрестности Мура
Учитывая положительные целые числа h
, w
и неотрицательное целое число i
, возвращать все индексы окружающих i
.
Вы должны принять матрицу, состоящую из h
строк w
элементов, пронумерованных от самого низкого в верхнем левом углу до самого высокого в нижнем правом углу, и вернуть, в любом разумном формате, список индексов, которые будут окружить указатель i
. Эта матрица является тором (бесконечная карта, которая оборачивается вокруг каждого ребра).
Например, входы h=4
и w=4
, приведут к матрице:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
но более конкретно:
15 12 13 14 15 12
3 0 1 2 3 0
7 4 5 6 7 4
11 8 9 10 11 8
15 12 13 14 15 12
3 0 1 2 3 0
так что если бы i
было 0
, вам нужно было бы вернуться 15, 12, 13, 3, 1, 7, 4, 5
(на основе 0).
Примеры
0 на основе:
h w i Expected result
4 4 5 0, 1, 2, 4, 6, 8, 9, 10
4 4 0 15, 12, 13, 3, 1, 7, 4, 5
4 5 1 15, 16, 17, 0, 2, 5, 6, 7
1 3 2 1, 2, 0, 1, 0, 1, 2, 0
1 1 0 0, 0, 0, 0, 0, 0, 0, 0
1 на основе:
h w i Expected result
4 4 6 1, 2, 3, 5, 7, 9, 10, 11
4 4 1 16, 13, 14, 4, 2, 8, 5, 6
4 5 2 16, 17, 18, 1, 3, 6, 7, 8
1 3 3 2, 3, 1, 2, 1, 2, 3, 1
1 1 1 1, 1, 1, 1, 1, 1, 1, 1
правила
- Ваш ответ может быть 0 или 1 проиндексирован, ваш выбор, пожалуйста, уточните.
- Вы можете предположить, что
i < h * w
(илиi <= h * w
для 1-индексированных ответов). - Вы можете предположить, что
i >= 0
(илиi > 0
для 1-индексированных ответов). - Порядок возвращаемых значений не важен, если включены только восемь желаемых значений.
- Стандартные лазейки запрещены .
- Это код-гольф, поэтому выигрывает самый короткий ответ на каждом языке!
Спасибо @Conor O'Brien за более технически звучащий заголовок и @ngm за дополнительные тестовые примеры!
Ответы:
JavaScript (ES6), 75 байт
Сохранено 2 байта благодаря @KevinCruijssen
Ожидает индекс на основе 0.
Попробуйте онлайн!
Окружающие индексы возвращаются в следующем порядке:
Как?
Индексы каждой окружающей ячейки в точке ( x + d x , y + d y ) определяются как:Idx,dY (x+dИкс,y+dy)
где - индекс целевой клетки.N=wy+x
Мы список и вычитаем чтобы получить значение , которое дает:1 d x[1,2,2,2,1,0,0,0] 1 dx
Для соответствующих значений мы используем тот же список, смещенный на 2 позиции, что дает:dy
источник
w*(~~(i/w+h+~-a[j+2&7])%h)
чтобы~~(a[j+2&7]-1+i/w+h)%h*w
сэкономить 2 байта, избавившись от пары скобок.APL (Dyalog Classic) , 27 байтов
Попробуйте онлайн!
{
}
это функция с аргументами⍺
(размерыh w
) и⍵
(индексi
)⍳3 3
матрица из всех 2-значных тройных чисел:0 0
,0 1
, ...,2 2
,
зачисляет матрицу в качестве вектора1↓4⌽
удаляет центральный элемент1 1
, поворачивая 4 влево (4⌽
) и опуская один (1↓
)1-
вычитает из 1, давая все 8 соседних смещений(
)¨
применяет последовательность функций в скобках к каждому смещению⍺⊤⍵
это базовая⍺
кодировка⍵
- координаты⍵
в матрице(⍺⊤⍵)-⊢
вычитает текущее смещение, давая координаты соседа⍺|
мод,a
чтобы обернуть вокруг координат и остаться в матрице⍺⊥
декодирует с базы⍺
источник
APL (Dyalog Unicode) , 40 байтов SBCS
Анонимная инфиксная функция. Принимает
h
w
как левый аргумент иi
как правый аргумент.Попробуйте онлайн!
{
…}
"Дфн";⍺
левый аргумент (размеры) и⍵
правый аргумент (индекс).×/⍺
произведение (умножение-уменьшение) размеров⍳
первое что много показателей⍺⍴
использовать размеры , чтобы г eshape этой⊂
заключить его (рассматривать как единый элемент)(
…),
Добавьте следующее:⍺⊤⍵
закодировать индекс в mixed-radixh
w
(это дает нам координаты индекса)¯1+
добавить отрицательный к этим координатам⊖∘⍉/
уменьшить на rotate-the-transposeэто эквивалентно
y⊖⍉x⊖⍉
... что эквивалентноy⊖x⌽
... который вращается влево на столько шагов, сколькоi
смещено вправо (меньше единицы), и вращается на столько шагов, сколькоi
смещено вниз (меньше единицы), что приводит к матрица 3 на 3 мы стремимся быть в верхнем левом углу⊃
раскрыть (потому что сокращение привело к скалярному вектору путем включения)⍪⍨⍣2
сложить поверх себя дважды (нам действительно нужно трижды для однорядных матриц),⍨⍣2
добавить к себе дважды (нам действительно нужно трижды для матриц с одним столбцом)3 3↑
возьмите первые три строки первых трех столбцовСледующие два шага могут быть опущены, если приемлем возврат матрицы 3 на 3:
,
Равель (сплющить)4⌽
поверните на четыре шага влево (переводит центральный элемент вперед)1↓
отбросить первый элементисточник
{,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}
я не уверен, стоит ли вам также удалять средний элемент:{4⌽1↓4⌽
...}
[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
Python 2 ,
796966 байтПопробуйте онлайн!
3 байта, подаренные Нилом, отметившим это
(x*w)%(h*w)==((x)%h)*w==(x)%h*w
.0-индексированное решение.
источник
%h*w
экономит 3 байта*w%(h*w)
.R ,
125 111108 байтПопробуйте онлайн!
14 и 8 байтов, сыгранные @JayCe и @Mark.
Входные данные
[w, h], i
потому, что сначала R заполняет столбец массивов.Создает массив, а затем «утраивает» его по строкам и столбцам. Затем найдите
i
в исходном массиве и найдите его окрестности. Выход безi
.источник
seq()
на1:
PHP , 165 байт
Это "0 на основе". В PHP должно быть лучшее решение, но это отправная точка!
Чтобы запустить это:
Пример:
Или попробуйте онлайн!
источник
K (нгн / к) ,
2724 байтаПопробуйте онлайн!
{
}
это функция с аргументамиx
(размерыh w
) иy
(индексi
)(!9)^4
это0 1 2 3 4 5 6 7 8
без4
3\
кодирует в троичной форме:(0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)
1-
вычитает из1
, давая соседние смещения:(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)
x\y
это базоваяx
кодировкаy
- координатыy
в матрице-
вычитает каждое смещение, давая нам 8 пар соседних координатx!''
модx
для каждого - обернуть координаты, чтобы остаться в матрицеx/
декодирует из базыx
- превращает пары координат в одно целое числоисточник
~
?⍨
APL, который похож~
на J, и я убежден в его полезности, но, как вы видите, k ограничен печатным ASCII и (почти) никакими орграфами, поэтому новое наречие будет означать жертва некоторого другого полезного примитива так же как больше несовместимости среди реализаций. Я не вижу, что я могу сделать, чтобы вставить это.MATL , 24 байта
Входы
h
,w
,i
. Выходными данными является вектор строки или вектор столбца с числами.Вход
i
и выход основаны на 1.Попробуйте онлайн! Или проверьте все тестовые случаи .
объяснение
источник
Wolfram Language (Mathematica) , 74 байта
Попробуйте онлайн!
Принимает ввод в обратном порядке (
i, w, h
), на основе 0.Матрица 3x3 с центральной ячейкой (60 байт)
Берет (
w, h, i
), 1 на основе.Попробуйте онлайн!
источник
Пакетная, 105 байт
0 индексированные. Сохранено 23 байта путем кражи уловки @ ChasBrown по модулю 3.
источник
MATL, 24 байта
Попробуйте это на MATL Online
Принимает участие
[w h]
иi
. 8 байт из этого былибесстыдно украдены извдохновленного ответом Луиса Мендоса, хотя общий подход отличается.источник
Чистый ,
8583 байтаПопробуйте онлайн!
Обрабатывается
i
как координата(0 <= p < h, 0 <= q < w)
и генерирует значения соседних элементов, в которых находится значениеp'w + q'
.источник
Желе , 20 байт
Диадическая ссылка, принимающая список измерений слева,
[h,w]
и ячейка в виде целого числа справаi
, что дает список окрестностей.Примечание: порядок отличается от порядка в примерах, который разрешен в OP
Попробуйте онлайн!
Как?
источник
Атташе , 66 байт
Попробуйте онлайн!
Мне все еще нужно реализовать
Moores
иNMoore
, но у меня все еще есть,Moore
который выполняет функцию итерации. По сути,Integers@@__2
создает целочисленный массив формы__2
(последние два аргумента) первыхProd[__2]
целых чисел. Это дает нам целевой массив. ЗатемMoore
выполняет итерацию функции{Push[a,_]}
по каждой окрестности Мура размера1
(подразумеваемый аргумент) с возможностью циклического выполнения каждого элемента (cycle->1
). Это добавляет каждую окрестность в массивa
. ЗатемFlat[a@_]
выравнивается_
членa
, то есть окрестности Мура, центрированные вокруг_
(первый аргумент).[0:3'5:8]
получает все члены кроме центра из этого сплющенного массива.Это решение с обновлением языка будет выглядеть примерно так (49 байт):
источник
Котлин , 88 байт
Использует нулевые индексы и выводит список из 8 элементов.
Попробуйте онлайн!
источник