Zwraca indeks sąsiadów w siatce 3x3

11

Dobra, moja druga próba golfa kodowego, zobaczmy, jak to idzie.

Udawaj, że masz tablicę 9 wartości. Teraz wyobraź sobie tę tablicę w siatce 3x3.

Musisz zwrócić sąsiadów, których liczba ma jako indeksy tablicy.

0 | 1 | 2)

3 | 4 | 5

6 | 7 | 8

Zasady:

  • To jest golf golfowy, więc wygrywa najkrótsza odpowiedź.
  • Indeks tablicy udawanych może zaczynać się od 0 lub 1. (wszystkie przykłady używają jednak 0)
  • Zwracane są tylko wartości wartości (jak if 3: return 046)
  • Podanie może być tylko procedurą / funkcją / metodą, ale przykład byłby miły
  • Zwracana wartość może być w dowolnej kolejności (np. Jeśli wejście wynosi 0, może to być 13 lub 31)
  • jeśli chcesz, wynikiem może być lista liczb, np. [0,4,6]zamiast046
  • przekątne się nie liczą, jak widać w przykładach.

Przykłady:

Wejście:

0

wynik:

13

Wejście:

3)

wynik:

046

Wejście:

4

wynik:

1357

hcorion
źródło
4
Wygląda na to, że wyzwanie to może zyskać na czasie w piaskownicy . Możesz opublikować tam swoje wyzwanie, aby inni mogli je przejrzeć i pomóc ci przed opublikowaniem go na stronie głównej. Z twoich przykładów zgaduję, że nie liczysz przekątnych. Możesz dodać to do samego pytania. Wspominasz również o wymogu wyprowadzania indeksów tablicy, które są sąsiadami. Myślę, że to może być po prostu zakodowane na stałe dla siatki 3x3. Czy może lepiej byłoby wyprowadzić samych sąsiadów?
Poke
7
Wiesz, marszcząc brwi, to nie jest coś, co tutaj robimy; kodowanie wyjściowe jest albo dozwolone, albo nie. Ponieważ zazwyczaj ciężko jest zdefiniować, co dokładnie liczy się jako kodowanie twarde, osobiście po prostu pozwolę na to lub podam rozmiar siatki jako dodatkowe dane wejściowe.
Dennis
1
Czy wyjściem może być lista liczb, np. [0,4,6]Zamiast 046?
Laikoni
@Laikoni Tak, trochę za późno, bo już na nie odpowiedziałeś.
hcorion
@Dennis Tak, nie byłem pewien, jak to ująć. Podoba mi się, w jaki sposób zrobiły to odpowiedzi w języku C i python, podając jedno i drugie, ale jako odpowiedź nie zakodowana na stałe. Chciałem raczej zachęcić algorytmy niż kodować na stałe, ale nie byłem pewien, czy to w ogóle możliwe (bez zbyt długich odpowiedzi) i nie chciałem nie mieć odpowiedzi na moje pytanie.
hcorion

Odpowiedzi:

2

Galaretka , 16 13 bajtów

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

Wypróbuj online!

Jak to działa

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
źródło
Reguły mówią: „Indeks tablicy udawanych może zaczynać się od 0 lub 1.” - możesz upuścić Dekrement na końcu.
steenbergh
@steenbergh Zakładam, że musiałbym również wziąć dane wejściowe 1, co kosztuje tyle bajtów, ile oszczędza.
Dennis
9

MATL , 17 16 bajtów

9:qWIe1Y6Z+i)BPf

Tablica jest oparta na 1, to znaczy zawiera liczby od 1do 9.

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie

Rozważ dane wejściowe 2jako przykład.

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
źródło
1
Wat Jak to wymyśliłeś?
Robert Fraser
1
@RobertFraser Wyzwania związane ze znalezieniem sąsiadów zawsze sugerują mi podejście splotowe. Ale splot z natury dodaje wartości sąsiadów, więc musiałem być w stanie je rozdzielić na końcu --- to potęga dwóch i binarnych części ekspansji
Luis Mendo
5

Mathematica, 32 bajty

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

Używa wykresu zamiast tablicy. GridGraph@{3,3}konstruuje wykres w kształcie siatki 3x3, pokazany poniżej, który Mathematica domyślnie przydziela numery 1–9 wierzchołkom. Następnie ~AdjacencyList~#&mówi sąsiadom wierzchołka.

Wykres siatki 3x3

Nie drzewo
źródło
Uwielbiam te wbudowane ...
Neil
4

Mathematica, 40 bajtów

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

1-indeksowany. Po prostu szuka odpowiedzi. Czy ktoś może zrobić lepiej w Mathematica?

Greg Martin
źródło
3
Dziwi mnie, że nie ma do tego wbudowanej funkcji. Tak jak się spodziewałem, że będzie wbudowana funkcja znajdowania wszystkich sąsiadów elementu w tablicy 2D, ale nie jestem pewien, nie wiem nic o Mathematica oprócz tego, że ma zbyt wiele wbudowanych funkcji.
HyperNeutrino
2
Możesz zapisać bajt za pomocą 0-indeksowania i 31[420,51,...,75][[#]]&.
Martin Ender
1
Możesz użyć GridGraph@{3,3}~AdjacencyList~#&dla 32 bajtów, z 1-indeksowaniem.
Nie drzewo
@ lanlock4 Awesome! Proszę udzielić odpowiedzi, abym mógł ją głosować!
Greg Martin
4

Oktawa, 42 40 39 bajtów

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

Indeks oparty na 1.

Sprawdź wszystkie przypadki testowe.

Wyjaśnienie:

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.

Przykład: n = 2

x =

   0   0   0
   1   0   0
   0   0   0

(W Octave dane są przechowywane w kolumnach.)

d =

   1.00000   1.41421   2.23607
   0.00000   1.00000   2.00000
   1.00000   1.41421   2.23607

indeks logiczny, w którym odległość wynosi 1:

d == 1

 1   0   0
 0   1   0
 1   0   0

find(d ==1)

 1
 3
 5
rahnema1
źródło
3

Python 2, 71 bajtów

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

1-indeksowany
Wypróbuj online!


Uzyskanie wyniku ze wstępnie zdefiniowanej listy wyników jest krótsze (46 bajtów):

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

0-indeksowany
Wypróbuj online!

ovs
źródło
2

Haskell , 74 71 68 bajtów

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]

Wypróbuj online! Wykorzystuje 1-indeksowaną siatkę. Przykładowe użycie: f 3zwraca[2,6] .

Edycja: Zaoszczędź 3 6 bajtów dzięki Ørjan Johansen!


W przypadku 77 75 bajtów następująca funkcja #działa dla dowolnego rozmiaru siatki 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]

Wypróbuj online! Dla każdej nlisty [n-m,n-1,n+1,n+m]zawiera wszystkich czterech sąsiadów. Dla każdego wpisu xna tej liście sprawdzamy -1<xi x<m*mupewniamy się, że xnie znajduje się powyżej lub poniżej siatki, mod n 3>0||n-1/=xaby wymusić lewą granicę siatki i mod(n+1)m>0||n+1/=xlewą granicę.

Laikoni
źródło
1
Możesz użyć [n-3,n-1..n+3]i gcd 3n>1.
Ørjan Johansen
Ups, nieważne w tej gcdczęści. Powinno być <3, a potem się załamuje n==0. Państwo może być w stanie korzystać z tego sprawę, jeśli zmienisz wszystko 1-indexed.
Ørjan Johansen
Aha, i n/=2&&n/=5można je zastąpić mod x 3>0. (Lub gcdwersja z reindeksowaniem, która może być teraz używana dwukrotnie.)
Ørjan Johansen
2

Ruby , 51 48 45 bajtów

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

Wypróbuj online!

Utwórz 2 tablice z sąsiadującymi pionami i poziomymi, a następnie wybierz jedną lub więcej z nich.

Ruby na stałe, 44 bajty

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

... Nie jest tego warte.

GB
źródło
2

C, 100 92 91 83 78 74 bajty

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-indeksowany. Dzięki @Neil za oszczędność 4 bajtów.

Wypróbuj online!

Wersja na stałe, 56 bajtów

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

0-indeksowane

Steadybox
źródło
2
Czy w pierwszej wersji nie można pisać n>3&&p(n-3)itp., Aby zapisać 4 bajty? W drugiej wersji nie możesz pisać, l[]=aby zapisać bajt?
Neil
@Neil Tak, mogę. Dzięki!
Steadybox
Czy na pewno Twój kod jest obecnie poprawny? Gdy testuję przypadki testowe, nie udaje się to we wszystkich trzech ..: S Wypróbuj tutaj. Czy mógłbyś podać działający link TIO, może robię coś złego?
Kevin Cruijssen
1
Dodano link TIO @KevinCruijssen i wygląda na to, że zapomniałem edytować rzeczywisty kod ostatniej edycji ... No cóż. Twój link też działa poprawnie, ale zauważ, że moja odpowiedź ma indeks 1, podczas gdy przykładowe przypadki testowe mają indeks 0.
Steadybox
@ Steadybox Ah, naprawdę masz rację. Przegapiłem część 1-indeksowaną, moje złe. Dzięki za dodanie TIO. +1
Kevin Cruijssen
1

Python 2, 51 bajtów

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

Na podstawie poprzedniej wersji mojego odpowiedzi Ruby uznałem ją za interesującą, ponieważ był to w większości ten sam kod, wykorzystujący inną sztuczkę i daje ten sam wynik. Właściwe dobranie tego pomogło mi trochę lepiej odpowiedzieć na rubinową odpowiedź.

Zasadniczo ruby ​​ma go krótszy, ponieważ indeks plasterka tablicy jest włącznie, python potrzebuje +1 kompensacji.

Wyjaśnienie

Uzyskaj 2 tablice (sąsiedzi w pionie i poziomie), a następnie wybierz jedną lub obie na podstawie niektórych obliczeń.

GB
źródło
1

Java 7, 63 bajty (na stałe)

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

0-indeksowane
(Odwrócone wyjście zamówienia, ponieważ 024i 046nie są poprawnymi liczbami całkowitymi.)
Wciąż pracuję na wersji nie zakodowanej na stałe, ale zapewniam cię, że nie będzie krótsza ..

Wypróbuj tutaj.


82 bajty

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

1-indeksowany
Na podstawie odpowiedzi @Steadybox 'C.

Wypróbuj tutaj.

Kevin Cruijssen
źródło
0

JavaScript + lodash, 71 bajtów

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

Partia, 116 bajtów

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

Neil
źródło