Jest to wyzwanie inspirowane rotacją Czebyszewa . Proponuję przyjrzeć się tam odpowiedziom, aby uzyskać inspirację do tego wyzwania.
W punkcie na płaszczyźnie znajduje się unikalny kwadrat (prostokąt o równych bokach), który jest wyśrodkowany na początku i przecina ten punkt ( interaktywne demo ):
Biorąc pod uwagę punkt p i odległość d , zwróć punkt uzyskany przez przesunięcie odległości d od p , przeciwnie do ruchu wskazówek zegara (i zgodnie z ruchem wskazówek zegara dla ujemnego d ), wzdłuż obwodu kwadratu wyśrodkowanego na początku, który przecina p . Twoja odpowiedź musi zawierać co najmniej 4 cyfry dziesiętne.
Przypadki testowe:
(0, 0), 100 -> (0, 0)
(1, 1), 81.42 -> (-0.4200, 1.0000)
(42.234, 234.12), 2303.34 -> (-234.1200, 80.0940)
(-23, -39.234), -234.3 -> (39.2340, -21.8960)
Następujące przypadki testowe pochodzą z oryginalnego wyzwania Martina Endera i wszystkie mają wartość d = 1 :
(0, 0) -> (0, 0)
(1, 0) -> (1, 1)
(1, 1) -> (0, 1)
(0, 1) -> (-1, 1)
(-1, 1) -> (-1, 0)
(-1, 0) -> (-1, -1)
(-1, -1) -> (0, -1)
(0, -1) -> (1, -1)
(1, -1) -> (1, 0)
(95, -12) -> (95, -11)
(127, 127) -> (126, 127)
(-2, 101) -> (-3, 101)
(-65, 65) -> (-65, 64)
(-127, 42) -> (-127, 41)
(-9, -9) -> (-8, -9)
(126, -127) -> (127, -127)
(105, -105) -> (105, -104)
Odpowiedzi:
Python 2,
363335296266262258256233 bajtówWoo, 130 bajtów utraconych! Dzięki Neil za uratowanie 4 bajtów, Nathan Merrill za uratowanie 2 bajtów i xnor za uratowanie śmiesznych 23 bajtów!
Ogólna idea jest następująca: możemy zmniejszyć przebytą odległość, przyjmując jej moduł względem obwodu kwadratu. Obwód jest definiowany jako 8-krotność największej z dwóch współrzędnych, ponieważ punkt musi na nim spoczywać. Następnie, po przyjęciu modułu, gwarantujemy, że nie zachodzą na siebie. Gwarantuje to również, że zawsze musimy poruszać się w kierunku przeciwnym do ruchu wskazówek zegara, ponieważ moduł daje pozytywny wynik.
Stamtąd używam po prostu tego, co wiemy z podanych współrzędnych xiy, aby dowiedzieć się, gdzie jesteśmy: góra, dół, lewo, prawo lub w rogu i określić kierunek, który może być jednym z
0, 1, 2, 3
:Po tym jest to tak proste, jak zapętlanie, gdy jeszcze mamy odległość do przebycia, i na podstawie kierunku, który odejmujemy lub dodajemy do odpowiedniej współrzędnej, i mówimy pętli, w którym kierunku idziemy dalej.
Chociaż dość długo, z pewnością działa. Oto kilka przykładowych operacji wejścia / wyjścia:
Wypróbuj online lub uruchom testy .
źródło
s=max(x,y,-x,-y)
działa(s>0)*(d>0)
jests>0<d
. Dane wyjściowe mogą być"%.4f "*2%tuple(p)
.if s:d=d%(8*s)
może byćd%(s*8or 1)
.(r+1)
może być~-r
.1*(x>-s)
może po prostu być(x>-s)
.abs(y)==abs(x)
może byćy*y==x*x
(x>-s)
nie wymagały nawiasów ani~-r
dekretu, więc użyłem-~r
.JavaScript (ES6), 147 bajtów
Objaśnienie: Działa, próbując dodać wektor kierunku, trzymając się w granicach kwadratu. Każde przekroczenie jest rekurencyjnie cofane z kierunkiem obróconym w kierunku przeciwnym do ruchu wskazówek zegara o 90 °. Kierunek jest faktycznie kodowany za pomocą flagi pionowej
v
i jednostki,w
tak że wektory (1, 0), (0, 1), (-1, 0) i (0, -1) są kodowane zv
0, 1, 0 , 1 iw
odpowiednio 1, 1, -1, -1. Wektor kierunku może początkowo nie wskazywać odpowiedniego kierunku, ale nigdy nie jest skierowany do tyłu, więc ostatecznie obróci się w użytecznym kierunku.źródło
f(42.234, 234.12, 2303.34) -> [-234.12, 80.09399999999988]
co oznacza, że nie ma 4-cyfrowej precyzji. Może dodanie formatowania wyjściowego to naprawi? Dobra odpowiedź! :)