Rozważ zwykłą siatkę, w której każda komórka ma współrzędne całkowite. Możemy pogrupować komórki w (kwadratowe) „pierścienie”, w których komórki w każdym pierścieniu mają tę samą odległość Czebyszewa (lub odległość szachownicy) od początku. Twoim zadaniem jest przyjęcie takiej współrzędnej komórki i obrócenie tej komórki o jedną pozycję przeciwnie do ruchu wskazówek zegara w obrębie jej pierścienia. To implementuje następujące mapowanie:
Na przykład, jeśli dane wejściowe to (3, -2)
powinieneś wyjść (3, -1)
. Zauważ, że (0, 0)
to jedyne wejście, które powinno być odwzorowane na siebie.
Zasady
Format we / wy jest dość elastyczny. Możesz użyć dwóch pojedynczych liczb, pary / listy / tablicy / krotki liczb, pojedynczej liczby zespolonej, ciągu zawierającego dwie liczby itp.
Możesz to założyć -128 < x,y < 128
.
Możesz napisać program lub funkcję i użyć dowolnej z naszych standardowych metod otrzymywania danych wejściowych i dostarczania danych wyjściowych.
Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.
To jest golf golfowy , więc wygrywa najkrótsza ważna odpowiedź - mierzona w bajtach .
Przypadki testowe
(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:
JavaScript (ES6),
6059 bajtówPobiera dane wejściowe ze składnią curry
(x)(y)
i zwraca tablicę[new_x, new_y]
.Jak to działa
Naszym głównym zadaniem jest określenie, w której kwadrancie jesteśmy, abyśmy wiedzieli, w którym kierunku się poruszać.
Możemy użyć tej formuły jako pierwszego przybliżenia:
Oto, co otrzymujemy:
Prawie na miejscu. Ale dolne lewe i prawe dolne rogi pierścieni są nieprawidłowe. Musimy przesunąć dolną połowę macierzy o jedną pozycję w lewo, dlatego definiujemy
z
jako:I zamieniamy
x
zz
naszego wzoru:Który prowadzi do:
Cała macierz jest teraz poprawna, z wyjątkiem specjalnego przypadku
[0, 0]
(brak ruchu), który należy rozwiązać osobno.Przypadki testowe
Pokaż fragment kodu
źródło
Galaretka ,
201412 bajtówDane wejściowe i wyjściowe mają postać tablic. Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
tło
Aby dowiedzieć się, w którym kierunku musimy się poruszać, możemy zaobserwować względne położenie punktu początkowego do dwusiecznych kwadrantu x + y = 0 (niebieski) i x - y = 0 (czerwony).
Pochodzenie jest ustalone. Przechodzimy dalej, dodając [0, 0] do punktu początkowego.
Punkty w najwyższym trójkącie - w tym bisektor pierwszej ćwiartki - mają sumę dodatnią i nieujemną deltę ( y - x ). Przechodzimy dalej, dodając [-1, 0] do punktu początkowego.
Punkty w lewym trójkącie - w tym dwusieczna drugiej ćwiartki - mają nie dodatnią sumę i dodatnią deltę. Przechodzimy dalej, dodając [0, -1] do punktu początkowego.
Punkty w najniższym trójkącie - w tym dwusieczna trzeciego kwadrantu - mają sumę ujemną i różnicę dodatnią. Przechodzimy dalej, dodając [1, 0] do punktu początkowego.
Punkty w prawym trójkącie - w tym dwusieczna czwartej ćwiartki - mają sumę nieujemną i deltę ujemną. Przechodzimy dalej, dodając [0, 1] do punktu początkowego.
Aby ustalić właściwy kierunek, obliczamy [-sign (x + y), -sign (y - x)] , który ma tylko dziewięć możliwych wyników.
Poniższa tabela ilustruje, które wyniki muszą zostać zmapowane do jakich kierunków.
To pozostawia trzy przypadki.
Jeśli co najmniej jeden ze znaków to 0 , [Δx, yy] = [-sign (x + y), -sign (yx)] .
Jeśli znaki są równe i niezerowe, [Δx, yy] = [-sign (x + y), 0] .
Jeśli znaki są różne i niezerowe, [Δx, yy] = [0, -sign (yx)] .
Jak to działa
źródło
Pyth , 19 bajtów
Wypróbuj online!
Tłumaczenie mojej odpowiedzi Julii :
źródło
Python, 55 bajtów
Wykrywa cztery kwadraty ukośne i przesuwa odpowiednią współrzędną.
źródło
Haskell,
777169 bajtówSprawdza to po prostu każdą z tych nachylonych ćwiartek i odpowiednio modyfikuje dane wejściowe. Zauważ, że spacje są konieczne, w przeciwnym razie np.
>-
Będzie rozumiany jako operator (który nie jest zdefiniowany).Dziękuję @nimi za usunięcie kilku kolejnych bajtów!
źródło
,
zamiast w&&
obrębie pierwszego strażnika zapisuje bajt. Następnie możesz przełączyć drugie porównanie-x<y
na inny bajt.,
!Ruby, 68
Funkcja Lambda przyjmuje jako argument liczbę zespoloną, zwraca liczbę zespoloną.
Obracamy punkt o 90 stopni 4 razy, mnożąc przez
i
. W związku z tym przechodzi przez wszystkie 4 ćwiartki i zostanie zwrócony w niezmienionej formie - z wyjątkiem tego, że modyfikujemy go, gdy znajduje się w jednym z nich. Fakt, że zawsze jest modyfikowany w tej samej ćwiartce, upraszcza modyfikację.Najłatwiej jest naśladować, jeśli zmienimy go,
z
gdy znajduje się on w prawej ćwiartce. w tym przypadku musimy zwiększyć współrzędną y o 1 (tj. dodaći
doz
.)Sprawdzamy
x.abs>=y.abs
, porównując kwadratyx
iy
. To mówi nam, że punkt znajduje się w prawej lub lewej ćwiartce, a nie u góry lub u dołu. Aby sprawdzić to w rzeczywistości w kwadrancie stroną możemy dodatkowo sprawdzić, żex>y
(ściśle większa, ponieważ chcemy, aby wykluczyć przypadek,x=y
który należy do „top” ćwiartce.) Jeżeli to prawda dodamyi
doz
.Z powodów golfowych dodawanie
i
nie jest pożądane. Zamiast tego modyfikujemy liczbę, gdy znajduje się ona w dolnej ćwiartce, w którym to przypadku musimy dodać 1 dox
współrzędnej (dodać 1 doz
.) W tym przypadku testujemy,y*y>=x*x
aby sprawdzić, czy jest ona w górnej lub dolnej ćwiartce. Aby dodatkowo upewnić się, że znajduje się w dolnej ćwiartce, musimy to sprawdzićy<-x
(ściśle wykluczając przypadek prawego dolnego rogu, gdziey=-x
.)Zaletą tego sprawdzenia jest to, że nie ma specjalnego przypadku dla współrzędnej 0,0. Niestety stwierdzono, że przesunięcie punktu może przesunąć go do innej ćwiartki, a to oznacza, że drugi ruch musi zostać stłumiony, jeśli ćwiartka zostanie ponownie sprawdzona, co prawdopodobnie neguje przewagę.
Przykład 1
Przykład 2
W programie testowym
Diagram
Poniższy obraz pokazuje (niebieski) obszar, w którym
x*x>=y*y
(żółty) obszar, w którymy<-x
i (zielony) ich przecięcie, czyli region, w którym poprawna transformacja jest dodaniem 1 doz
.źródło
Python, 52 bajty
Złożone dane wejściowe i wyjściowe. Aby przetestować punkt znajdujący się w dolnej ćwiartce przekątnej, najpierw obróć go o 135 w kierunku przeciwnym do ruchu wskazówek zegara, aby przesunąć tę ćwiartkę do standardowej ćwiartki (x> 0, y> 0) i sprawdź, czy wynik nie zawiera symbolu minus w reprezentacji ciągu. Odejmowanie 1 najpierw zajmuje warunek brzegowy.
Jeśli nie ma go w tej ćwiartce, obróć cały problem o 90 stopni. Wejście to zero jest specjalnie obsługiwane do samego wyjścia.
Inne próby z liczbami zespolonymi:
źródło
Mathematica, 34 bajty
Definiuje to jednoargumentowy operator,
±
który pobiera i zwraca liczbę zespoloną, której elementy reprezentująx
iy
.Teraz, gdy Lynn ujawniła złożone rozwiązanie liczbowe, a Dennis pobił mój wynik, nie czuję się tak źle, publikując moją implementację z golfem. :) (Okazuje się, że jest praktycznie identyczna z odpowiedzią Lynn.)
źródło
MATL ,
1917 bajtówWykorzystuje to liczby zespolone jako dane wejściowe i wyjściowe.
Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie
Weźmy
-127+42j
za przykład przykład.źródło
Rubinowy, 51 bajtów
Oryginalna forma
Alternatywna forma dla komentarza Xnora
Używa tego samego rodzaju nierówności, co moja inna odpowiedź, ale w inny sposób.
W programie testowym
źródło
d
zlecenie jest tego warte? Wygląda na to, że możesz po prostu porównaćx*x>y*y
.y*y
a?
więc ma dokładnie taką samą długość. Uwzględniłem to, ponieważ myślę, że twoja droga jest pod pewnymi względami ładniejsza. Myślę, że Ruby próbujey?
podać to jako nazwę funkcji prawnej.Julia,
3834 bajtówDennis zapisał cztery bajty. Dzięki!
Wypróbuj online!
źródło
int(2angle(z)/pi+5)
tej samej liczby bajtów (moce ujemne powodują błąd z jakiegokolwiek powodu).!z=z+(z!=0)im^...
we wszystkich wersjach.C ++, 94 bajty
Nie golfowany:
Stosowanie:
Wypróbuj online
źródło
(x>0?x:-(x))
może być(x>0?x:-x)
.R,
131110 bajtówFunkcja, która przyjmuje dwie liczby całkowite
x,y
jako dane wejściowe i zapisuje dane wyjściowe na standardowe wyjście. Rozwiązanie jest zgodne ze schematem kontroli @Dennis, ale prawdopodobnie można je zastosować w golfa.EDYCJA: Zaktualizowałem kod na podstawie sugestii @ JDL i zapisałem kilka bajtów.
Bez golfa
źródło
as.logical(-1)
jestTRUE
,X==0|Y==0
może się stać!X|!Y
, a stanif(X!=Y...)
może się staćif(X-Y)
. Ponadto, jeśliX==Y
iX!=0
wtedyY!=0
jest zbędny. W rzeczywistości wszystkie!=0
części są zbędne;if(X!=0)
jest równoważne zif(X)
.c(x,y)
zamiastcat(x,y)
.JavaScript (ES6), 57 bajtów (55–63 †)
Akceptuje tablicę [x, y], modyfikuje ją w miejscu i zwraca.
Jak to działa
Jest to jednoparametrowa funkcja strzałki z
return
zwięzłym korpusem.Parametr jest natychmiast rozkładany na zmienne
x
iy
.Operator przecinka łączy wiele wyrażeń w jedno, wykorzystując wynik ostatniego.
i
służy do rozróżniania przypadków inkrementacji i dekrementacji. Kiedyx
jest większa niży
, znajdujemy się w dolnej lub prawej ćwiartce i musimy iść do przodu w jednym wymiarze (i=1
poprzez wymuszenie wartości logicznej na liczbę). Podobnie, gdy znajdujemy się w ujemnej części dzielącej x = y przekątnej. We wszystkich innych przypadkach - łącznie z miejscem pochodzenia - nie jest wymagany przyrost (i=0
).Używamy nieco podobnego wyrażenia do kontrolowania, który indeks tablicy należy dostosować. Kiedy zwiększamy, a nie w lewym lub dolnym kwadrancie (lub gdy nie zwiększamy, w lewym lub dolnym), bitowy XOR wygeneruje
1
i dostosujemy wartość y . Podobnie, gdy jesteśmy na dzielącej przekątnej x = -y (włączając początek). We wszystkich innych przypadkach indeks będzie wynosił0
( x ).Kiedy
i
jest1
, dodamy go do określonej wartości. Kiedyi
jest0
, odejmujemy 1 od wartości wtedy i tylko wtedy , gdy nie jesteśmy u źródła. Ta ostatnia jest wykrywana przezx|y
uzyskanie wartości niezerowej, przyciętej do {0, 1} przez boolean przymus, a negacjai
pozwala nam użyć bitowego OR zamiast logicznego (ponieważ-1
nie ma zerowych bitów, jest bezpieczny od modyfikacji).Tablica jest ostatnia, więc zostanie zwrócona.
Testowanie
Pokaż fragment kodu
† Wariacje
Możemy zapisać dwa kolejne bajty, pomijając znaczącą wartość zwracaną i używając tylko mutacji wejściowej:
… Lub możemy pominąć mutację wejściową i uczynić wszystkie zmienne lokalnymi dla czystej funkcji, kosztem sześciu bajtów:
źródło
JavaScript (ES6),
8076 bajtówźródło
Haskell, 53 bajty
Pobiera dwie liczby, tworzy krotkę. Jeśli punkt znajduje się we wschodniej części
-x<=y<x
, zwiększ drugą współrzędną o 1. W przeciwnym razie przełóż kwadraty, obracając punkt wejściowy o 90 stopni, wywołując na nim funkcję, a następnie obracając do tyłu.źródło
Rakieta 191 bajtów
Niegolfowany (bezpośrednio tłumacząc kierunki rysunku na kod bez użycia pośredniej formuły):
Testowanie:
Wydajność:
źródło
Właściwie 16 bajtów
Pobiera to liczbę zespoloną jako dane wejściowe i zwraca inną liczbę zespoloną. Zapraszamy do gry w golfa! Wypróbuj online!
Ungolfing
źródło
Scala, 184 bajty
Nie golfowany:
Wyjaśnienie:
źródło