3x3 ızgarada dönüş komşuları dizini


11

Pekala, ikinci bir kod golf girişimim, bunun nasıl gittiğini görelim.

9 değerlik bir diziniz varmış gibi davranın. Şimdi bu diziyi 3x3 ızgarada hayal edin.

Bu sayının dizinin dizini olarak sahip olduğu komşuları döndürmeniz gerekir.

0 | 1 | 2

3 | 4 | 5

6 | 7 | 8

Kurallar:

  • Bu kod golf, çok kısa cevap kazanır.
  • Rol dizisinin dizini 0 veya 1'den başlayabilir (tüm örnekler 0 olsa da)
  • Sadece değerleri döndüren değerler kaşlarını çatıyor (beğen if 3: return 046)
  • Teslim sadece bir prosedür / işlev / yöntem olabilir, ancak bir örnek iyi olurdu
  • Döndürülen değer herhangi bir sırada olabilir (giriş 0 ise 13 veya 31 olabilir)
  • İsterseniz, çıktı örneğin, numarası listesi olabilir [0,4,6]yerine046
  • köşegenler örneklerde görüldüğü gibi dikkate alınmaz.

Örnekler:

giriş:

0

çıktı:

13

giriş:

3

çıktı:

046

giriş:

4

çıktı:

1357


4
Bu zorluğun Sandbox'ta bir süre fayda sağlayabileceği anlaşılıyor . Meydan okumanızı oraya gönderebilirsiniz, böylece diğerleri bunu gözden geçirebilir ve ana sayfaya göndermeden önce size yardımcı olabilir. Örneklerinizden, köşegenleri saymadığınızı tahmin ediyorum. Bunu sorunun kendisine eklemek isteyebilirsiniz. Ayrıca, dizinin komşu dizinlerinin çıktılarını alma gereksiniminden de bahsedersiniz. Bu sadece 3x3 ızgara için kodlanmış olabilir düşünüyorum. Komşuları kendileri üretmek daha iyi olabilir mi?
Poke

7
Bildiğiniz gibi, kaşlarını çatmak gerçekten burada yaptığımız bir şey değil; hardcoding çıktısına ya izin verilir ya da izin verilmez. Tam olarak kodlama olarak neyin sayıldığını tanımlamak genellikle oldukça zor olduğundan, kişisel olarak sadece izin veririm veya ızgara boyutunu ek bir giriş olarak veririm.
Dennis

1
Çıktı bir sayı listesi olabilir mi , örneğin [0,4,6]yerine 046?
Laikoni

@Laikoni Evet, biraz geç kaldınız çünkü zaten cevapladınız.
hcorion

@Dennis Evet, nasıl koyacağımı tam olarak bilmiyordum. C ve python cevaplarının her ikisini de sağlayarak nasıl yaptığını seviyorum, ancak kesin olarak kodlanmamış cevabı final olarak aldım. Sabit kodlama yerine algoritmaları teşvik etmek istedim, ancak bunun mümkün olup olmadığından emin değildim (çok uzun cevaplar olmadan) ve soruma cevap vermek istemedim.
hcorion

Yanıtlar:


2

Jöle , 16 13 bayt

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

Çevrimiçi deneyin!

Nasıl çalışır

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.

Kuralların durumu: "Rol yapma dizisinin dizini 0 veya 1'den başlayabilir." - Azaltmayı sonunda bırakabilirsiniz.
steenbergh

@steenbergh O zaman ben de 1-tabanlı girdi almak zorunda olacağını varsayalım, hangi tasarruf kadar bayt maliyeti.
Dennis

9

MATL , 17 16 bayt

9:qWIe1Y6Z+i)BPf

Dizisi yani, numaraları içeren, 1-tabanlıdır 1için 9.

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

açıklama

Girişi 2örnek olarak ele alalım.

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
Wat? Bunu nasıl buldunuz?
Robert Fraser

1
@RobertFraser Komşuları bulmakla ilgili bu zorluklar bana her zaman bir evrişim yaklaşımı öneriyor. Ama evrişim doğal olarak komşuların değerlerini ekledi, bu yüzden onları sonunda ayırabilmeliydim --- bu ikisinin gücü ve ikili genişleme parçaları
Luis Mendo

5

Mathematica, 32 bayt

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

Dizi yerine bir grafik kullanır. GridGraph@{3,3}Mathematica'nın varsayılan olarak köşeler için 1-9 sayılarıyla yararlı bir şekilde etiketlediği, aşağıda gösterilen 3x3 ızgara şeklinde bir grafik oluşturur. Sonra ~AdjacencyList~#&size bir tepe noktasının komşularını anlatır.

3x3 ızgara grafiği


Bu yapıları sevmeliyim ...
Neil

4

Mathematica, 40 bayt

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

1 endeksli. Sadece cevabı arar. Birisi Mathematica'da daha iyisini yapabilir mi?


3
Bunun için bir yerleşik olmadığına şaşırdım. Bir 2D dizideki bir öğenin tüm komşularını bulmak için bir yerleşik olmasını beklerdim, ama emin değilim, Mathematica hakkında çok fazla yerleşik olması dışında hiçbir şey bilmiyorum.
HyperNeutrino

2
0 dizinleme ve kullanarak bir bayt kaydedebilirsiniz 31[420,51,...,75][[#]]&.
Martin Ender

1
GridGraph@{3,3}~AdjacencyList~#&1 endeksleme ile 32 bayt için kullanabilirsiniz .
bir ağaç değil

@ lanlock4 Harika! Lütfen bir cevap verin, böylece oyumu yükseltebilirim!
Greg Martin

4

Oktav, 42 40 39 bayt

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

1 tabanlı dizin.

Tüm test senaryolarını doğrulayın.

Açıklama:

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.

Misal: n = 2

x =

   0   0   0
   1   0   0
   0   0   0

(Octave'de veriler sütun bazında saklanır.)

d =

   1.00000   1.41421   2.23607
   0.00000   1.00000   2.00000
   1.00000   1.41421   2.23607

mesafenin 1 olduğu mantıksal dizin:

d == 1

 1   0   0
 0   1   0
 1   0   0

find(d ==1)

 1
 3
 5

3

Python 2, 71 bayt

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

1 dizinli
Çevrimiçi deneyin!


Önceden tanımlanmış bir sonuç listesinden sonuç almak daha kısadır (46 bayt):

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

0 dizinli
Çevrimiçi deneyin!


2

Haskell , 74 71 68 bayt

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]

Çevrimiçi deneyin! 1 dizinli bir ızgara kullanır. Örnek kullanım: f 3döner [2,6].

Düzenle: Ørjan Johansen sayesinde 3 6 bayt kurtardı!


İçin 77 75 bayt, İzleyen fonksiyon, #rasgele bir ızgara boyutu için çalışır 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]

Çevrimiçi deneyin! Her biri niçin liste [n-m,n-1,n+1,n+m]dört komşuyu da içerir. Her giriş için xbu listede biz kontrol -1<xve x<m*memin olmak için x, üstünde veya ızgara altına değil mod n 3>0||n-1/=x, sol ızgara sınırını zorlamak için ve mod(n+1)m>0||n+1/=xsol sınır için.


1
Sen kullanabilirsiniz [n-3,n-1..n+3]ve gcd 3n>1.
Ørjan Johansen

Hata! Bu gcdkısmı boş verin. Bu olması gereken <3ve sonra için kırar n==0. Sen belki sen her şeyi değiştirmek eğer hile kullanabilecektir 1-indexed.
Ørjan Johansen

Oh, ve n/=2&&n/=5yerine değiştirilebilir mod x 3>0. (Veya gcdşimdi iki kez kullanılabilecek yeniden endeksleme içeren sürüm.)
Ørjan Johansen

2

Yakut , 51 48 45 bayt

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

Çevrimiçi deneyin!

Dikey ve yatay komşularıyla 2 dizi oluşturun, ardından bunlardan birini veya daha fazlasını seçin.

Ruby hardcoded, 44 bayt

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

... Değmez.


2

C, 100 92 91 83 78 74 bayt

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 endeksli. @Neil'e 4 bayt kaydettiği için teşekkürler.

Çevrimiçi deneyin!

Sabit kodlu sürüm, 56 bayt

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

0 endeksli


2
İlk sürümde, n>3&&p(n-3)4 bayt kaydetmek için vb. Yazamaz mısınız? İkinci versiyonda, l[]=bir bayt kaydetmek için yazamaz mısınız?
Neil

@Neil Evet yapabilirim. Teşekkürler!
Steadybox

Kodunuzun şu anda doğru olduğundan emin misiniz? Test senaryolarını denediğimde üçünde de başarısız oluyor ..: S Burada deneyin. Belki çalışan bir TIO bağlantısı sağlayabilir misiniz, belki yanlış bir şey yapıyorum?
Kevin Cruijssen

1
@KevinCruijssen TIO bağlantısı eklendi ve son düzenlemede gerçek kodu düzenlemeyi unuttuğum anlaşılıyor ... Oh, iyi. Bağlantınız da doğru çalışıyor, ancak cevabımın 1 dizinli, örnek test senaryoları ise 0 dizinli olduğuna dikkat edin.
Steadybox

@Steadybox Ah, haklısın. 1 endeksli kısmı kaçırdım, benim hatam. TIO'yu eklediğiniz için teşekkür ederiz. +1
Kevin Cruijssen

1

Python 2, 51 bayt

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

Ruby yanıtımın önceki bir sürümüne dayanarak, ilginç buldum çünkü farklı bir numara kullanarak çoğunlukla aynı koddu ve aynı sonucu üretiyor. Bu bir doğru almak bana yakut cevap biraz daha golf yardımcı oldu.

Temel olarak, ruby ​​daha kısa çünkü dizi dilim endeksi kapsayıcı, python +1telafi etmek için a gerekir.

açıklama

2 diziyi (dikey ve yatay komşular) alın, ardından bazı hesaplamalara göre birini veya her ikisini seçin.


1

Java 7, 63 bayt (sabit kodlanmış)

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

0-endeksli
(çünkü ters tamsayı çıktı 024ve 046geçerli tamsayılar değil.)
Hala sabit kodlu olmayan bir sürüm üzerinde çalışıyor, ancak daha kısa olmayacak emin olabilirsiniz ..

Burada deneyin.


82 bayt

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

1 endeksli
dayanarak @Steadybox 'Cı cevap

Burada deneyin.


0

JavaScript + lodash, 71 bayt

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

0

Toplu, 116 bayt

@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 endeksli.

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.