... oder Toroidal Moore Nachbarschaften
Angesichts positive ganze Zahlen sind h
, w
und eine nicht negative ganze Zahl i
, kehren alle Indizes umgibt i
.
Sie müssen eine Matrix annehmen, die aus h
Zeilen von w
Elementen besteht, die von der niedrigsten in der oberen linken Ecke bis zur höchsten in der unteren rechten Ecke nummeriert sind, und in einem angemessenen Format eine Liste der entsprechenden Indizes zurückgeben umgeben den Index i
. Diese Matrix ist ein Torus (eine unendliche Karte, die sich um jede Kante wickelt).
Zum Beispiel würden Eingaben h=4
und zu folgender w=4
Matrix führen:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
aber genauer:
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
so dass , wenn i
war 0
, würde müssen Sie zurückkommen 15, 12, 13, 3, 1, 7, 4, 5
(0-basiert).
Beispiele
0-basiert:
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
1-basiert:
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
Regeln
- Ihre Antwort kann 0 oder 1-indiziert sein, Ihre Wahl, bitte spezifizieren.
- Das können Sie annehmen
i < h * w
(oderi <= h * w
für 1-indizierte Antworten). - Das können Sie annehmen
i >= 0
(oderi > 0
für 1-indizierte Antworten). - Die Reihenfolge der zurückgegebenen Werte ist nicht wichtig, solange nur die acht gewünschten Werte enthalten sind.
- Standardlücken sind verboten .
- Das ist Code-Golf, also gewinnt die kürzeste Antwort in jeder Sprache!
Vielen Dank an @Conor O'Brien für den technischeren Titel und @ngm für mehr Testfälle!
Antworten:
JavaScript (ES6), 75 Byte
2 Bytes dank @KevinCruijssen gespeichert
Erwartet einen 0-basierten Index.
Probieren Sie es online!
Die umgebenden Indizes werden in der folgenden Reihenfolge zurückgegeben:
Wie?
Die Indizes jeder umgebenden Zelle bei sind gegeben durch: ( x + d x , y + d y )ichdx , dy ( x + dx , y+ dy)
Dabei ist der Index der Zielzelle.N= w y+ x
Wir gehen die Liste und subtrahieren , um den Wert von , der ergibt:1 d x[ 1 , 2 , 2 , 2 , 1 , 0 , 0 , 0 ] 1 dx
Für die entsprechenden Werte von wir dieselbe Liste, die um zwei Positionen verschoben ist. ergibt:dy
quelle
w*(~~(i/w+h+~-a[j+2&7])%h)
um~~(a[j+2&7]-1+i/w+h)%h*w
2 Bytes zu sparen, indem ein Klammerpaar entfernt wird.APL (Dyalog Classic) , 27 Byte
Probieren Sie es online!
{
}
ist eine Funktion mit Argumenten⍺
(den Dimensionenh w
) und⍵
(dem Indexi
)⍳3 3
ist eine Matrix aller 2-stellige ternärer Zahlen:0 0
,0 1
, ...,2 2
,
trägt die Matrix als Vektor ein1↓4⌽
Entfernt das mittlere Element,1 1
indem Sie 4 nach links drehen (4⌽
) und eins fallen lassen (1↓
).1-
subtrahiert von 1 und gibt alle 8 Nachbarversätze an(
)¨
Wendet den Funktionszug in Klammern auf jeden Versatz an⍺⊤⍵
ist die Basiscodierung⍺
von⍵
- den Koordinaten⍵
in der Matrix(⍺⊤⍵)-⊢
subtrahiert den aktuellen Versatz und gibt die Koordinaten eines Nachbarn an⍺|
ist ein Moda
, der Koordinaten umfließt und in der Matrix bleibt⍺⊥
decodiert von der Basis⍺
quelle
APL (Dyalog Unicode) , 40 Byte SBCS
Anonyme Infix-Funktion. Nimmt
h
w
als linkes Argument undi
als rechtes Argument.Probieren Sie es online!
{
...}
"dfn";⍺
ist linkes Argument (Dimensionen) und⍵
rechtes Argument (Index).×/⍺
Produkt (Multiplikation-Reduktion) der Dimensionen⍳
der erste, der viele indizes⍺⍴
Verwenden Sie die Dimensionen, um das umzugestalten⊂
schließe es ein (um es als ein einzelnes Element zu behandeln)(
…),
Folgendes voranstellen:⍺⊤⍵
Kodiere den Index in Mixed-Radixh
w
(dies gibt uns die Koordinaten des Index)¯1+
Fügen Sie diesen Koordinaten eine negative hinzu⊖∘⍉/
Reduzieren durch Drehen-der-Transponierenist gleichbedeutend mit
y⊖⍉x⊖⍉
... was gleichbedeutend mity⊖x⌽
... ist, das so viele Schrittei
nach links dreht, wie nach rechts versetzt sind (weniger als einer), und so viele Schritte nach oben dreht, wie nachi
unten versetzt sind (weniger als einer) Die 3-mal-3-Matrix soll sich in der oberen linken Ecke befinden⊃
offenbaren (weil die Reduktion den Vektor durch Einschließen auf Skalar reduzierte)⍪⍨⍣2
zweimal auf sich selbst stapeln (wir brauchen wirklich nur dreimal für einreihige Matrizen),⍨⍣2
hängt sich zweimal an (wir brauchen wirklich nur dreimal für einspaltige Matrizen)3 3↑
nimm die ersten drei Zeilen der ersten drei SpaltenDie nächsten beiden Schritte können weggelassen werden, wenn die Rückgabe einer 3-mal-3-Matrix akzeptabel ist:
,
Ravel (Abflachen)4⌽
Vier Schritte nach links drehen (bringt das mittlere Element nach vorne)1↓
Lassen Sie das erste Element fallenquelle
{,(⍺⊥⍺|(⍺⊤⍵)-⊢)¨1-⍳3 3}
Ich bin mir nicht sicher, ob du auch das mittlere Element entfernen{4⌽1↓4⌽
}
[-1, -1], [-1, 0], [-1, 1], [0, -1], [0, 1], [1, -1], [1, 0], [1, 1]
Python 2 ,
796966 BytesProbieren Sie es online!
3 Bytes geschenkt von Neil , der das bemerkt
(x*w)%(h*w)==((x)%h)*w==(x)%h*w
.0-indizierte Lösung.
quelle
%h*w
Spart 3 Bytes über*w%(h*w)
.R ,
125 111108 BytesProbieren Sie es online!
14 und 8 Bytes von @JayCe und @Mark.
Die Eingabe erfolgt,
[w, h], i
weil R zuerst die Spalte der Arrays ausfüllt.Macht das Array und "verdreifacht" es dann zeilen- und spaltenweise.
i
Suchen Sie dann im ursprünglichen Array und finden Sie dessen Nachbarschaft. Ausgabe ohnei
.quelle
seq()
mit1:
PHP , 165 Bytes
Dies ist "0-basiert". Es muss eine bessere Lösung in PHP geben, aber dies ist ein Ausgangspunkt!
Um es auszuführen:
Beispiel:
Oder versuchen Sie es online!
quelle
K (NGN / k) ,
2724 BytesProbieren Sie es online!
{
}
ist eine Funktion mit Argumentenx
(den Dimensionenh w
) undy
(dem Indexi
)(!9)^4
ist0 1 2 3 4 5 6 7 8
ohne die4
3\
codiert in ternary:(0 0;0 1;0 2;1 0;1 2;2 0;2 1;2 2)
1-
subtrahiert von1
und gibt benachbarte Offsets:(1 1;1 0;1 -1;0 1;0 -1;-1 1;-1 0;-1 -1)
x\y
ist die Basiscodierungx
vony
- den Koordinateny
in der Matrix-
subtrahiert jeden Versatz und gibt uns 8 Paare von Nachbarkoordinatenx!''
is modx
for each - Koordinaten umlaufen, um in der Matrix zu bleibenx/
decodiert von der Basisx
- wandelt Koordinatenpaare in einzelne Ganzzahlen umquelle
~
?⍨
in APL aus, das ist wie~
in J, und ich bin von seiner Nützlichkeit überzeugt, aber Sie sehen, k ist auf druckbares ASCII und (fast) keine Digraphen beschränkt, also würde ein neues Adverb bedeuten das Opfer eines anderen nützlichen Grundelements sowie mehr Inkompatibilität zwischen Implementierungen. Ich verstehe nicht, was ich tun kann, um dies zu tun.MATL , 24 Bytes
Die Eingänge sind
h
,w
,i
. Die Ausgabe ist ein Zeilen- oder Spaltenvektor mit den Zahlen.Eingang
i
und Ausgang sind 1-basiert.Probieren Sie es online! Oder überprüfen Sie alle Testfälle .
Erläuterung
quelle
Wolfram Language (Mathematica) , 74 Bytes
Probieren Sie es online!
Nimmt die Eingabe in umgekehrter Richtung (
i, w, h
) auf der Basis von 0 vor.3x3 Matrix mit der mittleren Zelle (60 Bytes)
Takes (
w, h, i
), 1-basiert.Probieren Sie es online!
quelle
Batch, 105 Bytes
0-indiziert. 23 Bytes durch Stehlen von @ ChasBrowns Modulo 3-Trick gespart.
quelle
MATL, 24 Bytes
Probieren Sie es auf MATL Online aus
Übernimmt Eingaben
[w h]
undi
. 8 Bytes davon wurdenschamlosvon Luis Mendos 'Antwortgestohlen, obwohl der Gesamtansatz anders ist.quelle
Sauber ,
8583 BytesProbieren Sie es online!
Wird
i
als Koordinate behandelt(0 <= p < h, 0 <= q < w)
und generiert die Werte der angrenzenden Elemente, in denen sich der Wert befindetp'w + q'
.quelle
Gelee , 20 Bytes
Ein dyadischer Link, der eine Liste der Dimensionen auf der linken Seite
[h,w]
und die Zelle als Ganzzahl auf der rechten Seite akzeptierti
, die eine Liste der Nachbarschaft ergibt.Hinweis: Die Reihenfolge unterscheidet sich von der in den Beispielen, die im OP zulässig sind
Probieren Sie es online!
Wie?
quelle
Attache , 66 Bytes
Probieren Sie es online!
Ich muss noch implementieren
Moores
undNMoore
, aber ich habe immer nochMoore
die als Iterationsfunktion dient. Erstellt im WesentlichenIntegers@@__2
ein ganzzahliges Shape-Array__2
(die letzten beiden Argumente) der erstenProd[__2]
Ganzzahlen. Dies gibt uns das Ziel-Array. AnschließendMoore
iteriert die Funktion{Push[a,_]}
über jede Moore-Nachbarschaft der Größe1
(implizites Argument) mit der Option, jedes Element (cycle->1
) zu durchlaufen . Dadurch wird jede Nachbarschaft zum Array hinzugefügta
. Dann wirdFlat[a@_]
das_
dritte Mitglied , dh dasa
um das Moore-Viertel zentrierte, abgeflacht_
(das erste Argument).[0:3'5:8]
Ruft alle Elemente mit Ausnahme der Mitte aus diesem abgeflachten Array ab.Diese Lösung mit einer Aktualisierung der Sprache würde ungefähr so aussehen (49 Byte):
quelle
Kotlin , 88 Bytes
Verwendet nullbasierte Indizes und gibt eine Liste mit 8 Elementen aus.
Probieren Sie es online!
quelle