Quadranti attraversati da una linea


15

Compito

Data una rappresentazione di una linea, genera il numero di quadranti che quella linea attraversa.

Rappresentazioni valide di una linea

Puoi rappresentare una linea come

  • Tre interi con segno A, Be Cche condividono alcun fattore comune e dove Ae Bnon sono entrambi pari a zero, che rappresenta la linea Ax + By = C,
  • Quattro interi con segno , , , e , che rappresenta la linea passante per i punti e , oX1Y1X2Y2(X1, Y1)(X2, Y2)
  • Un tipo di dati che descrive una linea, se la tua lingua ne ha una (deve supportare linee verticali).

Si può non prendere in ingresso in qualsiasi formato che non consente una linea verticale (es forma pendenza-intercetta). Se si sceglie di prendere numeri interi come input, si può presumere che si trovino nell'intervallo inclusivo [-127, 128].

specificazioni

  • L'output sarà sempre 0, 2 o 3 (una linea non può mai passare attraverso tutti e quattro i quadranti, né può passare solo attraverso uno solo).
  • Si considera che una linea su un asse non passi attraverso alcun quadrante. Si considera che una linea attraverso l'origine passi solo attraverso 2 quadranti.
  • Non è necessario restituire quali quadranti vengono passati (anche se i casi di test li includono per chiarezza).
  • Questo è , quindi vince la risposta valida più breve (misurata in byte).

Casi test

Dovrai convertirli in un formato adatto prima di usarli.

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
Dovrebbero insegnare la tattica che abbiamo preso in prestito da Leaky Nun a scuola, se ce n'era bisogno.
mbomb007,

Risposte:



3

Gelatina , 5 byte

TL’ȧ$

Provalo online!

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

Non più basato sulla risposta di Leaky!


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

@ Challenger5 Huh, così fa. Grazie!
caird coinheringaahing del


1
Che ne dici di TL’ȧ$. Non conosco Jelly, quindi potrebbe essere giocabile a golf
H.Pwiz,

@ H.PWiz Molto bello! Non penso che si possa giocare a golf, ma potrei sbagliarmi.
caird coinheringaahing del

3

Javascript (ES6), 30 24 22 byte

Questa è la prima volta che cerco di giocare a golf in Javascript. Deve esserci un modo migliore per contare gli zeri ...

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

-6 byte grazie a Herman Lauenstein, -2 byte a ricordare le precedenti dell'operatore.

Soluzione alternativa a 24 byte per restituire invece una stringa:

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

1
In realtà è abbastanza intelligente ...
Esolanging Fruit,

1
24 byte non usando un array(a,b,c)=>3<<(!a+!b+!c)&3
Herman L

Sembra che non riesca più a giocare a golf per non usare più un array ...
ericw31415,



2

GolfScript , 16 14 byte

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

Provalo online!

  • @ Challenger5 -2 byte

Questo programma accetta una matrice di 3 numeri interi che rappresentano i coefficienti nell'equazione Ax + By = C

Esempio di input / output

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

Come funziona

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

All'inizio è stato un po 'complicato per me capire un modo matematico per calcolarlo. Tuttavia ci sono solo 8 possibili configurazioni tali chea != 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

Alla fine sono arrivato alla seguente funzione.

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

e il tutto può essere condensato in un singolo problema di matematica

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

Penso che tu possa usare al {!!}%posto di [{!!}/].
Esolanging Fruit,

La traduzione di CJam di questa proposta è {:!:!:+_1>*}.
Esolanging Fruit,

@ Challenger5 lol, come non me ne sono reso conto. Bello anche il porto, devo solo imparare a leggerlo ora.
Marcos,

Le differenze significative in questo caso sono 1) scorciatoia per la mappatura ( :!è equivalente a {!}%), 2) scorciatoia per la riduzione ( :+è equivalente a {+}*), 3) che .viene modificato in _(perché CJam ha float) e 4) che CJam non ha input sullo stack per impostazione predefinita, il che significa che si avvolge il codice {}per renderlo una funzione.
Esolanging Fruit,


1

JavaScript, 25 byte

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

Basato sulla risposta di Leaky Nun.




1

ABCR , 30 byte

L'input è nella forma in A,B,Ccui le virgole possono essere sostituite da qualsiasi non numerico, non -carattere.

BBi7baxci7baxci7bax@7)A7(xxo

Nessun interprete online ancora, ma ecco una spiegazione:

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 byte

l0EN))A:k?Z+

Provalo online!

In qualche modo basato sulla risposta di Leaky ; usa la stessa premessa, ma un metodo di mappatura diverso.

Come funziona

Deorst ha un conteggio delle occorrenze di conteggio, ma non (per qualche ragione) ha un comando di indicizzazione, quindi ho dovuto creare il seguente mapping, dove si trova la sinistra a.count(0)e la destra è il risultato desiderato

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

Il programma stesso funziona in questo modo (esempio di input di [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

Aggiungi ++ , 23 byte

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

Provalo online!

In base al largo sia la mia risposta Deorst e risposta Python di Leaky

Come funziona

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]

Tuttavia, penso di aver usato troppe funzioni in Add ++, piuttosto che nel corpo del codice principale. Quindi ho provato a farlo usando entrambe le funzioni e il corpo del codice, e ho prodotto un pezzo da 50 byte molto più bello (sì, questa è la risposta più lunga qui):

# 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

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.