Wprowadzenie
Zainspirowany najnowszym filmem The Trapped Knight - Numberphile , podjąłem wyzwanie.
Uwięziony sekwencja Knight jest skończoną liczbą całkowitą sekwencję o długości 2016, począwszy od dnia 1 i składa się z następujących zasad konstrukcyjnych:
- Napisz spiralę liczbową w następujący sposób:
17 16 15 14 13 ...
18 5 4 3 12 ...
19 6 1 2 11 ...
20 7 8 9 10 ...
21 22 23 24 25 ...
- Umieść rycerza na 1.
- Przenieś rycerza na planszę z najmniejszą możliwą liczbą, która nie była wcześniej odwiedzana, zgodnie z zasadami szachów (tj. 2 jednostki w pionie i 1 jednostka w poziomie lub odwrotnie).
- Powtarzaj, aż rycerz utknie.
Oto trzy pierwsze kroki:
Krok 1
17 [16] 15 [14] 13
[18] 5 4 3 [12]
19 6 < 1> 2 11
[20] 7 8 9 [10]
21 [22] 23 [24] 25
Możliwe ruchy to 10, 12, 14, 16, 18, 20, 22, 24, wśród których najmniejszy to 10, więc drugi człon to 10.
Krok 2
4 [ 3] 12 [29] 54
( 1) 2 11 28 [53]
8 9 <10> 27 52
[23] 24 25 26 [51]
46 [47] 48 [49] 50
Możliwe ruchy to 1 , 3, 23, 29, 47, 49, 51, 53, z których najmniejszy to 3, więc trzeci semestr to 3.
Krok 3
35 [34] 33 [32] 31
[16] 15 14 13 [30]
5 4 < 3> 12 29
[ 6] ( 1) 2 11 [28]
7 [ 8] 9 (10) 27
Możliwe ruchy to 6, 8, 10 , 16, 28, 30, 32, 34, wśród których najmniejszy to 6, więc czwarty człon to 6.
Sekwencja zawiera:
1 10 3 6 9 4 7 2 5 8 11 14 ...
i kończy się na
... 2099 2284 2477 2096 2281 2474 2675 2884 3101 2880 2467 2084
Wyzwanie
Napisz najkrótszy program lub funkcję, przyjmując jako liczbę całkowitą z zakresu [1, 2016]
(lub [0, 2015]
jeśli zastosowano indeksowanie 0), wypisz liczbę o tym indeksie w sekwencji rycerza w pułapce. Możesz wybrać indeksowanie sekwencji za pomocą indeksowania 0 lub indeksowania 1, ale musisz określić, którego schematu indeksowania używasz.
Przypadki testowe (indeksowane 1)
n | s(n)
-----+-----
1 | 1
2 | 10
3 | 3
6 | 4
11 | 11
21 | 23
51 | 95
101 | 65
201 | 235
501 | 761
1001 | 1069
2001 | 1925
2016 | 2084
Wszystkie możliwe dane wyjściowe znajdują się na tej stronie .
Zwycięskie kryteria
Wygrywa najkrótszy kod każdego języka. Obowiązują ograniczenia dotyczące standardowych luk.
12851850258
Odpowiedzi:
JavaScript (ES7),
182181 bajtówWypróbuj online!
W jaki sposób?
Nieco zmodyfikowana wersja mojej odpowiedzi na The Path Of The Wildebeest jest zdecydowanie krótsza (i szybsza) niż to. Ale chciałem spróbować innego podejścia. Nawiasem mówiąc, myślę, że może być łatwiej zaimplementować tę metodę w niektórych esolangach.
Algorytm:
Szukamy pierwszego kwadratu takiego, że:(X,Y)
gdzie są bieżącymi współrzędnymi rycerza.(x,y)
Powyższy warunek jest spełniony tylko wtedy, gdy i lub i , który obejmuje wszystkie możliwe ruchy rycerza.|x−X|=1 |y−Y|=2 |x−X|=2 |y−Y|=1
Ustawiamy i unieważniamy pozycję na liście, aby nie została wybrana po raz drugi.(x,y)=(X,Y)
Albo uruchamiamy ponownie w kroku 2, albo zwracamy ostatni znaleziony indeks, jeśli skończyliśmy.
Node.js , 155 bajtów
Wypróbuj online!
źródło
05AB1E , 53 bajty
Dokładny port mojej odpowiedzi 05AB1E dla wyzwania Ścieżka GNU , z wyjątkiemn+1
3
zastąpionego przez a2
iθ
dodaje się trailing w celu uzyskania wartości indeksowanej 0 zamiast całej sekwencji pierwszych elementów.Wypróbuj online lub zweryfikuj więcej przypadków testowych (przekroczone limity czasu dla największych przypadków testowych).
Wyjaśnienie:
Patrz wyjaśnienia w moim połączonej ścieżce Gnu odpowiedź . Jedyne zmodyfikowane części to:
i końcowe:
EDYCJA: Port podejścia @Arnauld w jego odpowiedzi na JavaScript (ES7) to (obecnie):
05AB1E ,
5756 bajtówWypróbuj online lub zweryfikuj więcej przypadków testowych (przekroczone limity czasu dla największych przypadków testowych).
Wyjaśnienie:
Część sortującax,y
Σ·nàDtyÆ+yO·<.±*->}
została skopiowana z mojej drugiej odpowiedzi. Można to jednak najprawdopodobniej pograć w golfa, ponieważ nie potrzebujemy wartości spirali, a jedynie musimy posortować współrzędne .źródło
MATL ,
4137 bajtówDane wejściowe są oparte na 0.
Wypróbuj online!
źródło