... lub Toroidalne dzielnice Moore
Podane liczby całkowite dodatnie h
, w
i całkowitą nieujemną i
, powrót wszystkich indeksów i okolic i
.
Przyjmij macierz składającą się z h
rzędów w
elementów, ponumerowanych od najniższego, w lewym górnym rogu, do najwyższego, w prawym dolnym rogu, i zwróć, w dowolnym rozsądnym formacie, listę indeksów, które otaczać indeksu i
. Ta macierz jest torusem (nieskończona mapa, która owija się wokół każdej krawędzi).
Na przykład dane wejściowe h=4
i w=4
, spowodowałyby macierz:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
ale dokładniej:
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
więc jeśli i
tak 0
, musisz wrócić 15, 12, 13, 3, 1, 7, 4, 5
(0).
Przykłady
W oparciu o 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
Na podstawie 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
Zasady
- Twoja odpowiedź może być zindeksowana lub 0, twój wybór, proszę podać.
- Możesz założyć, że
i < h * w
(lubi <= h * w
dla 1-indeksowanych odpowiedzi). - Możesz założyć, że
i >= 0
(lubi > 0
dla 1-indeksowanych odpowiedzi). - Kolejność zwracanych wartości nie jest ważna, o ile uwzględnione jest tylko osiem pożądanych wartości.
- Standardowe luki są zabronione .
- To jest golf golfowy, więc wygrywa najkrótsza odpowiedź w każdym języku!
Dzięki @Conor O'Brien za bardziej technicznie brzmiący tytuł i @ngm za więcej przypadków testowych!
Odpowiedzi:
JavaScript (ES6), 75 bajtów
Zaoszczędzono 2 bajty dzięki @KevinCruijssen
Oczekuje indeksu opartego na 0.
Wypróbuj online!
Otaczające indeksy są zwracane w następującej kolejności:
W jaki sposób?
Wskaźniki każdej otaczającej komórki w ( x + d x , y + d y ) są podane przez:jarex , dy ( x + dx , y+ dy)
gdzie to indeks komórki docelowej.N.= w y+ x
Przechodzimy przez listę i odejmujemy aby uzyskać wartość , co daje:1 d x[ 1 , 2 , 2 , 2 , 1 , 0 , 0 , 0 ] 1 rex
Dla odpowiednich wartości używamy tej samej listy przesuniętej o 2 pozycje, co daje:rey
źródło
w*(~~(i/w+h+~-a[j+2&7])%h)
aby~~(a[j+2&7]-1+i/w+h)%h*w
zaoszczędzić 2 bajty, pozbywając się z pary nawiasach.APL (Dyalog Classic) , 27 bajtów
Wypróbuj online!
{
}
jest funkcją z argumentami⍺
(wymiaryh w
) i⍵
(indeksi
)⍳3 3
jest macierzą wszystkich liczb dwucyfrowych trójskładnikowych 2:0 0
,0 1
, ...,2 2
,
powiększa macierz jako wektor1↓4⌽
usuwa środkowy element1 1
, obracając 4 w lewo (4⌽
) i upuszczając jeden (1↓
)1-
odejmuje od 1, dając wszystkie 8 przesunięć sąsiadów(
)¨
stosuje ciąg funkcji w nawiasach do każdego przesunięcia⍺⊤⍵
jest podstawowym⍺
kodowaniem⍵
współrzędnych⍵
w macierzy(⍺⊤⍵)-⊢
odejmuje bieżące przesunięcie, podając współrzędne sąsiada⍺|
to moda
do zawijania współrzędnych i pozostawania w matrycy⍺⊥
dekoduje z bazy⍺
źródło
APL (Dyalog Unicode) , 40 bajtów SBCS
Anonimowa funkcja poprawki. Przyjmuje
h
w
jako lewy argument ii
prawy argument.Wypróbuj online!
{
…}
„Dfn”;⍺
to lewy argument (wymiary) i⍵
prawy argument (indeks).×/⍺
iloczyn (pomnożenie-pomniejszenie) wymiarów⍳
pierwszy, że wiele wskaźników⍺⍴
używać wymiary r eshape tym⊂
dołącz go (aby traktować jako pojedynczy element)(
…),
Wstaw następujące:⍺⊤⍵
zakoduj indeks w mieszanej podstawieh
w
(daje nam to współrzędne indeksu)¯1+
dodaj ujemny do tych współrzędnych⊖∘⍉/
zmniejsz przez obrócenie-transponowaniejest to równoważne z
y⊖⍉x⊖⍉
…, które jest równoważne zy⊖x⌽
…, który obraca w lewo tyle kroków, ilei
jest przesunięty w prawo (mniej jeden), i obraca w górę tyle kroków, ilei
jest przesunięty w dół (mniej jeden), powodując macierz 3 na 3 staramy się znajdować w lewym górnym rogu⊃
ujawnij (ponieważ redukcja zredukowała wektor do skalara przez załączenie)⍪⍨⍣2
stos na sobie dwa razy (tak naprawdę potrzebujemy tylko trzykrotnie dla matryc jednorzędowych),⍨⍣2
dołącz do siebie dwa razy (tak naprawdę potrzebujemy tylko trzykrotnie dla matryc jednokolumnowych)3 3↑
weź pierwsze trzy rzędy pierwszych trzech kolumnNastępne dwa kroki można pominąć, jeśli dopuszczalne jest zwracanie macierzy 3 na 3:
,
ravel (spłaszczyć)4⌽
obróć cztery kroki w lewo (przenosi środkowy element na przód)1↓
upuść pierwszy elementźródło
{,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}
Nie jestem pewien, czy powinieneś również usunąć środkowy element:{4⌽1↓4⌽
...}
[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
Python 2 ,
796966 bajtówWypróbuj online!
3 bajty obdarowane przez Neila , który to zauważył
(x*w)%(h*w)==((x)%h)*w==(x)%h*w
.Rozwiązanie z indeksowaniem 0.
źródło
%h*w
oszczędza 3 bajty*w%(h*w)
.R ,
125 111108 bajtówWypróbuj online!
14 i 8 bajtów gry w golfa przez @JayCe i @Mark.
Dane wejściowe są
[w, h], i
spowodowane tym, że R wypełnia najpierw kolumnę tablic.Sprawia, że tablica, a następnie „trzykrotnie” jest pod względem wiersza i kolumny. Następnie zlokalizuj
i
w oryginalnej tablicy i znajdź jej sąsiedztwo. Wyjście bezi
.źródło
seq()
ze1:
PHP , 165 bajtów
Jest to „oparte na 0”. W PHP musi być lepsze rozwiązanie, ale jest to punkt wyjścia!
Aby uruchomić:
Przykład:
Lub wypróbuj online!
źródło
K (ngn / k) ,
2724 bajtówWypróbuj online!
{
}
jest funkcją z argumentamix
(wymiaryh w
) iy
(indeksi
)(!9)^4
jest0 1 2 3 4 5 6 7 8
bez4
3\
koduje w trójskładniku:(0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)
1-
odejmuje od1
, dając przesunięcie sąsiada:(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)
x\y
jest podstawowymx
kodowaniemy
współrzędnychy
w macierzy-
odejmuje każde przesunięcie, dając nam 8 par współrzędnych sąsiadax!''
jest modx
dla każdego - zawija współrzędne, aby pozostały w matrycyx/
dekoduje z podstawyx
- zamienia pary współrzędnych w pojedyncze liczby całkowiteźródło
~
?⍨
APL, który jest jak~
w J i jestem przekonany o jego użyteczności, ale widzisz, że k ogranicza się do wydruku ASCII i (prawie) żadnych digrafów, więc nowy przysłówek oznaczałby poświęcenie niektórych innych użytecznych prymitywów, a także większa niezgodność między implementacjami. Nie rozumiem, co mogę, żeby to włożyć.MATL , 24 bajty
Wejścia są
h
,w
,i
. Dane wyjściowe to wektor wiersza lub wektor kolumny z liczbami.Wejścia
i
i wyjścia są oparte na 1.Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
źródło
Wolfram Language (Mathematica) , 74 bajty
Wypróbuj online!
Pobiera dane wejściowe w odwrotnej kolejności (
i, w, h
0).Matryca 3x3 z umieszczoną w niej komórką środkową (60 bajtów)
Takes (
w, h, i
), 1-oparty.Wypróbuj online!
źródło
Partia, 105 bajtów
0-indeksowane. Zaoszczędzono 23 bajty, kradnąc sztuczkę modulo 3 ChasBrown.
źródło
MATL, 24 bajty
Wypróbuj na MATL Online
Przyjmuje dane wejściowe
[w h]
ii
. 8 bajtów zostałobezwstydnie skradzionych zinspiracji odpowiedzią Luisa Mendosa, choć ogólne podejście jest inne.źródło
Czysty ,
8583 bajtówWypróbuj online!
Traktuje
i
jako współrzędną(0 <= p < h, 0 <= q < w)
i generuje wartości sąsiednich elementów, w których wartość jestp'w + q'
.źródło
Galaretka , 20 bajtów
Dyadyczny link akceptujący listę wymiarów po lewej stronie,
[h,w]
a komórka jako liczba całkowita po prawej stroniei
, co daje listę sąsiedztwa.Uwaga: kolejność jest inna niż w przykładach dozwolonych w PO
Wypróbuj online!
W jaki sposób?
źródło
Attache , 66 bajtów
Wypróbuj online!
Nadal muszę wdrożyć
Moores
iNMoore
, ale nadal mam,Moore
który służy jako funkcja iteracji. ZasadniczoIntegers@@__2
tworzy tablicę liczb całkowitych kształtu__2
(dwa ostatnie argumenty) pierwszychProd[__2]
liczb całkowitych. To daje nam tablicę docelową. NastępnieMoore
iteruje funkcję{Push[a,_]}
po każdym sąsiedztwie wielkości Moore'a1
(domyślny argument), z opcją przełączania każdego elementu (cycle->1
). To dodaje każdą okolicę do tablicya
. NastępnieFlat[a@_]
spłaszcza trzeci_
członeka
, czyli okolicę Moore wokół_
(pierwszy argument).[0:3'5:8]
uzyskuje wszystkich członków oprócz środka z tej spłaszczonej tablicy.To rozwiązanie z aktualizacją języka wyglądałoby mniej więcej tak (49 bajtów):
źródło
Kotlin , 88 bajtów
Wykorzystuje indeksy oparte na zerach i generuje listę 8 elementów.
Wypróbuj online!
źródło