在3x3网格中返回邻居索引


11

好吧,我第二次尝试打高尔夫,让我们看看这是怎么回事。

假设您有9个值的数组。现在,假设该数组位于3x3网格中。

您需要返回该数字作为数组索引的邻居。

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
看起来这个挑战可能会从Sandbox的一段时间中受益。您可以在此处发布您的挑战,以便其他人可以对其进行审核并在将其发布到主要任务之前为您提供帮助。从您的示例中,我猜测您没有计算对角线。您可能需要将此添加到问题本身。您还提到了输出相邻数组索引的要求。我认为可以将其硬编码为3x3网格。自己输出邻居会更好吗?

7
可以知道,皱眉并不是我们在这里真正要做的;硬编码输出是允许的还是不允许的。由于通常很难定义确切算作硬编码的内容,因此我个人允许使用它或将网格大小作为附加输入。
丹尼斯

1
输出是否可以是数字列表,例如[0,4,6]而不是046
Laikoni

@Laikoni是的,为时已晚,因为您已经回答了。
hcorion

@丹尼斯是的,我不太确定如何放置它。通过提供两者,我喜欢C和python答案的实现方式,但是将非硬编码答案作为最终答案。我想鼓励算法而不是硬编码,但是我不确定是否有可能(没有太长的答案),而且我不想对我的问题没有答案。
hcorion

Answers:


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

MATL17 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这些有关寻找邻居的挑战总是向我提出卷积方法。但是卷积从本质上增加了邻居的价值,所以我需要能够在最后将它们分开-这就是二幂和二进制扩展部分
Luis Mendo

5

Mathematica,32个字节

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

使用图形而不是数组。GridGraph@{3,3}构造一个3x3的网格状图形,如下所示,默认情况下,Mathematica会用顶点的数字1–9对其进行标记。然后~AdjacencyList~#&告诉您顶点的邻居。

3x3网格图


要爱那些内建的东西……
尼尔

4

Mathematica,40个字节

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

1个索引。只是查找答案。有人可以在Mathematica中做得更好吗?


3
我很惊讶没有内置的功能。就像我期望有一个内置函数可以在2D数组中查找元素的所有邻居一样,但是我不确定,除了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

(在八度中,数据按列存储。)

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

3

Python 2,71个字节

lambda n:filter(abs,[(n-3)*(n>3),(n+3)*(n<7),~-n*(n%3!=1),-~n*(n%3>0)])

1索引
在线尝试!


从预定义的结果列表中获取结果的时间较短(46个字节):

[13,204,15,406,1357,248,37,468,57].__getitem__

0索引
在线尝试!


2

Haskell74 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 3return [2,6]

编辑:由于ØrjanJohansen,保存了3 6个字节!


对于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<xx<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
与Orjan约翰森

糟糕,不要介意那gcd部分。它本来应该是<3,然后中断n==0。你也许可以,如果你改变一切,以使用该伎俩1-indexed。
与Orjan约翰森

哦,n/=2&&n/=5可以用代替mod x 3>0。(或gcd带有重新索引的版本,现在可能会使用两次。)
ØrjanJohansen

2

红宝石51 48 45字节

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

在线尝试!

创建2个具有垂直和水平邻居的数组,然后选择一个或多个。

Ruby硬编码,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'3

您确定您的代码当前正确吗?当我尝试测试用例时,这三个方法均失败。:S 在这里尝试。您能否提供一个有效的TIO链接,或者我做错了什么?
凯文·克鲁伊森

1
添加了@KevinCruijssen TIO链接,看来我忘了在最后一次编辑时才编辑实际代码...哦,好。您的链接也正常工作,但是请注意,我的答案是1索引的,而示例测试用例是0索引的。
Steadybox

@Steadybox啊,您确实是对的。我错过了1索引部分,这很糟糕。感谢您添加TIO。+1
Kevin Cruijssen

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回答的先前版本,我发现它很有趣,因为它基本上是相同的代码,只是使用了不同的技巧而产生了相同的结果。正确解决这一问题使我对红宝石的高尔夫球答案有了更多的了解。

基本上,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索引
(由于024046不是有效的整数,所以输出相反的顺序。)
仍在非硬编码版本上工作,但是我可以保证它不会更短。

在这里尝试。


82字节

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

1索引
基于@Steadybox答案

在这里尝试。


0

JavaScript + lodash,71个字节

f=a=>_.range(9).filter(b=>a>b?f(b).includes(a):[,1,,1][b-a]&&b%3|a%3<2)

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索引。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.