Quadrantes passados ​​por uma linha

15

Tarefa

Dada a representação de uma linha, produza o número de quadrantes pelos quais essa linha passa.

Representações válidas de uma linha

Você pode representar uma linha como

  • Três inteiros assinados A, Be Cque compartilham fator não comum e onde AeB não são ambos zero, o que representa a linha Ax + By = C,
  • Quatro inteiros assinados , , , e , representando a linha passando pelos pontos eX1Y1X2Y2(X1, Y1)(X2, Y2) , ou
  • Um tipo de dados que descreve uma linha, se o seu idioma tiver um (ele deve suportar linhas verticais).

Você não pode receber entradas em nenhum formato que não permita uma linha vertical (por exemplo, formulário de interceptação de declive). Se você optar por usar números inteiros como entrada, poderá assumir que eles estão no intervalo inclusivo [-127, 128].

Especificações

  • A saída será sempre 0, 2 ou 3 (uma linha nunca pode passar pelos quatro quadrantes, nem apenas um).
  • Considera-se que uma linha em um eixo não passa por nenhum quadrante. Considera-se que uma linha através da origem passa apenas por 2 quadrantes.
  • Você não precisa retornar pelos quadrantes que estão passando (embora os casos de teste os incluam para maior clareza).
  • Isso é , então a resposta mais curta e válida (medida em bytes) vence.

Casos de teste

Você precisará convertê-los para um formato adequado antes de usá-los.

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)
Esolanging Fruit
fonte
1
Eles deveriam ensinar a tática que todos emprestamos da Leaky Nun na escola, se houvesse necessidade.
mbomb007

Respostas:

22

Python 3 , 24 bytes

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

Experimente online!

Freira Furada
fonte
3
... Uau. Isso é mais trivial do que eu pensava.
Esolanging Fruit
Talvez você possa usar uma cadeia de caracteres em vez de uma lista, se a E / S permitir.
precisa
Usar '320'[a.count(0)]e retornar o valor em forma de string seria aceitável?
FlipTack
2
E uau, parece que todas as respostas serão agora "baseado fora Leaky da"
FlipTack
3
@FlipTack bithacks ganhou: P
Leaky Nun
3

Gelatina , 5 bytes

TL’ȧ$

Experimente online!

  • -1 byte graças a Challenger5
  • -1 byte graças a Leaky Nun
  • -2 bytes graças a H.PWiz

Não é mais baseado na resposta de Leaky!

caird coinheringaahing
fonte
ċ0ị2,0,3salva um byte
Esolanging Fruit
@ Challenger5 Hein, é o que faz. Obrigado!
caird coinheringaahing
1
7 bytes
Freira vazada
1
Que tal TL’ȧ$. Não sei Jelly, então isso pode ser golfable
H.PWiz
@ H.PWiz Muito bom! Eu não acho que isso possa ser jogado, mas posso estar errado.
caird coinheringaahing
3

Javascript (ES6), 30 24 22 bytes

Esta é a minha primeira vez tentando jogar golfe em Javascript. Tem que haver uma maneira melhor de contar zeros ...

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

-6 bytes graças a Herman Lauenstein, -2 bytes para lembrar as precedências do operador.

Solução alternativa de 24 bytes para retornar uma sequência:

(a,b,c)=>"320"[!a+!b+!c]
Steven H.
fonte
1
Isso é realmente bastante inteligente ...
Esolanging Fruit
1
24 bytes por não usar uma matriz(a,b,c)=>3<<(!a+!b+!c)&3
Herman L
Parece que eu não posso meu golfe não usar uma matriz mais ...
ericw31415
2

05AB1E , 6 bytes

Ƶܹ0¢è

Experimente online!

Baseado na resposta de Leaky Nun.

Erik, o Outgolfer
fonte
2

GolfScript , 16 14 bytes

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

Experimente online!

  • @ Challenger5 -2 bytes

Este programa utiliza uma matriz de 3 números inteiros representando os coeficientes na equação Ax + By = C

Exemplo de entrada / saída

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

Como 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     

Isso foi um pouco complicado no começo para eu descobrir uma maneira matemática de calcular isso. No entanto, existem apenas 8 configurações possíveis, comoa != 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

Acabei por chegar à seguinte função.

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

e tudo pode ser condensado em um único problema de matemática

F(a,b,c) {
    return (sign(a)+sign(b)+sign(c)) * (sign(a)+sign(b)+sign(c) > 1);
}
Marcos
fonte
Eu acho que você pode usar em {!!}%vez de [{!!}/].
Esolanging Fruit
A tradução CJam desta submissão é {:!:!:+_1>*}.
Esolanging Fruit
@ Challenger5 lol, como eu não percebi isso. Porta também legal, só preciso aprender a ler agora.
Marcos
As diferenças significativas nesse caso são 1) atalho para mapeamento ( :!é equivalente a {!}%), 2) atalho para redução ( :+é equivalente a {+}*), 3) que .é alterado para _(porque CJam possui flutuadores) e 4) que CJam não possui entrada na pilha por padrão, o que significa que você quebra o código {}para torná-lo uma função.
Esolanging Fruit
2

Retina , 13 bytes

M`\b0
T`d`320

Experimente online

Também com base na resposta de Leaky Nun .

mbomb007
fonte
Isso não funciona se a entrada contiver, 10por exemplo. O primeiro regex precisaria ser \b0.
Martin Ender
1

JavaScript, 25 bytes

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

Baseado na resposta de Leaky Nun.

ericw31415
fonte
1

Perl 6, 18 bytes

{3+<@_.grep(0)+&3}
bb94
fonte
1

ABCR , 30 bytes

A entrada está no formato em A,B,Cque as vírgulas podem ser substituídas por qualquer caractere não numérico e não -.

BBi7baxci7baxci7bax@7)A7(xxo

Ainda não há intérprete on-line, mas aqui está uma explicação:

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.
fonte
0

Deorst, 12 bytes

l0EN))A:k?Z+

Try it online!

Somewhat based off Leaky's answer; uses the same premise, but a different mapping method.

How it works

Deorst has a count occurrences builtin, but doesn't (for some reason) have an indexing command, so I had to create the following mapping, where the left is a.count(0) and the right is the wanted result

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

The program itself works like this (example input of [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
fonte
0

Add++, 23 bytes

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

Try it online!

Based off both my Deorst answer and Leaky's Python answer

How it works

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]

However, I think I've been using functions too much in Add++, rather than the main code body. So I attempted to do this using both functions, and the code body, and resulted in a much nicer 50 byte piece (yes, that is the longest answer here):

# 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

Try it online!

caird coinheringaahing
fonte