ค้นหาเพื่อนบ้านของเซลล์


20

... หรือย่านที่คุ้นเคยของ Toroidal Moore

ได้รับจำนวนเต็มบวกh, wและจำนวนเต็มไม่เป็นลบกลับทั้งหมดของดัชนีที่อยู่รอบ ๆii

คุณต้องถือว่าเมทริกซ์ประกอบด้วย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

ถ้าiเป็น0เช่นนั้นคุณจะต้องส่งคืน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 * wสำหรับคำตอบที่จัดทำดัชนี 1 ข้อ)
  • คุณสามารถสรุปได้ว่าi >= 0(หรือi > 0สำหรับคำตอบที่จัดทำดัชนี 1 ข้อ)
  • ลำดับของค่าที่ส่งคืนไม่สำคัญตราบใดที่มีเพียงแปดค่าที่ต้องการ
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือดังนั้นคำตอบที่สั้นที่สุดในแต่ละภาษาชนะ!

ขอบคุณ@Conor O'Brienสำหรับชื่อเรื่องเทคนิคการทำให้เกิดเสียงมากขึ้นและ@ngmสำหรับกรณีทดสอบเพิ่มเติม!


3
เราจะคืนเมทริกซ์เพื่อนบ้านแบบ 3 ต่อ 3 ได้ไหม
อดัม

@ Adam ฉันต้องการให้รายการไม่รวมเซลล์ตรงกลางถ้าเป็นไปได้ แต่ขอขอบคุณที่มีคำตอบอยู่แล้ว มันง่ายพอที่จะกรองสิ่งนี้ออก?
Dom Hastings

การสั่งซื้อมีความสำคัญหรือไม่
Robert Fraser

@RobertFraser สั่งไม่สำคัญ ฉันจะเพิ่มเข้าไปในกฎ
Dom Hastings

@ DomHastings ฉันตีความความคิดเห็นที่เป็น: มันไม่ได้รับอนุญาตให้กลับเมทริกซ์ 3 คูณ 3 หรือรวมเซลล์กลาง?
JungHwan Min

คำตอบ:


8

JavaScript (ES6), 75 ไบต์

บันทึก 2 ไบต์ขอบคุณ @KevinCruijssen

คาดว่าดัชนี 0-based

(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 )ได้รับจาก:ผมdx,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]

สำหรับค่าที่สอดคล้องกันของเราใช้ list เดียวกันที่เลื่อนโดย 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 ไบต์โดยการกำจัดวงเล็บ
Kevin Cruijssen

@KevinCruijssen Nice catch ขอบคุณ!
Arnauld

6

APL (Dyalog Classic) 27 ไบต์

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

ลองออนไลน์!

{ }เป็นฟังก์ชันที่มีอาร์กิวเมนต์(ส่วนข้อมูลh w) และ(ดัชนีi)

⍳3 3เป็นเมทริกซ์ของตัวเลขทั้งหมดประกอบไปด้วย 2 หลัก: 0 0, 0 1, ... ,2 2

, enlists เมทริกซ์เป็นเวกเตอร์

1↓4⌽ลบองค์ประกอบกลาง1 1โดยหมุน 4 ไปทางซ้าย ( 4⌽) และปล่อยหนึ่ง ( 1↓)

1- ลบออกจาก 1 ทำให้ออฟเซ็ตเพื่อนบ้านทั้ง 8 ตัว

( ใช้รถไฟฟังก์ชั่นในวงเล็บเพื่อชดเชยแต่ละ

⍺⊤⍵คือการเข้ารหัสพื้นฐานของ- พิกัดของเมทริกซ์

(⍺⊤⍵)-⊢ ลบออฟเซ็ตปัจจุบันให้พิกัดของเพื่อนบ้าน

⍺|เป็น mod aเพื่อล้อมรอบพิกัดและอยู่ภายในเมทริกซ์

⍺⊥ ถอดรหัสจากฐาน


5

APL (Dyalog Unicode) , 40 ไบต์SBCS

ฟังก์ชั่นมัดไม่ระบุชื่อ ใช้h wอาร์กิวเมนต์ซ้ายและiอาร์กิวเมนต์ขวา

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

ลองออนไลน์!

{} "dfn"; คืออาร์กิวเมนต์ที่เหลือ (ส่วนข้อมูล) และเป็นอาร์กิวเมนต์ที่ถูกต้อง (ดัชนี)

×/⍺ ผลิตภัณฑ์ (การลดการคูณ) ของมิติข้อมูล

 ครั้งแรกที่หลายดัชนี

⍺⍴ ใช้ขนาดเพื่อr eshape ว่า

 ล้อมรอบมัน (เพื่อถือว่าเป็นองค์ประกอบเดียว)

(), เพิ่มรายละเอียดต่อไปนี้:

  ⍺⊤⍵ เข้ารหัสดัชนีใน Mixed-Radix h w(ทำให้เรามีพิกัดของดัชนี)

  ¯1+ เพิ่มค่าลบไปยังพิกัดเหล่านั้น

⊖∘⍉/ ลดโดยการหมุน - ทรานสโพสต์
  ซึ่งเท่ากับy⊖⍉x⊖⍉... ซึ่งเท่ากับy⊖x⌽... ซึ่งหมุนไปทางซ้ายหลายขั้นตอนเท่ากับiออฟเซ็ตไปทางขวา (น้อยกว่าหนึ่ง) และหมุนขึ้นไปตามขั้นตอนมากที่สุดเท่าที่iถูกชดเชย (น้อยกว่า) เมทริกซ์แบบ 3 คูณ 3 ที่เราพยายามอยู่ที่มุมซ้ายบน

 เปิดเผย (เนื่องจากการลดลงทำให้เวกเตอร์เป็นสเกลาร์โดยการปิดล้อม)

⍪⍨⍣2 สแต็คที่ด้านบนของตัวเองสองครั้ง (เราเพียงต้องการสามครั้งสำหรับเมทริกซ์แถวเดียว)

,⍨⍣2 ผนวกเข้ากับตัวเองสองครั้ง (เราต้องการเพียงสามครั้งสำหรับเมทริกซ์คอลัมน์เดี่ยว)

3 3↑ ใช้สามแถวแรกของสามคอลัมน์แรก

สามารถละเว้นสองขั้นตอนถัดไปได้หากส่งคืนเมทริกซ์ 3-by-3 เป็นที่ยอมรับ:

, ravel (แบน)

4⌽ หมุนไปทางซ้ายสี่ขั้นตอน (นำองค์ประกอบกึ่งกลางไปด้านหน้า)

1↓ วางองค์ประกอบแรก


@ Adámแก้ไขข้างต้นและย่อให้สั้นลง: {,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}ฉันไม่แน่ใจว่าคุณควรจะลบองค์ประกอบกลาง: {4⌽1↓4⌽...}
ngn

@ngn เอ่อนั่นค่อนข้างเป็นต้นฉบับ คุณโพสต์นั้น!
อดัม

@ อดัม ok
NGN

ฉันไม่คิดว่าผลลัพธ์จะถูกคาดหวังว่าจะมีองค์ประกอบกลางอยู่ในนั้น
JungHwan Min

1
กรณีทดสอบสุดท้ายยังคงมี 8 องค์ประกอบ ฉันคิดว่าผลลัพธ์ที่ตั้งใจไว้คือการพิมพ์เพื่อนบ้านที่ตำแหน่งสัมพัทธ์[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
จองฮมิน


4

R , 125 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]

ลองออนไลน์!

14 และ 8 ไบต์ตีกอล์ฟโดย @JayCe และ @Mark

อินพุตเป็น[w, h], iเพราะ R เติมคอลัมน์อาร์เรย์ก่อน

ทำให้อาร์เรย์และจากนั้น "อเนกประสงค์" มันแถวและคอลัมน์ที่ชาญฉลาด จากนั้นค้นหาiในอาเรย์เดิมแล้วค้นหาย่านที่คุ้นเคย iโดยไม่ต้องเอาท์พุท


1
คุณสามารถบันทึก14 ไบต์ ฉันไม่ทราบว่าสิ่งที่มีข้อโต้แย้ง arr.ind เรียนรู้บางสิ่งบางอย่างในวันนี้!
JayCe

คุณสามารถบันทึก8 ไบต์โดยแทนที่seq()ด้วย1:
Mark

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\ เข้ารหัสในยุคที่สาม: (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!''คือ mod xสำหรับแต่ละพิกัดที่ล้อมรอบเพื่อให้อยู่ภายในเมทริกซ์

x/ถอดรหัสจากฐานx- เปลี่ยนคู่ของพิกัดเป็นจำนวนเต็มเดียว


ตัวแปร K ของคุณมีคำวิเศษณ์ย้อนกลับที่เหมือนคำว่า J ~หรือไม่?
Conor O'Brien

1
@ ConorO'Brien ไม่มีใครใน ks ที่ฉันรู้จัก (Kx's K, Kona, oK และ Mine) มีมันซึ่งโชคร้ายสำหรับการเล่นกอล์ฟ คำวิเศษณ์ในตัวมีเพียง 6 ตัวเท่านั้น: / \ '/: \:': และไม่มีกลไกสำหรับผู้ใช้กำหนด
ngn

แน่นอนฉันสามารถเพิ่มคำวิเศษณ์ selfie แต่การเล่นกอล์ฟไม่ได้จบในตัวเองสำหรับ ngn / k เพียงวิธีการสะสมกรณีทดสอบและประสบการณ์
ngn

นั่นยุติธรรม แน่นอนคุณสามารถมองว่าเป็นข้อบกพร่องที่อาจเกิดขึ้นจากภาษา ฉันใช้ PPCG เพื่อช่วยพัฒนา Attache และตระหนักว่า Attache ขาดฟังก์ชั่นที่มีประโยชน์บางอย่างที่ฉันจะไม่รวมอยู่ด้วย ฉันไม่ได้ใช้ K แต่อาจมี usecases อื่น ๆ ซึ่งอาจรับประกันว่าคำวิเศษณ์นั้น?
Conor O'Brien

@ ConorO'Brien ฉันคุ้นเคยกับAPL ซึ่งเหมือนกับ~J และฉันเชื่อมั่นในอรรถประโยชน์ของมัน แต่คุณเห็นไหม k จำกัด เฉพาะ ASCII ที่พิมพ์ได้และ (เกือบ) ไม่มี digraphs ดังนั้นคำวิเศษณ์ใหม่จะหมายถึง การเสียสละดั้งเดิมที่มีประโยชน์อื่น ๆ รวมถึงความไม่ลงรอยกันระหว่างการนำไปใช้งาน ฉันไม่เห็นสิ่งที่ฉันสามารถผ่านออกที่จะใส่ในนี้.
NGN

2

MATL , 24 ไบต์

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

ปัจจัยการผลิตที่มีh, ,w iผลลัพธ์คือเวกเตอร์แถวหรือเวกเตอร์คอลัมน์ที่มีตัวเลข

อินพุต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

ภาษา Wolfram (Mathematica) , 74 ไบต์

Mod[i=#;w=#2;Mod[i+#2,w]+i~Floor~w+w#&@@@{-1,0,1}~Tuples~2~Delete~5,1##2]&

ลองออนไลน์!

รับอินพุตใน reverse ( i, w, h), ใช้ 0

เมทริกซ์ 3x3 ที่มีเซลล์ตรงกลาง (60 ไบต์)

(Join@@(p=Partition)[Range[#2#]~p~#,a={1,1};3a,a,2a])[[#3]]&

Takes ( w, h, i) ตามแบบ 1

ลองออนไลน์!


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 การจัดทำดัชนี บันทึก 23 ไบต์โดยขโมยเคล็ดลับ modulo 3 ของ @ ChasBrown


2

MATL, 24 ไบต์

X[h3Y6&fh2-+1GX\1Gw!Z}X]

ลองใช้กับ MATL Online

นำปัจจัยการผลิตและ[w h] i8 ไบต์ของสิ่งนี้ถูกขโมยไปโดยไม่ได้รับแรงบันดาลใจจากคำตอบของ Luis Mendos แม้ว่าวิธีการโดยรวมจะแตกต่างกัน



1

เยลลี่ , 20 ไบต์

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

ลิงก์ dyadic ยอมรับรายการของมิติทางด้านซ้าย[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]}

ลองออนไลน์!

ฉันยังต้องใช้งานMooresและNMooreยังคงมีMooreฟังก์ชันการทำซ้ำ โดยพื้นฐานแล้วIntegers@@__2สร้างอาร์เรย์ของรูปร่างจำนวนเต็ม__2(อาร์กิวเมนต์สองตัวสุดท้าย) ของProd[__2]จำนวนเต็มแรก สิ่งนี้ทำให้เรามีเป้าหมายอาร์เรย์ จากนั้นMooreiterates ฟังก์ชั่น{Push[a,_]}เหนือเขตมัวร์ของแต่ละขนาด1(อาร์กิวเมนต์นัย) มีตัวเลือกที่จะขี่จักรยานแต่ละองค์ประกอบ ( cycle->1) aนี้จะเพิ่มเขตแต่ละอาร์เรย์ จากนั้นFlat[a@_]แบน_สมาชิกที่ของ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.