Kembalikan indeks tetangga dalam kisi 3x3

11

Baiklah, usaha kedua saya di kode golf, mari kita lihat bagaimana kelanjutannya.

Berpura-puralah Anda memiliki larik 9 nilai. Sekarang bayangkan array itu dalam kisi 3x3.

Anda harus mengembalikan tetangga yang nomornya miliki sebagai indeks array.

0 | 1 | 2

3 | 4 | 5

6 | 7 | 8

Aturan:

  • Ini kode golf, jadi jawaban terpendek menang.
  • Indeks array pura-pura dapat mulai dari 0 atau 1. (semua contoh menggunakan 0 meskipun)
  • Hanya mengembalikan nilai, nilai disukai (seperti if 3: return 046)
  • Pengajuan dapat berupa prosedur / fungsi / metode, tetapi sebuah contoh akan menyenangkan
  • Nilai yang dikembalikan bisa dalam urutan apa pun (seperti jika input 0 bisa 13 atau 31)
  • jika Anda mau, outputnya bisa berupa daftar angka, misalnya [0,4,6]bukan046
  • diagonal tidak masuk hitungan, seperti yang terlihat pada contoh.

Contoh:

memasukkan:

0

keluaran:

13

memasukkan:

3

keluaran:

046

memasukkan:

4

keluaran:

1357

hcorion
sumber
4
Sepertinya tantangan ini dapat mengambil manfaat dari beberapa waktu di Sandbox . Anda dapat memposting tantangan Anda di sana sehingga orang lain dapat memeriksanya dan membantu Anda sebelum mempostingnya ke utama. Dari contoh Anda, saya kira Anda tidak menghitung diagonal. Anda mungkin ingin menambahkan ini ke pertanyaan itu sendiri. Anda juga menyebutkan persyaratan untuk menampilkan indeks array yang bertetangga. Saya pikir ini hanya bisa di-hardcode untuk kisi 3x3. Apakah mungkin lebih baik untuk output tetangga sendiri?
Poke
7
Asal tahu saja, tidak disukai bukanlah sesuatu yang kita lakukan di sini; hardcoding hasilnya diperbolehkan atau tidak. Karena biasanya cukup sulit untuk menentukan apa yang sebenarnya dianggap sebagai hardcoding, saya pribadi akan mengizinkannya atau memberikan ukuran grid sebagai input tambahan.
Dennis
1
Bisakah output menjadi daftar angka, misalnya [0,4,6]bukan 046?
Laikoni
@Laikoni Ya, sedikit terlambat karena Anda sudah menjawabnya.
hcorion
@ Dennis Ya, saya tidak yakin bagaimana mengatakannya. Saya suka bagaimana jawaban C dan python melakukannya, dengan memberikan keduanya, tetapi memiliki jawaban tanpa kode sebagai final. Saya ingin mendorong algoritma daripada hard-coding, tetapi saya tidak yakin apakah itu mungkin (tanpa jawaban yang terlalu panjang), dan saya tidak ingin tidak memiliki jawaban untuk pertanyaan saya.
hcorion

Jawaban:

2

Jelly , 16 13 byte

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

Cobalah online!

Bagaimana itu bekerja

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.
Dennis
sumber
Status aturan: "Indeks array pura-pura dapat mulai dari 0 atau 1." - Anda dapat menjatuhkan Decrement di akhir.
steenbergh
@steenbergh Saya berasumsi saya harus mengambil input berbasis 1 juga, yang biaya byte sebanyak yang dihemat.
Dennis
9

MATL , 17 16 byte

9:qWIe1Y6Z+i)BPf

Array ini berbasis 1, yaitu berisi angka dari 1hingga 9.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Pertimbangkan input 2sebagai contoh.

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]
Luis Mendo
sumber
1
Wat? Bagaimana Anda membuat ini?
Robert Fraser
1
@RobertFraser Tantangan-tantangan ini untuk menemukan tetangga selalu menyarankan saya pendekatan konvolusi. Tetapi konvolusi secara inheren menambahkan nilai-nilai tetangga, jadi saya harus dapat memisahkan mereka pada akhirnya --- itulah kekuatan dua bagian dan ekspansi biner
Luis Mendo
5

Mathematica, 32 byte

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

Menggunakan grafik, bukan array. GridGraph@{3,3}membangun grafik berbentuk kotak 3x3, yang ditunjukkan di bawah ini, yang Mathematica membantu memberi label dengan angka 1–9 untuk simpul secara default. Lalu ~AdjacencyList~#&memberitahu Anda tetangga dari sebuah simpul.

Grafik kotak 3x3

Bukan pohon
sumber
Harus mencintai orang-orang itu ...
Neil
4

Mathematica, 40 byte

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

1-diindeks. Hanya mencari jawabannya. Bisakah seseorang berbuat lebih baik di Mathematica?

Greg Martin
sumber
3
Saya terkejut bahwa tidak ada builtin untuk ini. Seperti yang saya harapkan akan ada builtin untuk menemukan semua tetangga elemen dalam array 2D, tapi saya tidak yakin, saya tidak tahu apa-apa tentang Mathematica selain fakta bahwa ia memiliki terlalu banyak builtin.
HyperNeutrino
2
Anda dapat menyimpan byte dengan menggunakan 0-indexing dan 31[420,51,...,75][[#]]&.
Martin Ender
1
Anda dapat menggunakan GridGraph@{3,3}~AdjacencyList~#&untuk 32 byte, dengan pengindeksan 1.
Bukan pohon
@ lanlock4 Luar Biasa! Tolong jadikan jawaban itu agar saya dapat membatalkannya!
Greg Martin
4

Oktaf, 42 40 39 byte

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

Indeks berbasis 1.

Verifikasi semua kasus uji.

Penjelasan:

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.

Contoh: n = 2

x =

   0   0   0
   1   0   0
   0   0   0

(Dalam Oktaf data disimpan menurut kolom.)

d =

   1.00000   1.41421   2.23607
   0.00000   1.00000   2.00000
   1.00000   1.41421   2.23607

indeks logis dengan jarak 1:

d == 1

 1   0   0
 0   1   0
 1   0   0

find(d ==1)

 1
 3
 5
rahnema1
sumber
3

Python 2, 71 byte

lambda n:filter(abs,[(n-3)*(n>3),(n+3)*(n<7),~-n*(n%3!=1),-~n*(n%3>0)])

1-diindeks
Coba online!


Mendapatkan hasil dari daftar hasil yang ditentukan sebelumnya lebih pendek (46 byte):

[13,204,15,406,1357,248,37,468,57].__getitem__

Diindeks 0
Cobalah secara online!

ovs
sumber
2

Haskell , 74 71 68 byte

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]

Cobalah online! Menggunakan kisi 1-diindeks. Contoh penggunaan: f 3pengembalian [2,6].

Sunting: Disimpan 3 6 byte berkat Ørjan Johansen!


Untuk 77 75 byte, fungsi berikut berfungsi #untuk ukuran kisi sembarang 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]

Cobalah online! Untuk setiap ndaftar [n-m,n-1,n+1,n+m]berisi keempat tetangga. Untuk setiap entri xdalam daftar ini kami memeriksa -1<xdan x<m*mmemastikan xtidak di atas atau di bawah grid, mod n 3>0||n-1/=xuntuk menegakkan batas grid kiri dan mod(n+1)m>0||n+1/=xuntuk perbatasan kiri.

Laikoni
sumber
1
Anda bisa menggunakan [n-3,n-1..n+3]dan gcd 3n>1.
Ørjan Johansen
Ups, jangan pedulikan gcdbagian itu. Seharusnya <3, dan kemudian istirahat n==0. Anda mungkin dapat menggunakan trik itu jika Anda mengubah semuanya menjadi 1-indeks.
Ørjan Johansen
Oh, dan n/=2&&n/=5bisa diganti oleh mod x 3>0. (Atau gcdversi dengan pengindeksan ulang, yang sekarang dapat digunakan dua kali.)
Ørjan Johansen
2

Ruby , 51 48 45 byte

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

Cobalah online!

Buat 2 array, dengan tetangga vertikal dan horizontal, lalu pilih satu atau lebih dari mereka.

Ruby hardcoded, 44 byte

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

... Tidak layak.

GB
sumber
2

C, 100 92 91 83 78 74 byte

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-diindeks. Terima kasih kepada @Neil untuk menghemat 4 byte.

Cobalah online!

Versi hardcoded, 56 byte

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

Diindeks 0

Steadybox
sumber
2
Dalam versi pertama, tidak bisakah Anda menulis n>3&&p(n-3)dll untuk menghemat 4 byte? Dalam versi kedua, tidak bisakah Anda menulis l[]=untuk menyimpan byte?
Neil
@Neil Ya saya bisa. Terima kasih!
Steadybox
Apakah Anda yakin kode Anda saat ini benar? Ketika saya mencoba test case gagal untuk ketiganya ..: S Cobalah di sini. Bisakah Anda memberikan tautan TIO yang berfungsi, mungkin saya melakukan sesuatu yang salah?
Kevin Cruijssen
1
@KevinCruijssen tautan TIO ditambahkan, dan sepertinya saya lupa mengedit kode aktual pada edit terakhir ... Oh, well. Tautan Anda juga berfungsi dengan benar, tetapi perhatikan bahwa jawaban saya diindeks 1 sedangkan contoh kasus uji diindeks 0.
Steadybox
@Steadybox Ah, Anda memang benar. Saya merindukan bagian 1-diindeks, buruk saya. Terima kasih telah menambahkan TIO. +1
Kevin Cruijssen
1

Python 2, 51 byte

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

Berdasarkan versi sebelumnya dari jawaban Ruby saya , saya menemukan itu menarik karena sebagian besar kode yang sama, menggunakan trik yang berbeda, dan menghasilkan hasil yang sama. Memperbaiki yang satu ini membantu saya memberi golf jawaban ruby ​​sedikit lebih.

Pada dasarnya, ruby ​​memilikinya lebih pendek karena indeks slice array inklusif, python perlu +1ganti rugi.

Penjelasan

Dapatkan 2 array (tetangga vertikal dan horizontal), lalu pilih satu atau keduanya berdasarkan beberapa perhitungan.

GB
sumber
1

Java 7, 63 byte (hardcoded)

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

0-diindeks
(Keluaran pesanan terbalik karena 024dan 046bukan bilangan bulat yang valid.)
Masih bekerja pada versi yang tidak dikodekan, tetapi saya dapat meyakinkan Anda bahwa itu tidak akan lebih pendek ..

Coba di sini.


82 byte

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

1-diindeks
Berdasarkan jawaban @Steadybox 'C

Coba di sini.

Kevin Cruijssen
sumber
0

JavaScript + lodash, 71 byte

f=a=>_.range(9).filter(b=>a>b?f(b).includes(a):[,1,,1][b-a]&&b%3|a%3<2)
Brian McCutchon
sumber
0

Batch, 116 byte

@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

Diindeks 0.

Neil
sumber