Повернути індекс сусідів у 3x3 сітці


11

Добре, моя друга спроба кодового гольфу, давайте подивимося, як це відбувається.

Зробіть вигляд, що у вас є масив з 9 значень. Тепер уявіть цей масив у сітці 3х3.

Потрібно повернути сусідам, яке число має як індекси масиву.

0 | 1 | 2

3 | 4 | 5

6 | 7 | 8

Правила:

  • Це код гольфу, тому найкоротша відповідь виграє.
  • Індекс масиву притворів може починатися з 0 або 1. (хоча в усіх прикладах використовується 0)
  • Просто повернення значень значень нахмуриться (як if 3: return 046)
  • Подання може бути просто процедурою / функцією / методом, але приклад був би непоганим
  • Повернене значення може бути в будь-якому порядку (наприклад, якщо вхід 0, це може бути 13 або 31)
  • якщо ви хочете, вихід може бути списком чисел, наприклад [0,4,6]замість046
  • діагоналі не враховуються, як видно з прикладів.

Приклади:

вхід:

0

вихід:

13

вхід:

3

вихід:

046

вхід:

4

вихід:

1357 рік


4
Схоже, цей виклик може отримати користь через деякий час у пісочниці . Ви можете опублікувати свій виклик там, щоб інші могли переглянути його та допомогти вам вирішити його перед тим, як опублікувати його на основну. З ваших прикладів я здогадуюсь, що ви не рахуєте діагоналей. Ви можете додати це питання до самого питання. Ви також згадуєте вимогу вивести індекси масиву, які є сусідами. Я думаю, що це може бути просто кодовано для 3x3 сітки. Може, краще буде вивести самих сусідів?
Пукайте

7
Просто так ви знаєте, нахмурене насправді не те, що ми робимо тут; жорстке кодування виводу або дозволено, або його немає. Оскільки зазвичай досить важко визначити, що саме вважається жорстким кодуванням, я особисто просто дозволю це або надаю розмір сітки як додатковий вклад.
Денніс

1
Чи може висновок бути списком чисел, наприклад [0,4,6]замість 046?
Лайконі

@Laikoni Так, трохи пізно, тому що ви вже відповіли на це.
хоріон

@Dennis Так, я не був зовсім впевнений, як це зробити. Мені подобається, як це зробили відповіді C та python, надавши і те, і інше, але не жорсткий зашифрований відповідь як остаточний. Я хотів заохочувати алгоритми, а не жорстке кодування, але я не був впевнений, чи це можливо (без надто довгих відповідей), і не хотів відповідати на моє запитання.
хоріон

Відповіді:


2

Желе , 16 13 байт

9Ḷ,d3ạ/S€=1T’

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

Як це працює

9Ḷ,d3ạ/S€=1T’  Main link. Argument: n (0, ..., 8)

9              Set the return value to 9.
 Ḷ             Unlength; yield [0, ..., 8].
  ,            Pair; yield [[0, ..., 8], n].
   d3          Divmod 3; yield [[[0, 0], ..., [2, 2]], [n:3, n%3]]].
     ạ/        Reduce by absolute difference, yielding
               [[|0 - n:3|, |0 - n%3|], ..., [[|2 - n:3|, |2 - n%3|]].
       S€      Sum each, yielding
               [|0 - n:3| + |0 - n%3|, ..., [|2 - n:3| + |2 - n%3|].
         =1    Compare the sums with 1.
           T   Truth; yield all 1-based indices of 1.
            ’  Decrement to yield all 0-based indices of 1.

У правилах зазначено: "Індекс масиву претендентів може починатися з 0 або 1." - ви можете скинути Указ в кінці.
steenbergh

@steenbergh Я вважаю, що мені доведеться також взяти 1-базисний вхід, який коштує стільки байтів, скільки економить.
Денніс

9

MATL , 17 16 байт

9:qWIe1Y6Z+i)BPf

Масив заснований на 1, тобто містить числа від 1до 9.

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

Пояснення

Розглянемо вклад 2як приклад.

9:q  % Push [0 1 2 ... 8]
     % STACK: [0 1 2 ... 8]
W    % Rise to 2, element-wise
     % STACK: [1 2 4 ... 256]
Ie   % Reshape as 3-row matrix (column-major order)
     % STACK: [1   8  64;
               2  16 128;
               4  32 256]
1Y6  % Push [0 1 0; 1 0 1; 0 1 0]
     % STACK: [1   8  64;
               2  16 128;
               4  32 256],
              [0   1   0;
               1   0   1;
               0   1   0]
Z+   % Convolution, maintaining size
     % STACK: [10  81 136;
               21 170 336;
               34 276 160]
i    % Take input, n
     % STACK: [10  81 136;
               21 170 336;
               34 276 160],
               2
 )   % Get n-th entry (1-based; column-major order)
     % STACK: 21
B    % Convert to binary
     % STACK: [1 0 1 0 1]
P    % Flip
     % STACK: [1 0 1 0 1]
f    % Find: gives indices of nonzeros. Implicitly display
     % STACK: [1 3 5]

1
Ват? Як ви придумали це?
Роберт Фрейзер

1
@RobertFraser Ці виклики щодо пошуку сусідів завжди пропонують мені конверсійний підхід. Але згортання суттєво додає цінностей сусідів, тому мені потрібно було вміти відокремлювати їх наприкінці --- це повноваження двох та двійкові частини розширення
Луїс Мендо

5

Математика, 32 байти

GridGraph@{3,3}~AdjacencyList~#&

Використовує графік замість масиву. GridGraph@{3,3}будує графік розміром 3х3, показаний нижче, який Mathematica корисно позначає цифрами 1–9 для вершин за замовчуванням. Потім ~AdjacencyList~#&повідомляє вам сусідів вершини.

Графік сітки 3х3


Треба любити ті вбудовані ...
Ніл

4

Математика, 40 байт

{24,135,26,157,2468,359,48,579,68}[[#]]&

1-індексований. Просто шукає відповідь. Чи може хтось краще в математиці?


3
Я здивований, що для цього немає побудови. Як би я очікував, що там буде вбудований, щоб знайти всіх сусідів елемента в двовимірному масиві, але я не впевнений, я не знаю нічого про Mathematica, крім того, що в ньому занадто багато вбудованих.
HyperNeutrino

2
Ви можете зберегти байт, використовуючи 0-індексацію та 31[420,51,...,75][[#]]&.
Мартін Ендер

1
Ви можете використовувати GridGraph@{3,3}~AdjacencyList~#&32 байти з 1-індексуванням.
Не дерево

@ lanlock4 Дивовижно! Будь ласка, зробіть цю відповідь, щоб я міг її схвалити!
Грег Мартін

4

Октава, 42 40 39 байт

@(n,x=~e(3),y=x(n)=1)find(bwdist(x)==1)

Індекс на основі 1.

Перевірте всі тестові випадки.

Пояснення:

x=~e(3);         % create a 3*3 matrix of zeros
x(n)=1;          % set the element with index n to 1
d=bwdist(x);     % compute the distance transform of the matrix
find(d == 1)     % find where the distance is 1.

Приклад: n = 2

x =

   0   0   0
   1   0   0
   0   0   0

(В Octave дані зберігаються в стовпцях.)

d =

   1.00000   1.41421   2.23607
   0.00000   1.00000   2.00000
   1.00000   1.41421   2.23607

логічний індекс, де відстань дорівнює 1:

d == 1

 1   0   0
 0   1   0
 1   0   0

find(d ==1)

 1
 3
 5


2

Haskell , 74 71 68 байт

f n=[x|x<-[n-3,n-1..n+3],0<x,x<10,gcd 3x<2||n-1/=x,gcd 3n<2||n+1/=x]

Спробуйте в Інтернеті! Використовує 1-індексовану сітку. Приклад використання: f 3повертає [2,6].

Редагувати: Збережено 3 6 байт завдяки Ørjan Johansen!


Для 77 75 байт наступна функція #працює для довільного розміру сітки m:

n#m=[x|x<-[n-m,n-1,n+1,n+m],0<x,x<=m*m,gcd x m<m||n-1/=x,gcd n m<m||n+1/=x]

Спробуйте в Інтернеті! Для кожного nсписку [n-m,n-1,n+1,n+m]містяться всі чотири сусіди. Кожен запис xу цьому списку ми перевіряємо -1<xта x<m*mпереконуємося x, що не знаходиться над та нижче сітки, mod n 3>0||n-1/=xщоб застосувати ліву межу сітки та mod(n+1)m>0||n+1/=xліву межу.


1
Ви можете використовувати [n-3,n-1..n+3]і gcd 3n>1.
Ørjan Johansen

На жаль, не забувайте про цю gcdчастину. Це повинно було бути <3, а потім перерви на n==0. Можливо, ви зможете скористатися цим трюком, якщо зміните все на 1-indexed.
Ørjan Johansen

О, і n/=2&&n/=5баночку можна замінити mod x 3>0. (Або gcdверсія з переіндексацією, яка зараз може використовуватися двічі.)
Ørjan Johansen

2

Рубі , 51 48 45 байт

->a{[a+3,a-3][a/6..a/3]+[a+1,a-1][a%-3..a%3]}

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

Створіть 2 масиви з вертикальними та горизонтальними сусідами, а потім виберіть один або декілька з них.

Рубіновий жорсткий код, 44 байти

->a{%w(13 024 15 046 1357 248 37 468 57)[a]}

... Не варто.


2

C, 100 92 91 83 78 74 байт

p(n){putchar(n+48);}f(n){n>3&&p(n-3);n<7&&p(n+3);n%3&&p(n+1);--n%3&&p(n);}

1-індексований. Завдяки @Neil за збереження 4 байтів.

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

Версія з твердим кодом, 56 байт

l[]={13,204,15,406,1357,248,37,468,57};
#define L(n)l[n]

0-індексований


2
У першій версії ви не можете писати n>3&&p(n-3)тощо, щоб зберегти 4 байти? У другій версії ви не можете написати, l[]=щоб зберегти байт?
Ніл

@Neil Так, я можу. Дякую!
Steadybox

Ви впевнені, що ваш код наразі правильний? Коли я пробую тестові випадки, це не вдається для всіх трьох ..: S Спробуйте тут. Не могли б ви надати працюючу TIO-посилання, можливо, я щось роблю не так?
Кевін Кройсейсен

1
@KevinCruijssen TIO додано посилання, і, схоже, я забув редагувати фактичний код під час останньої редагування ... О, добре. Ваше посилання також працює правильно, але зауважте, що моя відповідь є 1-індексованою, тоді як приклади тестових випадків 0-індексовані.
Steadybox

@Steadybox Ах, ти справді правий. Я пропустив 1-індексовану частину, моє погано. Дякуємо, що додали TIO. +1
Кевін Круїссен

1

Python 2, 51 байт

lambda x:[x+3,x-3][x/6:x/3+1]+[x+1,x-1][x%-3:x%3+1]

На основі попередньої версії моєї відповіді Ruby , мені здалося, що це цікаво, оскільки це здебільшого той самий код, використовуючи інший трюк, і дає такий же результат. Отримати це право допомогло мені гольф рубін відповідь трохи більше.

В основному, рубін має його коротше, оскільки індекс фрагментів масиву включений, python потребує a +1для компенсації.

Пояснення

Отримайте 2 масиви (вертикальні та горизонтальні сусіди), а потім виберіть один або обидва на основі деяких розрахунків.


1

Java 7, 63 байти (з твердим кодом)

int c(int i){return new int[]{31,420,51,640,7531,842,73,864,75}[i];}

0 індексовані
(вихід задом наперед , тому що 024і 046не є дійсними числами.)
Тим НЕ менше працює на НЕ закодовану версію, але я можу запевнити вас , що не коротше ..

Спробуйте тут.


82 байти

String c(int n){return""+(n>3?n-3:"")+(n<7?n+3:"")+(n%3>0?n+1:"")+(--n%3>0?n:"");}

1-індексовано
на основі відповіді C @ @Steadybox

Спробуйте тут.



0

Пакетна, 116 байт

@set c=cmd/cset/a%1
@set/ar=%1%%3
@if %1 gtr 2 %c%-3
@if %r% gtr 0 %c%-1
@if %r% lss 2 %c%+1
@if %1 lss 6 %c%+3

0-індексований.

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