Cuadrantes atravesados ​​por una línea


15

Tarea

Dada una representación de una línea, genera el número de cuadrantes por los que pasa esa línea.

Representaciones válidas de una línea

Puedes representar una línea como

  • Tres enteros con signo A, By Clos que no comparten factor común y donde Ay Bno son ambos cero, que representa la línea Ax + By = C,
  • Cuatro enteros con signo , , , y , que representa la línea que pasa a través de los puntos y , oX1Y1X2Y2(X1, Y1)(X2, Y2)
  • Un tipo de datos que describe una línea, si su idioma tiene una (debe admitir líneas verticales).

Es posible que no tomar la entrada en cualquier formato que no permite por una línea vertical (por ejemplo, la forma pendiente-intersección). Si elige tomar enteros como entrada, puede suponer que se encuentran en el rango inclusivo [-127, 128].

Especificaciones

  • La salida siempre será 0, 2 o 3 (una línea nunca puede pasar por los cuatro cuadrantes, ni puede pasar por uno solo).
  • Se considera que una línea en un eje no pasa por ningún cuadrante. Se considera que una línea a través del origen solo pasa a través de 2 cuadrantes.
  • No tiene que devolver qué cuadrantes se están pasando (aunque los casos de prueba los incluyen para mayor claridad).
  • Este es el , por lo que gana la respuesta válida más corta (medida en bytes).

Casos de prueba

Tendrá que convertirlos a un formato adecuado antes de usarlos.

1x + 1y = 1   ->  3  (quadrants I, II, and IV)
-2x + 3y = 1  ->  3  (quadrants I, II, and III)
2x + -3y = 0  ->  2  (quadrants III and I)
1x + 1y = 0   ->  2  (quadrants II and IV)
3x + 0y = 6   ->  2  (quadrants I and IV)
-3x + 0y = 5  ->  2  (quadrants II and III)
0x + -8y = 4  ->  2  (quadrants III and IV)
0x + 1y = 0   ->  0  (lies on the x-axis)
1x + 0y = 0   ->  0  (lies on the y-axis)

1
Deberían enseñar la táctica que todos tomamos prestada de Leaky Nun en la escuela, si fuera necesario.
mbomb007

Respuestas:



3

Jalea , 5 bytes

TL’ȧ$

Pruébalo en línea!

  • -1 byte gracias a Challenger5
  • -1 byte gracias a Leaky Nun
  • -2 bytes gracias a H.PWiz

¡Ya no se basa en la respuesta de Leaky!


ċ0ị2,0,3ahorra un byte
Esolanging Fruit

@ Challenger5 Huh, así es. ¡Gracias!
caird coinheringaahing


1
¿Qué tal TL’ȧ$. No sé Jelly, así que esto podría ser golfable
H.PWiz

@ H.PWiz Muy bien! No creo que se pueda jugar golf, pero puedo estar equivocado.
caird coinheringaahing

3

Javascript (ES6), 30 24 22 bytes

Esta es la primera vez que intento jugar golf en Javascript. Tiene que haber una mejor manera de contar los ceros ...

(a,b,c)=>3<<!a+!b+!c&3

-6 bytes gracias a Herman Lauenstein, -2 bytes para recordar las precedentes del operador.

Solución alternativa de 24 bytes para devolver una cadena en su lugar:

(a,b,c)=>"320"[!a+!b+!c]

1
Eso es bastante inteligente ...
Esolanging Fruit

1
24 bytes al no usar una matriz(a,b,c)=>3<<(!a+!b+!c)&3
Herman L

Parece que no puedo mina de golf no utilizar una matriz más ...
ericw31415



2

GolfScript , 16 14 bytes

~{!!}%{+}*.1>*

Pruébalo en línea!

  • @ Challenger5 -2 bytes

Este programa toma una matriz de 3 enteros que representan los coeficientes en la ecuación Ax + By = C

Ejemplo de entrada / salida

[1 1 1]   -> 3
[-2 3 1]  -> 3

Cómo funciona

~                       - Eval string (input)
  {  }%                 - Map to array
   !!                   - Double not (equivalent to != 0)
        {+}*            - total array (fold addition)
            .           - Duplicate top of stack
             1>         - Greater than 1?
               *        - Multiply     

Al principio fue un poco complicado para mí encontrar una forma matemática de calcular esto. Sin embargo, solo hay 8 configuraciones posibles de modo quea != 0 & b != 0 & c != 0

0 0 0 = 0
a 0 0 = 0
0 b 0 = 0
0 0 c = 0
a 0 c = 2
0 b c = 2
a b 0 = 2
a b c = 3

Finalmente llegué a la siguiente función.

F(a,b,c) {
    var r = sign(a)+sign(b)+sign(c);
    if(r > 1)
        r;
    else
        return 0;
}

y todo se puede condensar en un solo problema matemático

F(a,b,c) {
    return (sign(a)+sign(b)+sign(c)) * (sign(a)+sign(b)+sign(c) > 1);
}

Creo que puedes usar en {!!}%lugar de [{!!}/].
Esolanging Fruit

La traducción de CJam de esta presentación es {:!:!:+_1>*}.
Esolanging Fruit

@ Challenger5 lol, ¿Cómo no me di cuenta de eso? También buen puerto, solo tengo que aprender a leerlo ahora.
Marcos

Las diferencias significativas en este caso son 1) taquigrafía para mapear ( :!es equivalente a {!}%), 2) taquigrafía para reducir ( :+es equivalente a {+}*), 3) que .se cambia a _(porque CJam tiene flotadores) y 4) que CJam no tiene entrada en la pila de forma predeterminada, lo que significa que envuelve el código {}para que sea una función.
Esolanging Fruit


1

JavaScript, 25 bytes

_=>3<<!_[0]+!_[1]+!_[2]&3

Basado en la respuesta de Leaky Nun.




1

ABCR , 30 bytes

La entrada está en la forma A,B,Cen que las comas se pueden reemplazar por cualquier no numérico, sin -caracteres.

BBi7baxci7baxci7bax@7)A7(xxo

Todavía no hay intérprete en línea, pero aquí hay una explicación:

BB                                Add two values to the B queue. (Values are unimportant)
  i7 ax                           Read in a number.  If it's non-zero...
    b                             Dequeue one item from the B queue.
       c                          Read in the delimiter...
        i                         ... And promptly overwrite it with the next number.
         7baxci7bax               Repeat the whole "if 0, dequeue from B" for the
                                     other two input numbers.
                   @              Get the current length of the B queue. [2, 1, or 0]
                    7             If the length isn't 0...
                     )            ... Increment it to our required [3,2,0]
                      A           ... And enqueue it to A.
                                  (We don't need to add to A otherwise, because it defaults
                                    to 0 already if there's no value in it.
                                    I used that to exit the queue with 7_ax earlier.)
                       7(xx       Set the register to 0 to exit from loop.
                           o      Peek A and print as a number.


0

Deorst , 12 bytes

l0EN))A:k?Z+

Pruébalo en línea!

Algo basado en la respuesta de Leaky ; usa la misma premisa, pero un método de mapeo diferente.

Cómo funciona

Deorst tiene un recuento de ocurrencias incorporado, pero no tiene (por alguna razón) un comando de indexación, por lo que tuve que crear la siguiente asignación, donde está el izquierdo a.count(0)y el derecho el resultado deseado

0 -> 3
1 -> 2
2 -> 0

El programa en sí funciona así (ejemplo de entrada de [1,1,1])

l0           - Push 0;     STACK = [[1 1 1] 0]
  EN         - Count;      STACK = [0]
    ))       - Subtract 2; STACK = [-2]
      A      - Absolute;   STACK = [2]
       :     - Duplicate;  STACK = [2 2]
        k?Z  - Positive?;  STACK = [2 1]
           + - Sum;        STACK = [3]

0

Agregar ++ , 23 bytes

D,f,@@@,!$!@!s2$_|d0$>+

Pruébalo en línea!

Basado de tanto mi respuesta Deorst y respuesta del pitón de Leaky

Cómo funciona

D,f,@@@,  - Create a triadic function. 
            Example arguments;   [1 1 1]
        ! - Logical NOT; STACK = [1 1 0]
        $ - Swap;        STACK = [1 0 1]
        ! - Logical NOT; STACK = [1 0 0]
        @ - Reverse;     STACK = [0 0 1]
        ! - Logical NOT; STACK = [0 0 0]
        s - Sum;         STACK = [0]
        2 - Push 2;      STACK = [0 2]
        $ - Swap;        STACK = [2 0]
        _ - Subtract;    STACK = [-2]
        | - Absolute;    STACK = [2]
        d - Duplicate;   STACK = [2 2]
        0 - Push 0;      STACK = [2 2 0]
        $ - Swap;        STACK = [2 0 2]
        > - Greater to;  STACK = [2 1]
        + - Sum;         STACK = [3]

Sin embargo, creo que he estado usando demasiado las funciones en Add ++, en lugar del cuerpo del código principal. Así que intenté hacer esto usando ambas funciones y el cuerpo del código, y resultó en una pieza de 50 bytes mucho más agradable (sí, esa es la respuesta más larga aquí):

# Example input: 1 1 1;
# x and y are the accumulators

D,f,@@@,!$!@!s # Count the 0s
$f>?>?>?       # Call f with the input.
-2   # Subtract 2;    x: -2;  y: 0
^2   # Square;        x: 4;   y: 0
S    # Square root;   x: 2.0; y: 0
\1   # To integer;    x: 2;   y: 0
y:x  # Assign x to y; x: 2;   y: 2
}    # Switch to y;   x: 2;   y: 2
>0   # Is positive?;  x: 2;   y: 1
}    # Switch to x;   x: 2;   y: 1
+y   # Add y to x;    x: 3;   y: 1
O    # Print x

Pruébalo en línea!

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.