Знайдіть сусідів клітини


20

... або сусідства Тороїдального Мура

З огляду на позитивні цілі числа 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 за більше тестових випадків!


3
Чи можемо ми повернути 3-на-3 матрицю сусідів?
Адам

@ Adám, я вважаю за краще, щоб список не включав центральну клітинку, якщо це можливо. Але оцініть, що вже є відповіді. Чи достатньо просто це відфільтрувати?
Дом Гастінгс

Чи має значення замовлення?
Роберт Фрейзер

@RobertFraser Порядок не важливий. Я додам це до правил.
Дом Гастінгс

@DomHastings Я тлумачу цей коментар як: заборонено повертати матрицю 3 на 3 або включати центральну клітинку?
JungHwan Min

Відповіді:


8

JavaScript (ES6), 75 байт

Збережено 2 байти завдяки @KevinCruijssen

Очікує індекс на основі 0.

(h,w,i)=>[...'12221000'].map((k,j,a)=>(i+w+~-k)%w+~~(i/w+h+~-a[j+2&7])%h*w)

Спробуйте в Інтернеті!

Навколишні індекси повертаються у такому порядку:

54362701

Як?

Індекси кожної оточуючої комірки при ( x + d x , y + d y ) задаються:Ягх,гу(х+гх,у+гу)

Ягх,гу=((х+гх)модш)+ш((у+гу)модгод)=((N+гх)модш)+ш((Nш+гу)модгод)

де - індекс цільової комірки.N=шу+х

Проходимо список і віднімаємо 1, щоб отримати значення d x , яке дає:[1,2,2,2,1,0,0,0]1гх

[0,1,1,1,0,-1,-1,-1]

Для відповідних значень ми використовуємо той самий список, зміщений на 2 позиції, що дає:гу

[1,1,0,-1,-1,-1,0,1]

w*(~~(i/w+h+~-a[j+2&7])%h)щоб ~~(a[j+2&7]-1+i/w+h)%h*wзаощадити 2 байта, позбувшись від пари круглих дужок.
Kevin Cruijssen

@KevinCruijssen Приємний улов. Спасибі!
Арнольд

6

APL (Dyalog Classic) , 27 байт

{(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-14⌽,⍳3 3}

Спробуйте в Інтернеті!

{ }- це функція з аргументами (розміри h w) та (індекс i)

⍳3 3матриця з усіх 2-значних потрійних чисел: 0 0, 0 1, ...,2 2

, зараховує матрицю як вектор

1↓4⌽видаляє центральний елемент 1 1, обертаючи 4 вліво ( 4⌽) і опускаючи один ( 1↓)

1- віднімаємо від 1, даючи всі 8 засідань сусідів

( застосовує поїзд функції в дужках до кожного зміщення

⍺⊤⍵є базовим кодуванням - координат матриці

(⍺⊤⍵)-⊢ віднімає поточне зміщення, даючи координати сусіда

⍺|є модом, aщоб обернути навколо координат і залишитися в матриці

⍺⊥ декодує від бази


5

APL (Dyalog Unicode) , 40 байт SBCS

Функція анонімного вставки. Приймає h wяк лівий аргумент і iяк правий аргумент.

{14⌽,3 3↑,⍨⍣2⍪⍨⍣2⊃⊖∘⍉/(¯1+⍺⊤⍵),⊂⍺⍴⍳×/⍺}

Спробуйте в Інтернеті!

{} "Dfn"; лівий аргумент (розміри) і правий аргумент (індекс).

×/⍺ добуток (множення-зменшення) розмірів

 перше, що багато індексів

⍺⍴ використовувати розміри , щоб г eshape цієї

 укласти його (трактувати його як єдиний елемент)

(), Додайте наступне:

  ⍺⊤⍵ кодувати індекс у змішаному радіусі h w(це дає нам координати індексу)

  ¯1+ додати мінус до цих координат

⊖∘⍉/ зменшити за допомогою обертання-перенесення
  це еквівалентно y⊖⍉x⊖⍉... що еквівалентно y⊖x⌽... яке обертається ліворуч на стільки кроків, скільки iзміщено праворуч (менше одного), і обертається на стільки ж кроків, скільки iзрушено вниз (менше одного), викликаючи матриця 3 на 3, яку ми прагнемо знаходити у верхньому лівому куті

 розкрити (оскільки відновлення зменшило вектор до скалярного шляхом додавання)

⍪⍨⍣2 укладайте один на одного двічі (нам потрібні лише тричі для однорядних матриць)

,⍨⍣2 додайте до себе двічі (нам потрібні лише тричі для матриць з одноколонкою)

3 3↑ візьміть перші три ряди перших трьох стовпців

Наступні два кроки можна пропустити, якщо повернення матриці 3 на 3 є прийнятним:

, реве (згладжувати)

4⌽ обертати чотири кроки вліво (приводить центральний елемент вперед)

1↓ скиньте перший елемент


@ Adám виправити вищезазначене та скоротити його: {,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}я не впевнений, чи слід також видалити середній елемент: {4⌽1↓4⌽...}
ngn

@ngn Uh, це досить оригінально. Ви це публікуєте!
Адам

@ Adám нормально
ngn

Я не думаю, що у висновку буде центральний елемент.
JungHwan Min

1
В останньому тестовому випадку все ще є 8 елементів. Я думаю, що запланований вихід - це друк сусідів на відносних позиціях[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
JungHwan Min


4

R , 125 111 108 байт

function(x,i,m=array(1:prod(x),x),n=rbind(m,m,m),o=cbind(n,n,n),p=which(m==i,T)+x-1)o[p[1]+0:2,p[2]+0:2][-5]

Спробуйте в Інтернеті!

14 та 8 байтів, якими займаються @JayCe та @Mark.

Введення відбувається [w, h], iчерез те, що R спочатку заповнює стовпці масивів.

Створює масив, а потім "потроює" його в рядках та стовпцях. Потім знайдіть iу вихідному масиві та знайдіть його сусідство. Вихід без i.


1
Ви можете зберегти 14 байт . Я не знав того, що мав arr.ind аргумент, сьогодні щось дізнався!
JayCe

Ви можете зберегти 8 байт , замінюючи seq()з1:
Mark

3

PHP , 165 байт

Це "на основі 0". У PHP повинно бути краще рішення, але це вихідний момент!

<?list(,$h,$w,$i)=$argv;for($r=-2;$r++<1;)for($c=-2;$c++<1;)$r||$c?print(($k=(int)($i/$w)+$r)<0?$h-1:($k>=$h?0:$k))*$w+(($l=$i%$w+$c)<0?$w-1:($l>=$w?0:$l))%$w.' ':0;

Щоб запустити його:

php -n <filename> <h> <w> <i>

Приклад:

php -n cell_neighbours.php 4 5 1

Або спробуйте в Інтернеті!


3

K (нг / к) , 27 24 байт

{x/x!''(x\y)-1-3\(!9)^4}

Спробуйте в Інтернеті!

{ }- це функція з аргументами 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!''є mod xдля кожного - оберніть координати навколо, щоб залишитися в матриці

x/декодує з бази x- перетворює пари координат в одиничні цілі числа


З цікавості, чи має ваш варіант K прислівник "зворотні аргументи", як J ~?
Conor O'Brien

1
@ ConorO'Brien Жодна з знаних мені кіл (Kx's K, Kona, oK, and mine) не має цього, що шкода для гри в гольф. Є лише 6 вбудованих прислівників: / \ '/: \:': і жодного механізму для визначених користувачем таких немає.
ngn

Звичайно, я можу додати прислівник selfie, але гольф - це не самоціль для ngn / k, лише засіб для накопичення тестових випадків та досвіду.
ngn

Це справедливо. Звичайно, ви можете розглянути це як потенційний недолік мови. Я використовував PPCG, щоб допомогти розвинути Attache, і зрозумів, що Attache не вистачає деяких дуже корисних функцій, які я б інакше не включав. Я не використовую K, але, можливо, є й інші вживання, які можуть гарантувати такий тип прислівника?
Conor O'Brien

@ ConorO'Brien Я знайомий з APL, який подібний ~до J, і я переконаний у його корисності, але, бачте, k обмежується друкованим ASCII та (майже) відсутнім графіком, отже, нове прислівник означало б жертва деяких інших корисних примітивів, а також більше несумісність між реалізаціями. Я не бачу, що можу зробити, щоб це вкласти.
1818

2

MATL , 24 байти

*:2Geti=&fh3Y6&fh2-+!Z{)

Входи h, w, i. Вихід - векторний рядок або вектор стовпців з числами.

Вхід iі вихід на основі 1.

Спробуйте в Інтернеті! Або перевірити всі тестові випадки .

Пояснення

*     % Take two inputs implicitly. Multiply
      % STACK: 16
:     % Range
      % STACK: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16]
2G    % Push second input again
      % STACK: [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16], 4
e     % Reshape with that number of rows, in column-major order
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16]
t     % Duplicate
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16]
i=    % Take third input and compare, element-wise
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        [0 0 0 0; 0 1 0 0; 0 0 0 0; 0 0 0 0]
&f    % Row and column indices of nonzeros (1-based)
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], 2, 2,
h     % Concatenate horizontally
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2]
3Y6   % Push Moore mask
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2],
      %        [1 1 1; 1 0 1; 1 1 1]
&f    % Row and column indices of nonzeros (1-based)
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2],
      %        [1; 2; 3; 1; 3; 1; 2; 3], [1; 1; 1; 2; 2; 3; 3; 3] 
h     % Concatenate horizontally
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2],
      %        [1 1; 2 1; 3 1; 1 2; 3 2; 1 3; 2 3; 3 3] 
2-    % Subtract 2, element-wise
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16], [2 2],
      %        [-1 -1; 0 -1; 1 -1; -1 0; -1 0; -1 1; 0 1; 1 1] 
+     % Add, element-wise with broadcast
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        [1 1; 2 1; 3 1; 1 2; 3 2; 1 3; 2 3; 3 3]
!     % Transpose
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        [1 2 3 1 3 1 2 3; 1 1 1 2 2 3 3 3]
Z{    % Convert into a cell array of rows
      % STACK: [1 5 9 13; 2 6 10 14; 3 7 11 15; 4 8 12 16],
      %        {[1 2 3 1 3 1 2 3], [1 1 1 2 2 3 3 3]}
)     % Index. A cell array acts as an element-wise (linear-like) index
      % STACK: [1 2 3 5 7 9 10 11]

2

Мова Вольфрама (Mathematica) , 74 байти

Mod[i=#;w=#2;Mod[i+#2,w]+i~Floor~w+w#&@@@{-1,0,1}~Tuples~2~Delete~5,1##2]&

Спробуйте в Інтернеті!

Бере введення в зворотному ( i, w, h), на основі 0.

3x3 матриця з центральною коміркою в ній, (60 байт)

(Join@@(p=Partition)[Range[#2#]~p~#,a={1,1};3a,a,2a])[[#3]]&

Бере ( w, h, i), на основі 1.

Спробуйте в Інтернеті!


2

Пакет, 105 байт

@for /l %%c in (0,1,8)do @if %%c neq 4 cmd/cset/a(%3/%2+%1+%%c/3-1)%%%1*%2+(%3%%%2+%2+%%c%%3-1)%%%2&echo.

0-індексований. Збережено 23 байти, вкравши модуль @ ChasBrown за модулем 3.




1

Желе , 20 байт

PRs©Ṫ{œi+€Ø-Ż¤ŒpḊœị®

Дядічне посилання, що приймає список розмірів зліва [h,w]та клітинку як ціле число праворуч,i , яке дає список сусідства.

Примітка: порядок відрізняється від прикладів, дозволених в ОП

Спробуйте в Інтернеті!

Як?

PRs©Ṫ{œi+€Ø-Ż¤ŒpḊœị® - Link: [h,w], i
P                    - product -> h*w
 R                   - range -> [1,2,3,...,h*w]
    Ṫ{               - tail of left -> w
  s                  - split into chunks -> [[1,2,3,...w],[w+1,...,2*w],[(h-1)*w+1,...,h*w]]
   ©                 - ...and copy that result to the register
      œi             - multi-dimensional index of (i) in that list of lists, say [r,c]
             ¤       - nilad followed by link(s) as a nilad:
          Ø-         -   literal list -> [-1,1]
            Ż        -   prepend a zero -> [0,-1,1]
        +€           - addition (vectorises) for €ach -> [[r,r-1,r+1],[c,c-1,c+1]]
              Œp     - Cartesian product -> [[r,c],[r,c-1],[r,c+1],[r-1,c],[r-1,c-1],[r-1,c+1],[r+1,c],[r+1,c-1],[r+1,c+1]]
                Ḋ    - dequeue -> [[r,c-1],[r,c+1],[r-1,c],[r-1,c-1],[r-1,c+1],[r+1,c],[r+1,c-1],[r+1,c+1]]
                   ® - recall (the table) from the register
                 œị  - multi-dimensional index into (1-indexed & modular)

1

Attache , 66 байт

{a.=[]Moore[Integers@@__2,{Push[a,_]},cycle->1]Flat[a@_][0:3'5:8]}

Спробуйте в Інтернеті!

Мені все ще потрібно реалізувати Mooresі NMoore, але у мене все ще є Mooreфункція ітерації. По суті, Integers@@__2створює цілий масив фігури __2(останні два аргументи) перших Prod[__2]цілих чисел. Це дає нам цільовий масив. Потім вона Mooreповторює функцію {Push[a,_]}над кожним кварталом Мура за розміром 1(мається на увазі аргумент) з можливістю циклу кожного елемента ( cycle->1). Це додає кожен масив до масиву a. Потім Flat[a@_]вирівнюється третій _член a, тобто сусідство Мура, зосереджене навколо _(перший аргумент). [0:3'5:8]отримує всі члени, крім центру, з цього сплющеного масиву.

Це рішення з оновленням мови виглядатиме приблизно так (49 байт):

{Flat[NMoore[Integers@@__2,_,cycle->1]][0:3'5:8]}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.