Wenn wir die natürlichen Zahlen nehmen und gegen den Uhrzeigersinn zu einer Spirale aufrollen, erhalten wir die folgende unendliche Spirale:
....--57--56
|
36--35--34--33--32--31--30 55
| | |
37 16--15--14--13--12 29 54
| | | | |
38 17 4---3---2 11 28 53
| | | | | | |
39 18 5 0---1 10 27 52
| | | | | |
40 19 6---7---8---9 26 51
| | | |
41 20--21--22--23--24--25 50
| |
42--43--44--45--46--47--48--49
Bei einer bestimmten Anzahl in dieser Spirale besteht Ihre Aufgabe darin, die Nachbarn zu bestimmen - dh das Element darüber, links, rechts und darunter.
Beispiel
Wenn wir uns das ansehen 27
, können wir sehen, dass es die folgenden Nachbarn hat:
- über:
28
- links:
10
- Recht:
52
- unten:
26
Die Ausgabe wäre also: [28,10,52,26]
Regeln
- Die Eingabe erfolgt in jedem Standard-E / A-Format mit einer Zahl
- Es wird eine Liste / Matrix / .. der 4 Nachbarn dieser Zahlen in beliebiger (konsistenter!) Reihenfolge ausgegeben
- Sie können mit einer Spirale arbeiten, die mit 1 anstelle von 0 beginnt. Dies sollten Sie jedoch in Ihrer Antwort angeben
Beispiele
Die Ausgabe hat das Format [above,left,right,below]
und verwendet eine 0-basierte Spirale:
0 -> [3,5,1,7]
1 -> [2,0,10,8]
2 -> [13,3,11,1]
3 -> [14,4,2,0]
6 -> [5,19,7,21]
16 -> [35,37,15,17]
25 -> [26,24,50,48]
27 -> [28,10,52,26]
73 -> [42,72,74,112]
101 -> [100,146,64,102]
2000 -> [1825,1999,2001,2183]
1000000 -> [1004003,1004005,999999,1000001]
Antworten:
R , 156 Bytes
Probieren Sie es online!
round
und verwenden,cospi(x)/sinpi(x)
die genauer sind alscos(x*pi)/sin(x*pi)
bei halben Zahlen (0.5
,1.5
etc ...)Erklärung:
Wenn wir die Matrixkoordinaten der Werte unter Berücksichtigung des ersten Wertes betrachten, der bei
0
platziert wirdx=0, y=0
, sind sie:Die
x
Koordinaten folgen der OEIS-Sequenz A174344 mit der rekursiven Formel:Dieselbe Formel gilt für
y
Matrixkoordinaten, jedoch mitcos
stattsin
und negiert:Also können wir in R die Formel in diese Funktion übersetzen, wobei wir
sinpi/cospi
als Parameter nehmen:und wir generieren die beiden Koordinatenvektoren (wir negieren die y-Koordinaten nicht, da wir das gleiche Ergebnis erhalten, nur mit umgekehrten Nachbarn nach oben / unten):
Beachten Sie, dass wir
(n+2)^2
Koordinaten generiert haben , die mehr als die erforderlichen Mindestkoordinaten sind, die beiden
und ihre Nachbarn enthalten (eine engere Grenze wäre(floor(sqrt(n))+2)^2
aber leider weniger "golf").Nachdem wir nun alle Koordinaten haben, suchen wir zuerst die Koordinaten
a,b
, die unseren entsprechenn
:Schließlich wählen wir die Positionen ihrer Nachbarn aus, dh:
where x == a and y == b+1 or b-1
where y == b and x == a+1 or a-1
mit:
quelle
Perl 6 ,
9483 Bytes{my \ s = 0, | [+] flat ((1, i ... ) Zxx flat (1..Inf Z 1..Inf)); map {first: k, s [$ _] + $ ^ d, s}, i, -1,1, -i}Probieren Sie es online!
s
ist eine faule, unendliche Liste von Spiralkoordinaten, dargestellt als komplexe Zahlen. Es besteht aus zwei weiteren unendlichen Listen:1, *i ... *
Erstellt die Liste1, i, -1, -i ...
.1, 1.5 ... *
macht die Liste1, 1.5, 2, 2.5, 3, 3.5 ...
. Zipping diese beiden Listen zusammen mit der Liste der Replikation erzeugt die Liste der Schritte von jeder Spirale auf die nächste Koordinate:1, i, -1, -1, -i, -i, 1, 1, 1, i, i, i ...
. (Die Nachkommastellen der Argumente auf der rechten Seite für den Listenreplikationsoperator werden verworfen.) Wenn Sie eine dreieckige Additionsreduktion ([\+]
) für diese Liste ausführen (und 0 auf die Vorderseite einfügen), wird die Liste der Spiralkoordinaten erstellt.Schließlich ist aus der komplexen Zahl beginnen
s[$_]
($_
das einzige Argument für die Funktion ist), sehen wir die Indizes (bisfirst :k
) in der Spirale der komplexen Zahlen , die durch von dieser Zahl versetzt sindi
,-1
,1
, und-i
.quelle
Brain-Flak , 238 Bytes
Probieren Sie es online!
Die Ausgabe erfolgt in der Reihenfolge links, oben, rechts und unten.
Erläuterung
quelle
MATL , 15 Bytes
Eingang und Ausgang sind 1-basiert.
Die Ausgabe gibt die linken, unteren, oberen und rechten Nachbarn in dieser Reihenfolge an.
Probieren Sie es online! Oder überprüfen Sie alle Testfälle mit Ausnahme der letzten beiden, bei denen eine Zeitüberschreitung bei TIO auftritt.
quelle
1YL
- MATLAB hat einespiral
Funktion? Wann ist MATLAB zu Mathematica geworden ?!R , 172 Bytes
Probieren Sie es online!
Dies ist R, daher ist die Antwort offensichtlich 0-indiziert.
Der größte Teil der Arbeit ist das Erstellen der Matrix. Code inspiriert von: https://rosettacode.org/wiki/Spiral_matrix#R
quelle
JavaScript (ES6), 165 Byte
Druckt die Indizes mit
alert()
.Probieren Sie es online!
Wie?
(angepasst aus dieser Antwort von math.stackexchange)
quelle
RangeError: Maximum call stack size exceeded
und Fehler in Browser - Konsole:InternalError: too much recursion
. Mache ich etwas falsch?Python 2 ,
177164146144 BytesProbieren Sie es online!
Berechnet
u,l,r,d
direkt vonn
.quelle
PHP (> = 5,4), 208 Bytes
Um es auszuführen:
Beispiel:
Oder versuchen Sie es online!
Anmerkungen:
-d error_reporting=0
Option wird verwendet, um keine Benachrichtigungen / Warnungen auszugeben.Wie?
Ich generiere die Spirale mit einer modifizierten Version dieser Antwort in einem zweidimensionalen Array.
Die Größe der Spirale entscheide ich anhand der Eingabe
n
mit einer Formel, um immer eine zusätzliche Zahlenrunde in der Spirale zu erhalten (Existenzgarantie für oben / unten / links / rechts). Eine zusätzliche Runde von Zahlen bedeutet+2
in der Höhe und+2
in der Breite des zweidimensionalen Arrays.Wenn
n
sich also eine Spirale mit maximaler Größe von befindet3*3
, dann wird die Spirale erzeugt5*5
.Spiral Größe ist ,
c*c
woc = ceil(sqrt(n)) + k
, wennceil(sqrt(n))
ungerade ist, dannk
2 ist , und wennceil(sqrt(n))
gerade ist, dannk
ist 3.Die obige Formel ergibt beispielsweise Folgendes:
n = 1
dannc = 3
und Spiralgröße wird3*3
n <= 9
dannc = 5
und Spiralgröße wird5*5
n <= 25
dannc = 7
und Spiralgröße wird7*7
n <= 49
dannc = 9
und Spiralgröße wird9*9
Während der Erzeugung der Spirale speichere ich das
x
undy
vonn
und nach der Erzeugung gebe ich die Elemente darüber / darunter / links / rechts davon aus.quelle