ส่งคืนดัชนีเพื่อนบ้านในตาราง 3x3


11

เอาล่ะความพยายามครั้งที่สองของฉันในการตีกอล์ฟเรามาดูกันว่ามันจะเป็นอย่างไร

ทำท่าว่าคุณมีอาร์เรย์ 9 ค่า ทีนี้ลองนึกภาพอาร์เรย์นั้นในตาราง 3x3

คุณต้องคืนค่าเพื่อนบ้านที่มีดัชนีของอาร์เรย์

0 | 1 | 2

3 | 4 | 5

6 | 7 | 8

กฎ:

  • มันเป็นรหัสกอล์ฟคำตอบที่สั้นที่สุดจึงชนะ
  • ดัชนีของอาร์เรย์ที่ทำเป็นว่าสามารถเริ่มต้นที่ 0 หรือ 1 (ตัวอย่างทั้งหมดใช้ 0 แม้ว่า)
  • เพียงแค่คืนค่าค่า frowned เมื่อ (เช่นif 3: return 046)
  • การส่งสามารถเป็นเพียงขั้นตอน / ฟังก์ชั่น / วิธี แต่ตัวอย่างจะดี
  • ค่าที่ส่งคืนสามารถอยู่ในลำดับใดก็ได้ (เช่นถ้าอินพุทเป็น 0 มันอาจเป็น 13 หรือ 31)
  • ถ้าคุณต้องการผลลัพธ์สามารถเป็นรายการของตัวเลขเช่น[0,4,6]แทน046
  • เส้นทแยงมุมจะไม่นับตามตัวอย่างที่เห็น

ตัวอย่าง:

การป้อนข้อมูล:

0

เอาท์พุท:

13

การป้อนข้อมูล:

3

เอาท์พุท:

046

การป้อนข้อมูล:

4

เอาท์พุท:

1357


4
ดูเหมือนว่าความท้าทายนี้จะได้ประโยชน์จากเวลาบางส่วนในSandbox คุณสามารถโพสต์ความท้าทายของคุณที่นั่นเพื่อให้ผู้อื่นสามารถตรวจสอบได้และช่วยเหลือคุณก่อนที่จะโพสต์ไว้ที่หน้าหลัก จากตัวอย่างของคุณฉันเดาว่าคุณไม่นับเส้นทแยงมุม คุณอาจต้องการเพิ่มสิ่งนี้ลงในคำถาม นอกจากนี้คุณยังพูดถึงความต้องการที่จะส่งออกดัชนีของอาร์เรย์ที่เป็นเพื่อนบ้าน ฉันคิดว่านี่อาจเป็นฮาร์ดโค้ดสำหรับตาราง 3x3 มันจะดีกว่าไหมถ้าเอาท์พุทเพื่อนบ้านด้วยตัวเอง?
Poke

7
อย่างที่คุณรู้การขมวดคิ้วไม่ใช่สิ่งที่เราทำที่นี่จริงๆ hardcoding อนุญาตให้ใช้เอาต์พุตหรือไม่ก็ได้ เนื่องจากโดยทั่วไปแล้วมันค่อนข้างยากที่จะกำหนดสิ่งที่นับได้ว่าเป็นการเข้ารหัสแบบถาวรฉันจึงอนุญาตหรือกำหนดขนาดกริดให้เป็นอินพุตเพิ่มเติมเป็นการส่วนตัว
Dennis

1
เอาท์พุทสามารถเป็นรายการของตัวเลขเช่น[0,4,6]แทนที่จะได้046หรือไม่
Laikoni

@Laikoni ใช่ช้าไปหน่อยเพราะคุณได้ตอบแล้ว
hcorion

@ เดนนิสใช่ฉันไม่แน่ใจว่าจะใส่ยังไง ฉันชอบวิธีที่คำตอบของ C และ python ทำได้โดยการให้ทั้งคู่ แต่ให้คำตอบที่ไม่ยากเป็นรหัสสุดท้าย ฉันต้องการที่จะสนับสนุนอัลกอริทึมมากกว่าการเข้ารหัสอย่างหนัก แต่ฉันไม่แน่ใจว่ามันจะเป็นไปได้ (ไม่มีคำตอบที่ยาวเกินไป) และฉันไม่ต้องการที่จะไม่มีคำตอบสำหรับคำถามของฉัน
hcorion

คำตอบ:


2

เยลลี่ , 16 13 ไบต์

9Ḷ,d3ạ/S€=1T’

ลองออนไลน์!

มันทำงานอย่างไร

9Ḷ,d3ạ/S€=1T’  Main link. Argument: n (0, ..., 8)

9              Set the return value to 9.
 Ḷ             Unlength; yield [0, ..., 8].
  ,            Pair; yield [[0, ..., 8], n].
   d3          Divmod 3; yield [[[0, 0], ..., [2, 2]], [n:3, n%3]]].
     ạ/        Reduce by absolute difference, yielding
               [[|0 - n:3|, |0 - n%3|], ..., [[|2 - n:3|, |2 - n%3|]].
       S€      Sum each, yielding
               [|0 - n:3| + |0 - n%3|, ..., [|2 - n:3| + |2 - n%3|].
         =1    Compare the sums with 1.
           T   Truth; yield all 1-based indices of 1.
            ’  Decrement to yield all 0-based indices of 1.

สถานะกฎ: "ดัชนีของอาร์เรย์แบบแกล้งสามารถเริ่มต้นที่ 0 หรือ 1" - คุณสามารถวาง Decrement ได้ในตอนท้าย
steenbergh

@ steenbergh ฉันคิดว่าฉันจะต้องใช้ 1-based input เช่นกันซึ่งค่าใช้จ่ายเป็นจำนวนมากตามที่ประหยัด
Dennis

9

MATL , 17 16 ไบต์

9:qWIe1Y6Z+i)BPf

อาร์เรย์เป็น 1 ตามที่เป็นมีตัวเลขจากการ19

ลองออนไลน์! หรือตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย

พิจารณาอินพุต2เป็นตัวอย่าง

9:q  % Push [0 1 2 ... 8]
     % STACK: [0 1 2 ... 8]
W    % Rise to 2, element-wise
     % STACK: [1 2 4 ... 256]
Ie   % Reshape as 3-row matrix (column-major order)
     % STACK: [1   8  64;
               2  16 128;
               4  32 256]
1Y6  % Push [0 1 0; 1 0 1; 0 1 0]
     % STACK: [1   8  64;
               2  16 128;
               4  32 256],
              [0   1   0;
               1   0   1;
               0   1   0]
Z+   % Convolution, maintaining size
     % STACK: [10  81 136;
               21 170 336;
               34 276 160]
i    % Take input, n
     % STACK: [10  81 136;
               21 170 336;
               34 276 160],
               2
 )   % Get n-th entry (1-based; column-major order)
     % STACK: 21
B    % Convert to binary
     % STACK: [1 0 1 0 1]
P    % Flip
     % STACK: [1 0 1 0 1]
f    % Find: gives indices of nonzeros. Implicitly display
     % STACK: [1 3 5]

1
วัด? คุณคิดอย่างไรกับสิ่งนี้
Robert Fraser

1
@RobertFraser ความท้าทายเหล่านี้เกี่ยวกับการหาเพื่อนบ้านมักจะแนะนำให้ฉันวิธีการโน้มน้าวใจ แต่การชักชวนเพิ่มคุณค่าของเพื่อนบ้านโดยเนื้อแท้ดังนั้นฉันจึงจำเป็นต้องแยกพวกเขาออกในตอนท้าย --- นั่นคือพลังของสองและส่วนขยายไบนารี
หลุยส์เมนโด

5

Mathematica ขนาด 32 ไบต์

GridGraph@{3,3}~AdjacencyList~#&

ใช้กราฟแทนอาร์เรย์ GridGraph@{3,3}สร้างกราฟรูปกริด 3x3 ที่แสดงด้านล่างซึ่ง Mathematica ช่วยติดฉลากด้วยตัวเลข 1-9 สำหรับจุดยอดโดยค่าเริ่มต้น จากนั้น~AdjacencyList~#&บอกเพื่อนบ้านของจุดสุดยอด

กราฟกริด 3x3


ต้องรักตัวอาคารเหล่านั้น ...
นีล

4

Mathematica ขนาด 40 ไบต์

{24,135,26,157,2468,359,48,579,68}[[#]]&

1 การจัดทำดัชนี แค่มองหาคำตอบ ใครสามารถทำได้ดีกว่าใน Mathematica?


3
ฉันประหลาดใจที่ไม่มีตัวสำหรับสิ่งนี้ เช่นเดียวกับที่ฉันคาดหวังว่าจะมี builtin เพื่อค้นหาเพื่อนบ้านทั้งหมดขององค์ประกอบในอาร์เรย์ 2D แต่ฉันไม่แน่ใจฉันไม่รู้อะไรเลยเกี่ยวกับ Mathematica นอกเหนือจากข้อเท็จจริงที่ว่ามันมีสิ่งปลูกสร้างมากเกินไป
HyperNeutrino

2
คุณสามารถบันทึกไบต์โดยใช้ 0 31[420,51,...,75][[#]]&การจัดทำดัชนีและ
Martin Ender

1
คุณสามารถใช้GridGraph@{3,3}~AdjacencyList~#&32 ไบต์โดยมีการจัดทำดัชนี 1 รายการ
ไม่ใช่ต้นไม้

@ lanlock4 ยอดเยี่ยม! โปรดตอบคำถามนั้นเพื่อที่ฉันจะได้โหวตได้!
Greg Martin

4

คู่, 42 40 39 ไบต์

@(n,x=~e(3),y=x(n)=1)find(bwdist(x)==1)

ดัชนีแบบ 1

ตรวจสอบกรณีทดสอบทั้งหมด

คำอธิบาย:

x=~e(3);         % create a 3*3 matrix of zeros
x(n)=1;          % set the element with index n to 1
d=bwdist(x);     % compute the distance transform of the matrix
find(d == 1)     % find where the distance is 1.

ตัวอย่าง: n = 2

x =

   0   0   0
   1   0   0
   0   0   0

(ในข้อมูลระดับแปดเสียงจะถูกจัดเก็บไว้ในคอลัมน์ฉลาด)

d =

   1.00000   1.41421   2.23607
   0.00000   1.00000   2.00000
   1.00000   1.41421   2.23607

โลจิคัลดัชนีโดยที่ระยะทางคือ 1:

d == 1

 1   0   0
 0   1   0
 1   0   0

find(d ==1)

 1
 3
 5


2

Haskell , 74 71 68 ไบต์

f n=[x|x<-[n-3,n-1..n+3],0<x,x<10,gcd 3x<2||n-1/=x,gcd 3n<2||n+1/=x]

ลองออนไลน์! ใช้กริด 1 ที่จัดทำดัชนี ตัวอย่างการใช้งาน: ผลตอบแทนf 3[2,6]

แก้ไข: บันทึกแล้ว3 6 ไบต์ขอบคุณØrjan Johansen!


สำหรับ77 75 ไบต์ฟังก์ชันต่อไปนี้#ใช้ได้กับขนาดกริดโดยพลการm:

n#m=[x|x<-[n-m,n-1,n+1,n+m],0<x,x<=m*m,gcd x m<m||n-1/=x,gcd n m<m||n+1/=x]

ลองออนไลน์! สำหรับแต่ละnรายการ[n-m,n-1,n+1,n+m]มีเพื่อนบ้านทั้งสี่ สำหรับแต่ละรายการxในรายการนี้เราตรวจสอบ-1<xและx<m*mเพื่อให้แน่ใจว่าไม่ได้xอยู่เหนือหรือใต้ตารางmod n 3>0||n-1/=xเพื่อบังคับใช้เส้นขอบตารางด้านซ้ายและmod(n+1)m>0||n+1/=xสำหรับขอบด้านซ้าย


1
คุณสามารถใช้และ[n-3,n-1..n+3] gcd 3n>1
Ørjan Johansen

อุ๊ปส์ไม่เป็นไรgcdส่วนนั้น มันควรจะได้รับและจากนั้นแบ่งสำหรับ<3 n==0คุณอาจจะสามารถที่จะใช้เคล็ดลับว่าถ้าคุณเปลี่ยนทุกอย่างเพื่อ1-indexed
Ørjan Johansen

โอ้และจะถูกแทนที่ด้วยn/=2&&n/=5 mod x 3>0(หรือgcdเวอร์ชันที่มีการทำดัชนีใหม่ซึ่งตอนนี้อาจใช้งานได้สองครั้ง)
Ørjan Johansen

2

Ruby , 51 48 45 ไบต์

->a{[a+3,a-3][a/6..a/3]+[a+1,a-1][a%-3..a%3]}

ลองออนไลน์!

สร้าง 2 อาร์เรย์โดยมีเพื่อนบ้านแนวตั้งและแนวนอนจากนั้นเลือกหนึ่งรายการขึ้นไป

Ruby hardcoded ขนาด 44 ไบต์

->a{%w(13 024 15 046 1357 248 37 468 57)[a]}

... ไม่คุ้มค่า


2

C, 100 92 91 83 78 74 ไบต์

p(n){putchar(n+48);}f(n){n>3&&p(n-3);n<7&&p(n+3);n%3&&p(n+1);--n%3&&p(n);}

1 การจัดทำดัชนี ขอบคุณ @Neil สำหรับการบันทึก 4 ไบต์

ลองออนไลน์!

รุ่น Hardcoded ขนาด 56 ไบต์

l[]={13,204,15,406,1357,248,37,468,57};
#define L(n)l[n]

0 การจัดทำดัชนี


2
ในเวอร์ชันแรกคุณไม่สามารถเขียนn>3&&p(n-3)ฯลฯ เพื่อบันทึก 4 ไบต์ได้หรือไม่ ในเวอร์ชันที่สองคุณไม่สามารถเขียนl[]=บันทึกไบต์ได้หรือไม่?
Neil

@ Neil ใช่ฉันสามารถ ขอบคุณ!
Steadybox

คุณแน่ใจหรือว่ารหัสของคุณถูกต้องในปัจจุบัน? เมื่อฉันลองกรณีทดสอบมันล้มเหลวทั้งสาม .. : S ลองที่นี่ คุณช่วยจัดหาลิงค์ TIO ที่ใช้งานได้บางทีฉันอาจทำอะไรผิดไป
Kevin Cruijssen

1
@ เพิ่มลิงก์ของ KevinCruijssen TIO และดูเหมือนว่าฉันลืมแก้ไขรหัสจริงในการแก้ไขครั้งล่าสุด ... ลิงก์ของคุณทำงานได้อย่างถูกต้องเช่นกัน แต่โปรดสังเกตว่าคำตอบของฉันคือดัชนี 1 ขณะที่ตัวอย่างทดสอบเป็นดัชนี 0
Steadybox

@ Steadybox อ่าคุณพูดถูกจริงๆ ฉันพลาดส่วนที่มีการจัดทำดัชนี 1 ชิ้นซึ่งเป็นสิ่งที่ไม่ดี ขอขอบคุณที่เพิ่ม TIO +1
Kevin Cruijssen

1

Python 2, 51 ไบต์

lambda x:[x+3,x-3][x/6:x/3+1]+[x+1,x-1][x%-3:x%3+1]

จากคำตอบRubyของฉันก่อนหน้านี้ฉันพบว่ามันน่าสนใจเพราะส่วนใหญ่เป็นรหัสเดียวกันโดยใช้เคล็ดลับที่ต่างกันและสร้างผลลัพธ์เดียวกัน การได้สิ่งนี้ถูกต้องช่วยให้ฉันตีกอล์ฟคำตอบของทับทิมอีกหน่อย

โดยพื้นฐานแล้วทับทิมจะมีความสั้นกว่านี้เนื่องจากดัชนีส่วนแบ่งของอาเรย์นั้นรวมอยู่ด้วยหลามจำเป็นต้องใช้ a +1เพื่อชดเชย

คำอธิบาย

รับ 2 อาร์เรย์ (เพื่อนบ้านในแนวตั้งและแนวนอน) จากนั้นเลือกหนึ่งหรือทั้งสองตามการคำนวณบางอย่าง


1

Java 7, 63 ไบต์ (ฮาร์ดโค้ด)

int c(int i){return new int[]{31,420,51,640,7531,842,73,864,75}[i];}

0-indexed
(เอาท์พุทคำสั่งที่ตรงกันข้ามเพราะ024และ046ไม่ใช่จำนวนเต็มที่ถูกต้อง)
ยังคงทำงานกับรุ่นที่ไม่ใช่ฮาร์ดโค้ด แต่ฉันรับรองได้ว่ามันจะไม่สั้นลง ..

ลองที่นี่


82 ไบต์

String c(int n){return""+(n>3?n-3:"")+(n<7?n+3:"")+(n%3>0?n+1:"")+(--n%3>0?n:"");}

ทำดัชนี 1 รายการโดย
อิงจาก@Steadybox 'C answer

ลองที่นี่



0

แบตช์ 116 ไบต์

@set c=cmd/cset/a%1
@set/ar=%1%%3
@if %1 gtr 2 %c%-3
@if %r% gtr 0 %c%-1
@if %r% lss 2 %c%+1
@if %1 lss 6 %c%+3

0 การจัดทำดัชนี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.