細胞の隣人を見つける


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

の場合、返される必要i0あります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 * w1インデックス付きの回答のため)。
  • あなたはそれを仮定することができますi >= 0(またはi > 01インデックス付きの回答のため)。
  • 返される値の順序は、必要な8つの値のみが含まれている限り重要ではありません。
  • 標準的な抜け穴は禁止されています。
  • これはので、各言語で最短の答えが勝ちです!

@Conor O'Brienに技術的なサウンドのタイトルを、@ ngmにテストケースを追加してくれてありがとう!


3
隣人の3行3列の行列を返すことができますか?
アダム

@Adám可能であれば、リストに中心セルを含めないことをお勧めします。しかし、すでに答えがあることを感謝します。これを除外するのは簡単ですか?
ドムヘイスティングス

順序は重要ですか?
ロバートフレイザー

@RobertFraser順序は重要ではありません。これをルールに追加します。
ドムヘイスティングス

@DomHastings私はそのコメントを次のように解釈します:3 x 3のマトリックスを返すことや中央のセルを含めることは許可されていませんか?
ジョンファンミン

回答:


8

JavaScript(ES6)、75バイト

@KevinCruijssenのおかげで2バイト節約

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 Idx,dy(x+dx,y+dy)

Idx,dy=((x+dx)modw)+w((y+dy)modh)=((N+dx)modw)+w((Nw+dy)modh)

ここで、はターゲットセルのインデックスです。N=wy+x

リストを、を引いての値を取得します。1 D X[1,2,2,2,1,0,0,0]1dx

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

の対応する値については、2つの位置でシフトされた同じリストを使用します。dy

[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バイトを節約します。
ケビンクルーッセン

@KevinCruijssen素敵なキャッチ。ありがとう!
アーナルド

6

APL(Dyalog Classic)、27バイト

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

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

{ }は、引数(次元h w)および(インデックスi)を持つ関数です

⍳3 3すべて2桁の三元数の行列であります:0 00 1、...、2 2

, 行列をベクトルとして登録します

1↓4⌽中心要素を削除し1 1(左4を回転させることによって4⌽()と1つをドロップ1↓

1- 1から減算し、8つのすべての隣接オフセットを与えます

( 括弧内の関数列を各オフセットに適用します

⍺⊤⍵のベースエンコーディングです- マトリックス内の座標

(⍺⊤⍵)-⊢ 現在のオフセットを減算し、隣人の座標を与える

⍺|a座標をラップしてマトリックス内にとどまるmod

⍺⊥ ベースからデコード


5

APL(Dyalog Unicode)、40 バイトSBCS

匿名挿入関数。h w左引数およびi右引数として取ります。

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

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

{} "dfn"; 左引数(次元)および右引数(インデックス)です。

×/⍺ 次元の積(乗縮約)

 最初の多くのインデックス

⍺⍴ 寸法を使用するRのことeshape

 囲みます(単一の要素として扱うため)

(), 次を追加します。

  ⍺⊤⍵ 混合基数でインデックスをエンコードしますh w(これにより、インデックスの座標が得られます)

  ¯1+ それらの座標に負の値を追加します

⊖∘⍉/ 転置による回転による削減
  これは、y⊖⍉x⊖⍉… と同等です。これは、… と同等です。これは、右にオフセットさy⊖x⌽れただけ左にi回転iし(1つ下)、下にオフセットされた数に応じて上に回転します。左上隅にある3行3列の行列

 開示(削減により、ベクトルをスカラーに縮小したため)

⍪⍨⍣2 自身の上に2回スタックします(1行の行列の場合に必要なのは3回だけです)

,⍨⍣2 自分自身に2回追加します(1列の行列の場合は本当に3回しか必要ありません)

3 3↑ 最初の3列の最初の3行を取得します

3行3列の行列を返すことが許容される場合、次の2つの手順は省略できます。

, ラベル(平坦化)

4⌽ 左に4ステップ回転します(中央の要素を前面に移動します)

1↓ 最初の要素をドロップします


@Adámは上記を修正して短縮します:{,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}、中央の要素も削除する必要があるかどうかわかりません:{4⌽1↓4⌽...}
ngn

@ngnうーん、それはかなりオリジナルです。あなたはそれを投稿します!
アダム

@Adámok
ngn

出力には中心要素が含まれるとは思われません。
ジョンファンミン

1
最後のテストケースには、まだ8つの要素があります。意図した出力は、相対的な位置で隣人を印刷することだと思う[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
ジョンファンミン


4

R125 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]

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

@JayCeと@Markによってゴルフされた14バイトと8バイト。

入力は[w, h], i、Rが最初に配列の列に入力するためです。

配列を作成し、行および列ごとに「トリプル」します。次にi、元の配列を見つけて、その近傍を見つけます。なしで出力しiます。


1
14バイト節約できます。私はarr.ind引数を持っていることを知らなかった、今日何かを学んだ!
JayCe

あなたは、保存することができます8つのバイトを交換することによってseq()1:
マーク

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(ngn / 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\ 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それぞれのmod です-座標をラップしてマトリックス内にとどまります

x/baseからデコードx-座標のペアを単一の整数に変換します


好奇心から、KのバリアントにはJのような「逆引数」副詞があり~ますか?
コナーオブライエン

1
@ ConorO'Brien私が知っているks(KxのK、Kona、oK、および私のもの)にはどれもありません。これはゴルフには不幸です。組み込みの副詞は6つのみです:/ \ '/:\:':およびユーザー定義の副詞はありません。
ngn

もちろん、自分撮りの副詞を追加することもできますが、ゴルフはそれ自体がngn / kの目的ではなく、テストケースと経験を蓄積する手段にすぎません。
ngn

それは公正です。もちろん、言語の潜在的な欠点としてそれを見ることができます。私はPPCGを使用してAttacheの開発を支援しましたが、Attacheには非常に便利な機能が欠けていることに気付きました。私はKを使用していませんが、おそらくそのタイプの副詞を保証する他のユースケースがありますか?
コナーオブライエン

@ ConorO'Brien私はAPLでよく知っていますが、これは~Jのようなものであり、その有用性は確信していますが、kは印刷可能なASCIIに制限されており、(ほとんど)有向グラフがないため、新しい副詞は他の有用なプリミティブの犠牲と、実装間の非互換性。これを入れるために何ができるかわかりません。
ngn

2

MATL、24バイト

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

入力はhwi。出力は、数値を含む行ベクトルまたは列ベクトルです。

入力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

バッチ、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インデックス。@ChasBrownのモジュロ3トリックを盗んで23バイトを節約しました。




1

ゼリー、20 バイト

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

左側のディメンションのリストを受け入れるダイアディックリンク[h,w]、および右側の整数としてのセルを受け入れi、近隣のリストを生成します。

注:順序は、OPで許可されている例の順序とは異なります

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

どうやって?

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

添付ファイル、66バイト

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

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

私はまだ実装する必要があるMooresNMoore、私はまだ持ってMoore反復機能として機能します。基本的に、最初の整数Integers@@__2の形状__2(最後の2つの引数)の整数配列を作成しProd[__2]ます。これにより、ターゲット配列が得られます。次に、各要素を循環させるオプション()を使用して、サイズの各ムーア近傍(暗黙の引数)に対してMoore関数{Push[a,_]}を繰り返し1ますcycle->1。これにより、各近傍が配列に追加されますa。次に、Flat[a@_]_th番目のメンバーa、つまり中心に位置するムーア近傍を平坦化し_ます(最初の引数)。[0:3'5:8]この平坦化された配列から中心を除くすべてのメンバーを取得します。

このソリューションは、言語を更新すると、次のようになります(49バイト):

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

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