3x3グリッドでネイバーインデックスを返す


11

さて、コードゴルフの2回目の試みで、これがどうなるか見てみましょう。

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はい、あなたはすでにそれに答えたので、少し遅すぎます。
hcorion

@Dennisはい、それをどのように置くかはよくわかりませんでした。私はCとpythonの答えが両方を提供することでそれをしたのが好きですが、最終的なものとしてハードコードされていない答えを持っています。ハードコーディングではなくアルゴリズムを奨励したかったのですが、それが可能かどうか(過度に長い答えなしで)確信が持てず、質問に答えたくありませんでした。
-hcorion

回答:


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隣人を見つけることに関するこれらの課題は、常に私に畳み込みアプローチを示唆しています。私は最後にそれらを分離できるようにするために必要なので、しかし、コンボリューションは、本質的にそれがの二大国-とバイナリ拡張パーツだ---、隣人の値を追加します
ルイス・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については何も知りません。
ハイパーニュートリノ

2
0インデックスとを使用して、バイトを保存できます31[420,51,...,75][[#]]&
マーティンエンダー

1
GridGraph@{3,3}~AdjacencyList~#&1バイトのインデックスを使用して、32バイトで使用できます。
ツリーではない

@ 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


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 3返します[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]は、4つすべての近隣が含まれています。各エントリのために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ヨハンセン

おっと、そのgcd部分は気にしないでください。それはあるべきだったし<3、それから壊れるn==0。あなたは可能性があなたにすべてのものを変更した場合、そのトリックを使用することができ1-indexed。
Ørjanヨハンセン

ああ、そしてn/=2&&n/=5に置き換えることができますmod x 3>0。(または、gcd現在2回使用されている可能性のある再インデックス付きバージョン。)
ØrjanJohansen

2

ルビー51 48 45バイト

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

オンラインでお試しください!

垂直および水平の隣人を持つ2つの配列を作成し、それらの1つ以上を選択します。

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インデックス付き。4バイトを節約してくれた@Neilに感謝します。

オンラインでお試しください!

ハードコードされたバージョン、56バイト

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

0インデックス付き


2
最初のバージョンでは、n>3&&p(n-3)4バイトを節約するなどを書くことはできませんか?2番目のバージョンではl[]=、バイトを保存するために書き込むことはできませんか?
ニール

@Neilはい、できます。ありがとう!
-Steadybox

あなたのコードは現在正しいですか?テストケースを試すと、3つすべてで失敗します。おそらく機能しているTIOリンクを提供してもらえますか?
ケビンCruijssen

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の回答に基づいて、それはほとんど同じコードであり、異なるトリックを使用し、同じ結果を生成するため、興味深いことに気付きました。これを正しくすることで、ルビーの答えをもう少し手伝うことができました。

基本的に、配列スライスインデックスが包括的であるため、Rubyの方が短くなります。Pythonは+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 'Cの回答に
基づく

ここで試してみてください。



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インデックス付き。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.