Moore İterasyonu


9

Bilgi

1'den 9'a kadar olan sayıların her biri Moore Mahallesi'ndeki bir hücreyi temsil eder , 5 tanesi merkez hücredir. Yani:

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}

Meydan okuma

STDIN, ARGV veya işlev bağımsız değişkeni ile girdi alabilir ve sonucu döndürebilir veya STDOUT'a yazdırabilirsiniz. Giriş bir N x N ızgaradır (torus topolojisi, yani x veya y <1 sonra x veya y = N ve x veya y> N sonra x veya y = 1 ise) ve programınız bunun bir entegrasyonunu çıkarmalıdır her hücreyi Moore'un Mahalle hücresindeki değerle değiştirerek

Örnek Giriş ızgarası (2 x 2):

13
79

Çıktı:

97
31

Açıklama:

1,1 konumundan başlayarak 1 değerine sahibiz, çünkü 1 = {- 1, -1} değerine 1 + (- 1), 1 + (- 1) = 0,0 değerini getirmeliyiz. Ve bu bir torus 0,0 olduğundan N'ye sarılırız. Bu nedenle, 1,1 (1) konumundaki hücre değerini, 2,2 (9) konumundaki hücre değeriyle alırız.

Bir sonraki hücre 1,2 için 3 (= -1, 1) değerine sahibiz, böylece 1 + (- 1), 2 + (1) = 0,3. 7 değeri olan 2,1'e sarar.

2,1'deki bir sonraki hücre değeri 7 (= 1, -1) yani 2+ (1), 1 + (- 1) = 3,0. 3 değeri olan 1,2'ye sarar.

2,2'deki bir sonraki hücre değeri 9 (= 1, 1) yani 2+ (1), 2 + (1) = 3,3'tür. 1 değeri olan 1,1'e sarar.

Daha fazla örnek

Giriş Izgarası (3 x 3):

123
456
789

Beklenen çıktı:

987
654
321

Giriş Izgarası (5 x 5):

77497
81982
32236
96336
67811

Beklenen çıktı:

28728
37337
11923
73369
77433

Son Notlar

Herhangi bir sorunuz varsa yorum yapmaktan çekinmeyin. Bu bir kod golf meydan okuma, en kısa kod kazanır!


Bir elemanın konumunu nasıl tanımlarsınız? Giriş hücre kümesinin nasıl dizine eklendiğini anlamıyorum.
Rainbolt

@Rainbolt Girdi satırlar, sonra sütunlar tarafından endekslenir. Yani son örnekte (giriş) 2,3'teki hücre değeri 9'dur. Satır 2 = 81982 ve bunun üçüncü sütunu 9'dur.
AndoDaan


4
"Moore örnekleri" okunamadı.
tomsmeding

Yanıtlar:


9

APL (33)

APL edildi yapılmış bunun için. Bu, giriş ızgarasını bir N-N matrisi olarak alan ve çıkış ızgarasını bir N-N matrisi olarak döndüren bir işlevdir.

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

Ölçek:

      ⍝ 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 bunun için yapılmadı ... APL oldu!


3

Python, 105

Bir liste alır ve döndürür:

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

Bir dize alır ve döndürür (148 karakter):

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 bayt

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 bunun için APL'den biraz daha az, ancak bunun için Python'dan biraz daha fazla yapıldı. ;)

Test Çıkışı

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.