Jaki jest sens?

22

Napisz program lub funkcję, która przyjmuje dwie liczby całkowite reprezentujące współrzędne X i Y punktu na płaszczyźnie kartezjańskiej .

Wejście może się w dowolnym odpowiednim formacie, pod warunkiem, że wartość X jest przed Y. Na przykład 1 -2, (1,-2), [1, -2]albo 1\n-2że wszystkie dobrze dla x = 1, y = -2.

Wydrukuj lub zwróć pojedynczy ciąg znaków (a następnie opcjonalny końcowy znak nowej linii) opisujący położenie punktu w płaszczyźnie:

  • 1jeśli punkt jest w ćwiartce I
  • 2 jeśli punkt znajduje się w ćwiartce II
  • 3 jeśli punkt znajduje się w ćwiartce III
  • 4 jeśli punkt znajduje się w ćwiartce IV
  • Xjeśli punkt znajduje się na osi x (małe litery xnie są dozwolone)
  • Yjeśli punkt znajduje się na osi y (małe litery ynie są dozwolone)
  • O jeśli punkt znajduje się na początku (to wielka litera „oh”, a nie zero)

Najkrótszy kod w bajtach wygrywa. Tiebreaker przechodzi do wyżej głosowanej odpowiedzi.

Przypadki testowe

(1,-2) -> 4
(30,56) -> 1
(-2,1) -> 2
(-89,-729) -> 3
(-89,0) -> X
(0,400) -> Y
(0,0) -> O
(0,1) -> Y
(0,-1) -> Y
(1,0) -> X
(-1,0) -> X
(1,1) -> 1
(1,-1) -> 4
(-1,1) -> 2
(-1,-1) -> 3
Hobby Calvina
źródło
Więc na potrzeby tego wyzwania oś X i Y nie są w kwadrancie?
Rɪᴋᴇʀ
@RikerW Right. W przeciwnym razie punkt (0, 9) można by nazwać ćwiartką I lub II.
Calvin's Hobbies
Czy liczba zespolona (lub jej ciąg znaków, np. "30+56i") Jest prawidłowym formatem wejściowym?
Level River St
@steveverrill Tak
Calvin's Hobbies
Czy dane wejściowe mogą mieć postać liczby zespolonej? (np. 1+2j)
Digital Trauma

Odpowiedzi:

16

Galaretka, 14 bajtów

Ṡḅ3ị“Y4X13X2YO

Wypróbuj online!

Jak to działa

Ṡḅ3ị“Y4X13X2YO    Main link. Input: [x, y]

Ṡ                 Apply the sign function to both coordinates.
 ḅ3               Convert the resulting pair from base 3 to integer.
                  Because of how base conversion is implemented in Jelly, this maps
                  [a, b] to (3a + b), even if a and b aren't valid ternary digits.
                  Therefore:
                      [0, 1]   ->  1
                      [1, -1]  ->  2
                      [1, 0]   ->  3
                      [1, 1]   ->  4
                      [-1, -1] -> -4
                      [-1, 0]  -> -3
                      [-1, 1]  -> -2
                      [0, -1]  -> -1
                      [0, 0]   ->  0
   ị“Y4X13X2YO    Retrieve the character at that index from the string.
                Indexing is 1-based and modular in Jelly, so 1ị retrieves the
                first character, -1ị the penultimate, and 0ị the last.
Dennis
źródło
6
Dołączanie do galaretki z klubu telefonicznego .
Dennis
3
Aaaaaand Jelly wygrywa po raz kolejny ...
ETHprodukcje
Bardzo dobre podejście!
Luis Mendo
11

Rubin, 35 bajtów

->x,y{%w[OY X14 X23][x<=>0][y<=>0]}

Wykorzystanie <=>operatora „statku kosmicznego” ( ).

x <=> 0 wróci

  • 0 Jeśli x == 0
  • 1 Jeśli x > 0
  • -1 Jeśli x < 0

Stąd,

  • jeśli x == 0wrócimy 'OY'[y<=>0]. To jest

    • Oif y == 0(indeksowanie ciągów w 0)

    • Yif y != 0(jest to prawda, ponieważ jedno 1i drugie -1spowoduje Yindeksowanie tego ciągu, ponieważ -1odnosi się do ostatniego znaku w ciągu, który również zdarza się tak, jak w przypadku indeksu 1)

  • jeśli x > 0wrócimy 'X14'[y<=>0]. Jest tak, Xjeśli y == 0, 1jeśli y > 0i 4jeśli y < 0(patrz wyjaśnienie powyżej).

  • jeśli x < 0wrócimy 'X23'[y<=>0].

Klamka
źródło
6

JavaScript, 44 bajty

(x,y)=>x?y?x>0?y>0?1:4:y>0?2:3:'X':y?'Y':'O'

oddalony
źródło
3
Bolą
1
afaik wolno pisać funkcję anonimową ( s/^f=//)
andlrc
5

ES6, 43 bajty

(x,y)=>"OYYX32X41"[3*!!x+3*(x>0)+!!y+(y>0)]

Cały bajt krótszy niż wszystkie te trójskładniki!

Neil
źródło
3

Japt, 30 22 bajtów

"3Y2XOX4Y1"g4+3*Ug +Vg

Zainspirowany odpowiedzią Jelly @Dennis, zanim dodał wyjaśnienie. Przetestuj online!

Ciekawostka: byłoby o dwa bajty krótsze, gdybym dodał obsługę liczb ujemnych w gfunkcji ciągów.

Kolejna próba, bliższa do galaretki (23 bajty):

"3Y2XOX4Y1"gNmg m+1 ¬n3

Niestety zwiększenie listy kosztuje 4 bajty ...

ETHprodukcje
źródło
2

MATL , 22 bajty

'3X2YOY4X1'iZSQI1h*sQ)

Używa bieżącej wersji (10.2.1) języka / kompilatora.

Wypróbuj online!

Wyjaśnienie

To bezwstydnie zapożycza świetne podejście w odpowiedzi Dennisa .

'3X2YOY4X1'     % literal string. Will be indexed into to produce result
i               % input array of two numbers
ZS              % sign of each number in that array. Gives -1, 0 or 1
Q               % add 1 to produce 0, 1 or 2
I1h             % array [3 1]
*s              % multiply both arrays element-wise and compute sum
Q               % add 1. Gives a value from 1 to 9
)               % index into string. Display
Luis Mendo
źródło
1

Python 2, 75 bajtów

lambda x,y,b=bool:[['OX','YO'][b(y)][b(x)],[[1,2],[4,3]][y<0][x<0]][b(x*y)]

Całkiem proste.

Mego
źródło
1

Mathematica 81 bajtów

Switch[Sign@#,{1,-1},4,{1,1},1,{-1,1},2,{-1,-1},3,{0,0},"O",{_,0},"X",{0,_},"Y"]&

%/@{{1, -2}, {30, 56}, {-2, 1}, {-89, -729}, {-89, -0}, {0, 400}, {0, 0},{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}}

{4, 1, 2, 3, „X”, „Y”, „O”, „Y”, „Y”, „X”, „X”, 1, 4, 2, 3}

DavidC
źródło
1

Retina , 52

Jest to prosta metoda oparta na podstawieniu:

^0 0
O
^0.*
Y
.* 0
X
-.*-.*
3
^-.*
2
.*-.*
4
.* .*
1

Wypróbuj online . Statystam` na początku niektórych linii jest potrzebny tylko do przetestowania wielu danych wejściowych za jednym razem, więc nie są liczone w wyniku.


Wcześniej próbowałem tego bardziej interesującego podejścia , ale jest ono nieco dłuższe (około 65 bez mmodyfikatorów):

[1-9]\d*
1
-1
2
(.) (.)
$1$*3$2$*1
3
111
m`^(.)*$
$#1
T`d`OYYX14X23
  • zamień wszystkie niezerowe liczby na 1 , pozostawiając -znaki na miejscu
  • Zastąpić -1 z2
  • Konwertuj 1. i 2. liczbę unarną za pomocą 3i1 odpowiednio jako jedne cyfry. Skutecznie daje to 2 cyfry bazowe 3, wyrażone w jednostronnie
  • Konwertuj na 3s na111 . Skutecznie daje to pojedynczą liczbę jednoznaczną, która odpowiada każdej z ćwiartek, osi i początku
  • Konwertuj liczbę pojedynczą na jedną cyfrę dziesiętną
  • Transponuj cyfrę dziesiętną na odpowiedni znak wyjściowy.
Cyfrowa trauma
źródło
1
Nie sądzę, aby Xscena potrzebowała, $ponieważ na wejściu nie będzie początkowych zer.
Martin Ender
1
Bardziej interesujące podejście można skrócić do co najmniej 40 bajtów . Teraz przyjrzę się temu jutro.
randomra
Aby uruchomić partię, potrzebujesz drobnych poprawek .
randomra
1

Oktawa, 34 bajty

@(p)['3X2YOY4X1'](sign(p)*[3;1]+5)

Stara sztuczka base-3 polegająca na mnożeniu wektorów (chociaż musiałem dodać 5, aby uwzględnić indeksy tablic 1) plus trochę magii indeksowania Octave.

Dane wejściowe to wektor formularza [1, -2](z przecinkiem lub bez), więc po przypisaniu do zmiennej w:

>> w([1 -2])
ans = 4

Tutaj jest na ideone .

zlewka
źródło
Wygląda na to, że Ideone znów działa. Czy zrobiłeś coś specjalnego, aby z niego skorzystać?
Luis Mendo,
@LuisMendo Ten korzysta z anonimowej funkcji. Nazwane funkcje wciąż są dla mnie błędne. :(
zlewka
Ach, masz rację. Nazwano go funkcjami, które nie działały. Więc wciąż to samo: - /
Luis Mendo
1

Pyth, 24

Zbyt długie, ale być może ciekawe podejście:

?Q?sQ?eQh%/yPQ.n04\X\Y\O

Dane wejściowe należy podać jako liczbę zespoloną, np 1-2j. Zasadniczo zagnieżdżona trójka do testowania:

  • jeśli wejście jest zerowe - wyjście O
  • w przeciwnym razie, jeśli rzeczywista część jest zerowa - wyjście Y
  • w przeciwnym razie, jeśli wyimaginowana część jest równa zero X
  • w przeciwnym razie obliczyć fazę zespoloną, pomnożyć przez 2, podzielić liczbę całkowitą przez π, następnie zmodyfikować i dodać, aby podać odpowiednią liczbę kwadrantową.

Wypróbuj online.

Cyfrowa trauma
źródło
1

Java 8, 64 bajty

to jest wyrażenie lambda dla BiFunction<Integer,Integer,String>.

(x,y)->"OYYX14X23".charAt(3*(x>0?1:x<0?2:0)+(y>0?1:y<0?2:0))+"";

3 bajty można zaoszczędzić, zwracając Characterzamiast zamiast, Stringale nie jestem całkowicie pewien, czy autoboxing będzie dobrze grał z lambda.

Jack Ammo
źródło
1
Och, fajnie, ta odpowiedź przy użyciu Systemu Handicapowego PCCG osiąga lepsze wyniki (1.5598) niż odpowiedź Jelly'ego na Jelly (1.5929).
Draco18s,
to całkiem interesujące. dzięki za zwrócenie na to uwagi
Jack Ammo,
1
Z ciekawości sprawdziłem wartości kilku wpisów w tym wpisie (dla porównania wszystkie wyniki zawierały się między 1,5 a 2).
Draco18s,