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)
Fruta Esolanging
fuente
1
Deberían enseñar la táctica que todos tomamos prestada de Leaky Nun en la escuela, si fuera necesario.
mbomb007

Respuestas:

22

Python 3 , 24 bytes

lambda a:3<<a.count(0)&3

Pruébalo en línea!

Monja permeable
fuente
3
... Guau. Esto es más trivial de lo que pensaba.
Esolanging Fruit
Tal vez podría usar una cadena en lugar de una lista si la E / S lo permite.
Jonathan Frech
¿Sería '320'[a.count(0)]aceptable usar y devolver el valor en forma de cadena?
FlipTack
2
Y wow, parece que todas las respuestas ahora estarán "basadas en Leaky's"
FlipTack
3
@FlipTack bithacks gana: P
Leaky Nun
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!

caird coinheringaahing
fuente
ċ0ị2,0,3ahorra un byte
Esolanging Fruit
@ Challenger5 Huh, así es. ¡Gracias!
caird coinheringaahing
1
7 bytes
Leaky Nun
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]
Steven H.
fuente
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);
}
Marcos
fuente
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
2

Retina , 13 bytes

M`\b0
T`d`320

Pruébalo en línea

También basado en la respuesta de Leaky Nun .

mbomb007
fuente
Esto no funciona si la entrada contiene, 10por ejemplo. La primera expresión regular debería ser \b0.
Martin Ender
1

JavaScript, 25 bytes

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

Basado en la respuesta de Leaky Nun.

ericw31415
fuente
1

Perl 6, 18 bytes

{3+<@_.grep(0)+&3}
bb94
fuente
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.
Steven H.
fuente
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]
caird coinheringaahing
fuente
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!

caird coinheringaahing
fuente