ムーア反復


9

情報

1から9までの数字はそれぞれMoore's Neighborhoodのセルを表し、5が中央のセルです。そう:

123
456
789

1={-1,-1} 2={-1, 0} 3={-1, 1}
4={ 0,-1} 5={ 0, 0} 6={ 0, 1} 
7={ 1,-1} 8={ 1, 0} 9={ 1, 1}

チャレンジ

STDIN、ARGV、または関数の引数を介して入力を取得し、結果を返すか、STDOUTに出力できます。入力はN x Nグリッド(トーラストポロジ、つまりxまたはyが<1の場合はxまたはy = N、xまたはy> Nの場合はxまたはy = 1)であり、プログラムはその1つの反復を出力する必要があります各セルをムーアのNeighborhoodセルの値で置き換えることによりグリッド。

入力グリッドの例(2 x 2):

13
79

出力:

97
31

説明:

位置1,1から開始して、値1があります。値1 = {-1、-1}は、1 +(-1)、1 +(-1)= 0,0を取得する必要があるためです。そして、それはトーラス0,0であるため、Nにラップアラウンドします。したがって、位置1,1(1)のセル値を位置2,2(9)のセル値で取得します。

次のセル1,2の値は3(= -1、1)なので、1 +(-1)、2 +(1)= 0,3になります。値7である2,1に折り返します。

2,1の次のセル値は7(= 1、-1)なので、2 +(1)、1 +(-1)= 3,0です。値3である1,2に折り返します。

2,2の次のセル値は9(= 1、1)なので、2 +(1)、2 +(1)= 3,3です。値1である1,1に折り返します。

その他の例

入力グリッド(3 x 3):

123
456
789

期待される出力:

987
654
321

入力グリッド(5 x 5):

77497
81982
32236
96336
67811

期待される出力:

28728
37337
11923
73369
77433

最終メモ

何か質問があれば、遠慮なくコメントしてください。これはコードゴルフチャレンジであり、最短のコードが勝ちます!


要素の位置をどのように定義しますか?セルの入力セットがどのようにインデックス付けされるのか理解できません。
— Rainbolt 2014

@Rainbolt入力には、行の次に列のインデックスが付けられます。そう2,3最後の例では(入力)セル値は、9行2 = 81982であり、その3列目は9である
— AndoDaan


4
「ムーアの例」を読まざるを得なかった。
— tomsmeding 2014

回答:


9

APL(33)

APLはこのために作成されました。これは、入力グリッドをN行N列の行列として受け取り、出力グリッドをN行N列の行列として返す関数です。

{(⍳⍴⍵)⌷¨(,∆∘.⊖(∆←2-⌽⍳3)∘.⌽⊂⍵)[⍵]}

テスト:

      ⍝ define input matrices
      ∆1 ← ↑(1 3)(7 9)
      ∆2 ← ↑(1 2 3)(4 5 6)(7 8 9)
      ∆3 ← ↑(7 7 4 9 7)(8 1 9 8 2)(3 2 2 3 6)(9 6 3 3 6)(6 7 8 1 1)
      ⍝ show input matrices
      ∆1 ∆2 ∆3
 1 3  1 2 3  7 7 4 9 7 
 7 9  4 5 6  8 1 9 8 2 
      7 8 9  3 2 2 3 6 
             9 6 3 3 6 
             6 7 8 1 1 
      ⍝ apply function to input matrices giving output matrices
      {(⍳⍴⍵)⌷¨(,∆∘.⊖(∆←2-⌽⍳3)∘.⌽⊂⍵)[⍵]} ¨ ∆1 ∆2 ∆3
 9 7  9 8 7  2 8 7 2 8 
 3 1  6 5 4  3 7 3 3 7 
      3 2 1  1 1 9 2 3 
             7 3 3 6 9 
             7 7 4 3 3 

5

Python、174

def t(b):b=b.split("\n");E=enumerate;C=[-1]*3+[0]*3+[1]*3+[-1,0,1]*3;print"\n".join("".join(b[(i+C[int(x)-1])%len(b)][(j+C[int(x)+8])%len(y)]for j,x in E(y))for i,y in E(b))

Pythonはこのために作られていません ... APLはそうでした!


3

Python、105

リストのリストを受け取って返します。

def f(a):e=enumerate;n=len(a);return[[a[(y+(v-1)/3-1)%n][(x+(v-1)%3-1)%n]for x,v in e(u)]for y,u in e(a)]

文字列(148文字)を受け取って返します。

def f(s):
 a=[map(int,l)for l in s.split()];n=len(a);e=enumerate
 for y,u in e(a):print''.join(`a[(y+(v-1)/3-1)%n][(x+(v-1)%3-1)%n]`for x,v in e(u))

2

MATLAB-121バイト

function O=X(I),m=size(I,1);n=3*m;o=-1:1;c=o<2;M=c'*o+n*o'*c;D=repmat(I,3);C=D;C(:)=1:n*n;t=m+(1:m);O=C+M(D);O=D(O(t,t));

これは、MATLABがAPLよりもわずかに少ないが、Pythonよりもわずかに多かった。;)

テスト出力

X( [1 2 3; 4 5 6; 7 8 9] )

ans =

     9     8     7
     6     5     4
     3     2     1

X( [7 7 4 9 7; 8 1 9 8 2; 3 2 2 3 6; 9 6 3 3 6; 6 7 8 1 1] )

ans =

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