¿Cuál es el punto de?


22

Escriba un programa o función que tome dos enteros que representen las coordenadas X e Y de un punto en un plano cartesiano .

La entrada puede venir en cualquier formato razonable, siempre que el valor X viene antes de la Y. Por ejemplo, 1 -2, (1,-2), [1, -2], o 1\n-2todos serían bien para X = 1, Y = -2.

Imprima o devuelva una cadena de un solo carácter (seguida de una nueva línea final opcional) que describa la ubicación del punto en el plano:

  • 1si el punto está en el cuadrante I
  • 2 si el punto está en el cuadrante II
  • 3 si el punto está en el cuadrante III
  • 4 si el punto está en el cuadrante IV
  • Xsi el punto está en el eje x ( xno se permiten minúsculas )
  • Ysi el punto está en el eje y ( yno se permiten minúsculas )
  • O si el punto está en el origen (es una letra mayúscula "oh", no cero)

El código más corto en bytes gana. Tiebreaker va a la respuesta más votada.

Casos de prueba

(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

Entonces, para los propósitos de este desafío, ¿los ejes X e Y no están en cuadrante?
Rɪᴋᴇʀ

@RikerW Derecha. De lo contrario, se podría decir que el punto (0, 9) es el cuadrante I o II.
Calvin's Hobbies

¿Es un número complejo (o una representación de cadena del mismo, como "30+56i") un formato de entrada válido?
Level River St el

@steveverrill Sí
Hobbies de Calvin

¿La entrada puede tener la forma de un número complejo? (p 1+2j. ej. )
Trauma digital

Respuestas:


16

Jalea, 14 bytes

Ṡḅ3ị“Y4X13X2YO

Pruébalo en línea!

Cómo funciona

Ṡḅ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.

66
Unirse a la gelatina del club telefónico .
Dennis

3
Aaaaa y Jelly gana una vez más ...
ETHproductions

Muy buen enfoque!
Luis Mendo

11

Ruby, 35 bytes

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

Aprovechando el <=>operador "nave espacial" ( ).

x <=> 0 volverá

  • 0 Si x == 0
  • 1 Si x > 0
  • -1 Si x < 0

Por lo tanto,

  • Si x == 0volvemos 'OY'[y<=>0]. Esto es

    • Oif y == 0(cadena de indexación en 0)

    • Yif y != 0(esto es cierto porque ambos 1y -1resultarán en la Yindexación en esta cadena, ya que se -1refiere al último carácter de la cadena, que también es el índice 1)

  • Si x > 0volvemos 'X14'[y<=>0]. Esto es Xif y == 0, 1if y > 0y 4if y < 0(ver explicación más arriba).

  • Si x < 0volvemos 'X23'[y<=>0].


6

JavaScript, 44 bytes

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


3
Me duelen los ojos, esa es una larga cadena de operadores ternarios
andlrc

1
afaik está permitido escribir una función anónima ( s/^f=//)
andlrc

5

ES6, 43 bytes

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

¡Un byte completo más corto que todos esos ternarios!


3

Japt, 30 22 bytes

"3Y2XOX4Y1"g4+3*Ug +Vg

Inspirado por la respuesta de @Dennis 'Jelly antes de agregar una explicación. ¡Pruébelo en línea!

Dato curioso: esto sería dos bytes más corto si hubiera agregado soporte para números negativos en la gfunción para cadenas.

Otro intento, más cercano al Jelly (23 bytes):

"3Y2XOX4Y1"gNmg m+1 ¬n3

Lamentablemente, incrementar una lista cuesta 4 bytes ...


2

MATL , 22 bytes

'3X2YOY4X1'iZSQI1h*sQ)

Esto usa la versión actual (10.2.1) del lenguaje / compilador.

Pruébalo en línea!

Explicación

Esto toma descaradamente el gran enfoque en la respuesta de Dennis .

'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


1

Python 2, 75 bytes

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

Muy claro.


1

Mathematica 81 bytes

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}


1

Retina , 52

Este es un método simple basado en la sustitución:

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

Pruébalo en línea . El extra m`al comienzo de algunas líneas solo es necesario para probar múltiples entradas de una vez, por lo que no se cuentan en la puntuación.


Anteriormente probé este enfoque más interesante , pero es bastante más largo (alrededor de 65 sin los mmodificadores):

[1-9]\d*
1
-1
2
(.) (.)
$1$*3$2$*1
3
111
m`^(.)*$
$#1
T`d`OYYX14X23
  • sustituya todos los números que no sean cero por 1, dejando -signos en su lugar
  • Sustituir -1con2
  • Convierta los números primero y segundo unarios con 3y 1respectivamente como dígitos unarios. Esto efectivamente da 2 dígitos base3, expresados ​​en unario
  • Convierte a 3s a 111. Esto efectivamente le da al único número unario que corresponde a cada uno de los cuadrantes, ejes y origen
  • Convertir el unario a un dígito decimal
  • Transponga el dígito decimal al carácter de salida apropiado.

1
No creo que la Xetapa necesite, $ya que no habrá ceros a la izquierda en la entrada.
Martin Ender

1
El enfoque más interesante se puede acortar a al menos 40 bytes . Ahora lo miraré mañana un poco más.
randomra

Para la ejecución por lotes, necesita algunos ajustes .
randomra

1

Octava, 34 bytes

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

El viejo truco de base-3 a través de la multiplicación de vectores (aunque tuve que agregar 5 para tener en cuenta los índices de matriz basados ​​en 1) más un poco de magia de indexación de octava.

La entrada es un vector de la forma [1, -2](con o sin la coma), por lo que cuando se asigna a una variable w:

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

Aquí está en ideone .


Ideone parece estar trabajando de nuevo. ¿Hiciste algo especial para usarlo?
Luis Mendo

@LuisMendo Éste usa una función anónima. Las funciones con nombre todavía me molestan. :(
vaso de precipitados

Aah, tienes razón. Fue nombrado funciones que no estaban funcionando. Así que sigue igual: - /
Luis Mendo

1

Pyth, 24

Demasiado largo, pero quizás un enfoque interesante:

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

La entrada debe especificarse como un número complejo, por ejemplo 1-2j. Básicamente un ternario anidado para probar:

  • si la entrada es cero - salida O
  • más si la parte real es cero - salida Y
  • más si la parte imaginaria es cero - salida X
  • de lo contrario, calcule la fase compleja, multiplique por 2, divida el número entero por π, luego modifique y sume para obtener el número de cuadrante apropiado.

Pruébalo en línea.


1

Java 8, 64 bytes

Esta es una expresión lambda para a BiFunction<Integer,Integer,String>.

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

Se pueden guardar 3 bytes devolviendo un en Characterlugar de un Stringpero no estoy completamente seguro de si el autoboxing jugará bien con el lambda.


1
Genial, esta respuesta usando el Sistema de Discapacidad PCCG tiene mejores puntuaciones (1.5598) que la respuesta de Dennis's Jelly (1.5929).
Draco18s

Eso es bastante interesante. gracias por señalar eso
Jack Ammo

1
Corrió los valores para algunas entradas en este por curiosidad (todas las puntuaciones estaban entre 1.5 y 2, como referencia).
Draco18s
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.