Jeśli weźmiemy liczby naturalne i zwiniemy je przeciwnie do ruchu wskazówek zegara w spiralę, otrzymamy następującą nieskończoną spiralę:
....--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
Biorąc pod uwagę pewną liczbę w tej spirali, Twoim zadaniem jest określenie jej sąsiadów - co oznacza element powyżej, po lewej, po prawej i poniżej.
Przykład
Jeśli przyjrzymy się temu 27
, zobaczymy, że ma on następujących sąsiadów:
- powyżej:
28
- lewo:
10
- dobrze:
52
- poniżej:
26
Tak więc wynik będzie: [28,10,52,26]
Zasady
- Wejście będzie liczbą w dowolnym domyślnym formacie We / Wy
- Wyjście będzie listą / macierzą / .. 4 sąsiadów tych liczb w dowolnej (spójnej!) Kolejności
- Możesz pracować ze spiralą, która zaczyna się od 1 zamiast 0, jednak powinieneś to określić w swojej odpowiedzi
Przykłady
Dane wyjściowe są w formacie [above,left,right,below]
i wykorzystują spiralę opartą na 0:
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]
Odpowiedzi:
R , 156 bajtów
Wypróbuj online!
round
i obsługacospi(x)/sinpi(x)
które są bardziej precyzyjne niżcos(x*pi)/sin(x*pi)
w przypadku numerów (pół0.5
,1.5
etc ...)Objaśnienie:
Jeśli spojrzymy na współrzędne macierzy wartości, biorąc pod uwagę pierwszą
0
umieszczoną wartośćx=0, y=0
, są to:Te
x
współrzędne śledzić sekwencję A174344 OEIS z rekurencyjne o wzorze:Ta sama formuła obowiązuje dla
y
współrzędnych macierzy, ale zcos
zamiastsin
i z negacją:Tak więc w R możemy przetłumaczyć wzór na tę funkcję, przyjmując
sinpi/cospi
jako parametr:i generujemy dwa wektory współrzędnych (nie negujemy współrzędnych y, ponieważ otrzymamy ten sam wynik, tylko z odwróconymi sąsiadami góra / dół):
Zauważ, że wygenerowaliśmy
(n+2)^2
współrzędne, które są większe niż minimalne niezbędne współrzędne zawierające zarównon
ich, jak i ich sąsiadów (ściślejsza granica byłaby,(floor(sqrt(n))+2)^2
ale niestety jest mniej „golfowa”).Dlatego teraz, gdy mamy już wszystkie współrzędne, najpierw szukamy współrzędnych
a,b
odpowiadających naszymn
:w końcu wybieramy pozycje ich sąsiadów, tj .:
where x == a and y == b+1 or b-1
where y == b and x == a+1 or a-1
za pomocą :
źródło
Perl 6 ,
9483 bajtów{my \ s = 0, | [+] flat ((1, i ... ) Zxx flat (1..Inf Z 1..Inf)); map {first: k, s [$ _] + $ ^ d, s}, i, -1,1, -i}Wypróbuj online!
s
to leniwa, nieskończona lista współrzędnych spiralnych, reprezentowana jako liczby zespolone. Jest zbudowany z dwóch innych nieskończonych list:1, *i ... *
tworzy listę1, i, -1, -i ...
.1, 1.5 ... *
tworzy listę1, 1.5, 2, 2.5, 3, 3.5 ...
. Skompresowanie tych dwóch list razem z listy replikacji produkuje lista kroków od każdej spirali współrzędnych do drugiego:1, i, -1, -1, -i, -i, 1, 1, 1, i, i, i ...
. (Ułamkowe części argumentów po prawej stronie operatora replikacji listy są odrzucane.) Wykonanie trójkątnej redukcji dodawania ([\+]
) na tej liście (i wklejenie 0 na początku) tworzy listę współrzędnych spiralnych.Wreszcie, zaczynając od liczby zespolonej
s[$_]
($_
jako jedyny argument funkcji), patrzymy w górę indeksy (first :k
) w spirali z liczb zespolonych, które są odsunięte od tego numeru,i
,-1
,1
, i-i
.źródło
Brain-Flak , 238 bajtów
Wypróbuj online!
Wyjście jest w kolejności lewo, góra, prawo, dół.
Wyjaśnienie
źródło
MATL , 15 bajtów
Wejścia i wyjścia są oparte na 1.
Dane wyjściowe podaje lewego, dolnego, górnego i prawego sąsiada w tej kolejności.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe oprócz dwóch ostatnich, które przekroczą limit czasu w TIO.
źródło
1YL
- MATLAB maspiral
funkcję? Kiedy MATLAB zmienił się w Mathematica ?!R , 172 bajty
Wypróbuj online!
To jest R, więc oczywiście odpowiedź ma indeks 0.
Większość pracy polega na tworzeniu matrycy. Kod inspirowany przez: https://rosettacode.org/wiki/Spiral_matrix#R
źródło
JavaScript (ES6), 165 bajtów
Drukuje indeksy za pomocą
alert()
.Wypróbuj online!
W jaki sposób?
(na podstawie tej odpowiedzi z math.stackexchange)
źródło
RangeError: Maximum call stack size exceeded
i błędów w konsoli przeglądarki:InternalError: too much recursion
. czy robię coś źle?Python 2 ,
177164146144 bajtówWypróbuj online!
Oblicza
u,l,r,d
bezpośrednio zn
.źródło
PHP (> = 5,4), 208 bajtów
Aby uruchomić:
Przykład:
Lub wypróbuj online!
Uwagi:
-d error_reporting=0
Opcja nie służy do wyjścia zawiadomień / ostrzeżenia.W jaki sposób?
Generuję spiralę ze zmodyfikowaną wersją tej odpowiedzi w 2-wymiarowej tablicy.
Decyduję o wielkości spirali na podstawie danych wejściowych
n
z formułą, aby zawsze uzyskać dodatkową rundę liczb w spirali (gwarancja istnienia powyżej / poniżej / lewej / prawej). Dodatkowa runda liczb oznacza+2
wysokość i+2
szerokość dwuwymiarowego układu.Jeśli więc
n
zostanie umieszczony w spirali o maksymalnym rozmiarze3*3
, wygenerowana będzie spirala5*5
.Spirala rozmiar jest
c*c
gdziec = ceil(sqrt(n)) + k
, jeśliceil(sqrt(n))
jest nieparzysta, tok
jest 2, a jeśliceil(sqrt(n))
nawet, tok
jest 3.Na przykład powyższa formuła spowoduje:
n = 1
toc = 3
i rozmiar spirali będzie3*3
n <= 9
toc = 5
i rozmiar spirali będzie5*5
n <= 25
toc = 7
i rozmiar spirali będzie7*7
n <= 49
toc = 9
i rozmiar spirali będzie9*9
Podczas generowania spiralę, przechowywać
x
iy
odn
i po pokoleniu, wyjście I elementy powyżej / poniżej / lewo / prawo od niego.źródło