Hücrenin Komşularını Bulun


20

... veya Toroidal Moore Semtleri

Pozitif tamsayılar ve negatif olmayan bir tamsayı göz önüne alındığında h, çevredeki tüm indeksleri döndürün .wii

En alttan sol üst köşede, en altta, sağ alt köşede en yüksek numaralı hsatırlardan oluşan bir matris varsayalım wve herhangi bir makul formatta endekslerin bir listesini döndürmelisiniz. dizini sarar i,. Bu matris bir torustur (her bir kenarı saran sonsuz bir harita).

Örneğin, girdiler h=4ve w=4, matrise neden olur:

 0  1  2  3 
 4  5  6  7
 8  9 10 11
12 13 14 15

ancak daha spesifik olarak:

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

eğer öyleyse bu ioldu 0, iade etmek gerekiyordu 15, 12, 13, 3, 1, 7, 4, 5(0 tabanlı).

Örnekler

0 tabanlı:

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-göre

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

kurallar

  • Cevabınız 0 veya 1 endeksli olabilir, seçiminizi lütfen belirtin.
  • Bunu i < h * w(ya da i <= h * w1 endeksli cevaplar için) varsayabilirsiniz .
  • Bunu i >= 0(ya da i > 01 endeksli cevaplar için) varsayabilirsiniz .
  • İstenen sekiz değer dahil edildiği sürece, döndürülen değerlerin sırası önemli değildir.
  • Standart boşluklar yasaktır .
  • Bu bu yüzden her dilde en kısa cevap kazanır!

Daha teknik sondaj başlığı için @Conor O'Brien ve daha fazla test örneği için @ngm'ye teşekkürler !


3
3'e 3 komşu matrisini döndürebilir miyiz?
Adám

@ Adám Mümkünse listenin orta hücreyi içermemesini tercih ederim. Ama takdir ediyorum zaten cevaplar var. Bunu filtrelemek yeterince kolay mı?
Dom Hastings

Sipariş önemli mi?
Robert Fraser

@RobertFraser Siparişi önemli değil. Bunu kurallara ekleyeceğim.
Dom Hastings

@DomHastings Bu yorumu şöyle yorumluyorum: 3'e 3 matris döndürmesine veya merkez hücresi eklemesine izin verilmiyor mu?
JungHwan Min

Yanıtlar:


8

JavaScript (ES6), 75 bayt

@KevinCruijssen sayesinde 2 bayt kaydedildi

0 tabanlı bir dizin bekliyor.

(h,w,i)=>[...'12221000'].map((k,j,a)=>(i+w+~-k)%w+~~(i/w+h+~-a[j+2&7])%h*w)

Çevrimiçi deneyin!

Çevredeki endeksler aşağıdaki sırayla döndürülür:

54362701

Nasıl?

( X + d x , y + d y ) ' deki her bir çevreleyen hücrenin indeksleri şöyle verilir:bendx,dy(x+dx,y+dy)

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

burada , hedef hücrenin dizinidir.N=wy+x

listesinde ve değerini almak için ;1 d x[1,2,2,2,1,0,0,0]1dx

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

Karşılık gelen değerleri için, 2 listeyle kaydırılan aynı listeyi kullanırız, bu da şunları verir:dy

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

w*(~~(i/w+h+~-a[j+2&7])%h)için ~~(a[j+2&7]-1+i/w+h)%h*wparantez çifti kurtulmak alarak 2 bayt kaydeder.
Kevin Cruijssen

@KevinCruijssen İyi yakaladım. Teşekkürler!
Arnauld

6

APL (Dyalog Klasik) , 27 bayt

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

Çevrimiçi deneyin!

{ }bağımsız değişkenleri (boyutları h w) ve (dizini i) içeren bir işlevdir

⍳3 3Tüm 2 haneli üçlü numaralarının bir matristir: 0 0, 0 1, ...,2 2

, matrisi vektör olarak listeler

1↓4⌽1 14 öğesini sola döndürerek ( 4⌽) ve birini ( 1↓) düşürerek orta elemanı kaldırır

1- 8'den tüm komşu ofsetleri veren 1'den çıkarır

( fonksiyon trenini parantez içinde her ofsete uygular

⍺⊤⍵base olduğu kodlama koordinatları - matriste

(⍺⊤⍵)-⊢ bir komşunun koordinatlarını vererek geçerli ofseti çıkarır

⍺|akoordinatları sarmak ve matris içinde kalmak için mod

⍺⊥ tabandan kod çözme


5

APL (Dyalog Unicode) , 40 bayt SBCS

Anonim infix işlevi. Alır h wsol argüman olarak ve isağ argüman olarak.

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

Çevrimiçi deneyin!

{} "Dfn"; sol argüman (boyutlar) ve sağ argüman (dizin).

×/⍺ boyutların çarpımı (çarpma-küçültme)

 bir çok endeks

⍺⍴ boyutlarını kullanmak R eshape bu

 içine alın (tek bir öğe olarak ele almak için)

(), Aşağıdakilerin başına:

  ⍺⊤⍵ dizini karışık yarıçapta kodlayın h w(bu bize dizinin koordinatlarını verir)

  ¯1+ bu koordinatlara negatif bir tane ekleyin

⊖∘⍉/bu  dönüşü döndürerek azaltın
  şuna eşdeğerdir y⊖⍉x⊖⍉… ki bu … eşittir y⊖x⌽… sola ikaydırılan kadar adım kadar sola döndürür (daha az) ve iofset kadar basamak kadar döndürür (daha az) sol üst köşede olmaya çalıştığımız 3'e 3 matris

 ifşa et (çünkü azalma vektörünü kuşatarak skaler hale getirdiğinden)

⍪⍨⍣2 iki kez üst üste yığar (tek satır matrisler için sadece üç kez ihtiyacımız vardır)

,⍨⍣2 iki kez kendine ekleyin (tek sütunlu matrisler için gerçekten üç kez ihtiyacımız var)

3 3↑ ilk üç sütunun ilk üç satırını al

3'e 3 matrisini döndürmek kabul edilebilirse sonraki iki adım atlanabilir:

, ravel (düzleştir)

4⌽ dört adım sola döndür (merkez elemanı öne getirir)

1↓ ilk elemanı bırak


@ Adám yukarıda düzeltmek ve kısaltmak:, {,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}Ayrıca orta elemanı kaldırmak gerekir emin değilim: {4⌽1↓4⌽...}
ngn

@ngn Uh, bu oldukça orijinal. Bunu sen gönder!
Adám

@ Adám ok
ngn

Çıktının içinde orta element olması bekleniyor.
JungHwan Min

1
Son test senaryosunun hala 8 unsuru vardır. Bence amaçlanan çıktı komşuları göreceli pozisyonlara [-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
basmaktır

4

Python 2 , 79 69 66 bayt

lambda h,w,i:[(i+q%3-1)%w+(i/w+q/3-1)%h*w for q in range(9)if q-4]

Çevrimiçi deneyin!

Tarafından yetenekli 3 bayt Neil belirterek (x*w)%(h*w)==((x)%h)*w==(x)%h*w.

0 indeksli çözüm.


%h*w 3 bayt tasarruf sağlar *w%(h*w).
Neil

4

R , 12511110 bayt

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]

Çevrimiçi deneyin!

@JayCe ve @Mark tarafından golf edilen 14 ve 8 bayt.

Girdi, [w, h], iönce R dizileri sütununu doldurur.

Diziyi yapar ve sonra satır ve sütun olarak "üçe katlar". Ardından iorijinal diziyi bulun ve mahalleyi bulun. Çıktı olmadan i.


1
14 bayt kaydedebilirsiniz . Arrind tartışması olduğunu bilmiyordum, bugün bir şeyler öğrendim!
JayCe

Sen kaydedebilir 8 bayt değiştirerek seq()ile1:
Mark

3

PHP , 165 bayt

Bu "0 tabanlı" dır. PHP'de daha iyi bir çözüm olmalı, ama bu bir başlangıç ​​noktası!

<?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;

Çalıştırmak için:

php -n <filename> <h> <w> <i>

Örnek:

php -n cell_neighbours.php 4 5 1

Veya çevrimiçi deneyin!


3

K (ngn / k) , 27 24 bayt

{x/x!''(x\y)-1-3\(!9)^4}

Çevrimiçi deneyin!

{ }bağımsız değişkenleri x(boyutları h w) ve y(dizini i) içeren bir işlevdir

(!9)^4olduğu 0 1 2 3 4 5 6 7 8olmadan4

3\ üçlü kodlar: (0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)

1-1komşu ofsetleri vererek çıkarır :(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)

x\ybase olduğu xkodlama ykoordinatları - ymatriste

- her bir ofseti çıkarır ve bize 8 çift komşu koordinat verir

x!''xmatris içinde kalmak için her bir sargı koordinatının modudur

x/tabandan kod çözme x- koordinat çiftlerini tek tamsayılara dönüştürür


Meraktan, K varyantınızın J'ler gibi bir "ters argüman" zarfı var ~mı?
Conor O'Brien

1
@ ConorO'Brien Bildiğim ks'lerden hiçbiri (Kx's K, Kona, oK ve mine) golf için talihsiz bir durum. Sadece 6 yerleşik zarf vardır: / \ '/: \:': ve kullanıcı tanımlı böyle bir mekanizma yoktur.
ngn

Tabii ki bir selfie zarfı ekleyebilirim, ancak golf ngn / k için kendi başına bir son değil, sadece test senaryoları ve deneyim biriktirmek için bir araç.
ngn

Bu adil. Tabii ki, dilin potansiyel bir eksikliği olarak görebilirsiniz. Attache'nin geliştirilmesine yardımcı olmak için PPCG kullandım ve Attache'nin başka türlü dahil etmeyeceğim bazı yararlı işlevlerden yoksun olduğunu fark ettim. K kullanmıyorum ama belki de bu tür zarfları garanti edebilecek başka kullanımlar da var mı?
Conor O'Brien

@ ConorO'Brien J'de olduğu gibi APL'ye aşinayım ~ve yardımcı programına ikna oldum, ancak görüyorsunuz, k yazdırılabilir ASCII ve (neredeyse) hiçbir digraf ile sınırlı değil, bu yüzden yeni bir zarf başka yararlı ilkellerin fedakarlığı ve uygulamalar arasında daha fazla uyumsuzluk. Bunu koymak için neler yapabileceğimi göremiyorum.
ngn

2

MATL , 24 bayt

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

Girdiler vardır h, w, i. Çıktı, sayıları olan bir satır vektörü veya sütun vektörüdür.

Giriş ive çıkış 1 tabanlıdır.

Çevrimiçi deneyin! Veya tüm test senaryolarını doğrulayın .

açıklama

*     % 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

Toplu, 105 bayt

@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 endeksli. @ ChasBrown'un modulo 3 numarasını çalarak 23 bayt kurtardı.



1

Temiz , 85 83 bayt

import StdEnv
r=(rem)
$h w i=tl[r(n+i/w)h*w+r(r(m+i)w)w\\n<-[0,1,h-1],m<-[0,1,w-1]]

Çevrimiçi deneyin!

iBir koordinat olarak davranır (0 <= p < h, 0 <= q < w)ve değerin bulunduğu bitişik öğelerin değerlerini oluşturur p'w + q'.


1

Jöle , 20 bayt

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

Soldaki boyutların bir listesini [h,w]ve sağdaki bir tamsayı olarak hücreyi kabul eden i, mahallenin bir listesini veren ikili bir bağlantı .

Not: sipariş, OP'de izin verilen örneklerden farklıdır

Çevrimiçi deneyin!

Nasıl?

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

Ataşesi , 66 bayt

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

Çevrimiçi deneyin!

Yine de uygulamam gerekiyor Mooresve NMooreyine de Moorebir yineleme fonksiyonu olarak hizmet eden var . Esasen, ilk tamsayıların Integers@@__2bir tamsayı şekil dizisi oluşturur __2(son iki argüman) Prod[__2]. Bu bize hedef diziyi verir. Daha sonra, her bir eleman ( ) için döngü seçeneğiyle birlikte, her Moore boyutu mahallinde (zımni bağımsız değişken) Mooreyineler . Bu, her mahalleyi diziye ekler . Daha sonra, th üyesi , yani Moore mahallesinin etrafını düzleştirir (ilk argüman). merkez dışındaki tüm üyeleri bu düzleştirilmiş diziden alır.{Push[a,_]}1cycle->1aFlat[a@_]_a_[0:3'5:8]

Dilde bir güncelleme ile bu çözüm şöyle görünecektir (49 bayt):

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

1

Kotlin , 88 bayt

Sıfır tabanlı indeksler kullanır ve 8 elemanlı bir liste çıkarır.

{h:Int,w:Int,i:Int->List(9){(w+i+it%3-1)%w+(h+i/w+it/3-1)%h*w}.filterIndexed{i,v->i!=4}}

Çevrimiçi deneyin!

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.