Quadrants traversés par une ligne

15

Tâche

Étant donné la représentation d'une ligne, affichez le nombre de quadrants traversés par cette ligne.

Représentations valides d'une ligne

Vous pouvez représenter une ligne comme

  • Trois entiers signés A, Bet Cqui partagent sans facteur commun et où Aet Bne sont pas tous deux nuls, ce qui représente la ligne Ax + By = C,
  • Quatre entiers signés , , et , ce qui représente la ligne passant par les points et , ouX1Y1X2Y2(X1, Y1)(X2, Y2)
  • Un type de données qui décrit une ligne, si votre langue en a une (elle doit prendre en charge les lignes verticales).

Vous ne pouvez pas prendre d'entrée dans un format qui ne permet pas une ligne verticale (par exemple, forme d'interception de pente). Si vous choisissez de prendre des entiers en entrée, vous pouvez supposer qu'ils se trouvent dans la plage inclusive [-127, 128].

Caractéristiques

  • La sortie sera toujours 0, 2 ou 3 (une ligne ne peut jamais traverser les quatre quadrants ni passer par un seul).
  • Une ligne sur un axe est considérée comme ne traversant aucun quadrant. Une ligne passant par l'origine est considérée comme ne traversant que 2 quadrants.
  • Il n'est pas nécessaire de renvoyer les quadrants qui sont passés (bien que les cas de test les incluent pour plus de clarté).
  • Il s'agit de , donc la réponse valide la plus courte (mesurée en octets) l'emporte.

Cas de test

Vous devrez les convertir dans un format approprié avant de les utiliser.

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
la source
1
Ils devraient enseigner la tactique que nous avons tous empruntée à Leaky Nun à l'école, si cela était nécessaire.
mbomb007

Réponses:

22

Python 3 , 24 octets

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

Essayez-le en ligne!

Leaky Nun
la source
3
... sensationnel. C'est plus trivial que je ne le pensais.
Esolanging Fruit
Vous pouvez peut-être utiliser une chaîne au lieu d'une liste si les E / S le permettent.
Jonathan Frech
L'utilisation '320'[a.count(0)]et le retour de la valeur sous forme de chaîne seraient-ils acceptables?
FlipTack
2
Et wow, on dirait que toutes les réponses seront désormais "basées sur Leaky's"
FlipTack
3
@FlipTack bithacks gagne: P
Leaky Nun
3

Gelée , 5 octets

TL’ȧ$

Essayez-le en ligne!

  • -1 octet grâce à Challenger5
  • -1 octet grâce à Leaky Nun
  • -2 octets grâce à H.PWiz

Ne repose plus sur la réponse de Leaky!

caird coinheringaahing
la source
ċ0ị2,0,3enregistre un octet
Esolanging Fruit
@ Challenger5 Huh, c'est vrai. Merci!
caird coinheringaahing
1
7 octets
Leaky Nun
1
Que diriez-vous TL’ȧ$. Je ne connais pas Jelly, donc cela pourrait être jouable au golf
H.PWiz
@ H.PWiz Très sympa! Je ne pense pas que cela puisse être joué au golf, mais je peux me tromper.
caird coinheringaahing
3

Javascript (ES6), 30 24 22 octets

C'est la première fois que j'essaie de jouer au golf en Javascript. Il doit y avoir une meilleure façon de compter les zéros ...

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

-6 octets grâce à Herman Lauenstein, -2 octets pour se souvenir des priorités des opérateurs.

Solution alternative de 24 octets pour renvoyer une chaîne à la place:

(a,b,c)=>"320"[!a+!b+!c]
Steven H.
la source
1
C'est en fait assez intelligent ...
Esolanging Fruit
1
24 octets en n'utilisant pas de tableau(a,b,c)=>3<<(!a+!b+!c)&3
Herman L
On dirait que je ne peux pas
jouer au
2

GolfScript , 16 14 octets

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

Essayez-le en ligne!

  • @ Challenger5 -2 octets

Ce programme prend un tableau de 3 entiers représentant les coefficients de l'équation Ax + By = C

Exemple d'entrée / sortie

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

Comment ça fonctionne

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

C'était un peu délicat au début pour moi de trouver une façon mathématique de calculer cela. Cependant, il n'y a que 8 configurations possibles telles 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

Je suis finalement arrivé à la fonction suivante.

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

et le tout peut être condensé en un seul problème mathématique

F(a,b,c) {
    return (sign(a)+sign(b)+sign(c)) * (sign(a)+sign(b)+sign(c) > 1);
}
Marcos
la source
Je pense que vous pouvez utiliser à la {!!}%place de [{!!}/].
Esolanging Fruit du
CJam traduction de cette soumission est {:!:!:+_1>*}.
Esolanging Fruit
@ Challenger5 lol, Comment n'ai-je pas réalisé cela. Port aussi sympa, je dois juste apprendre à le lire maintenant.
Marcos
Les différences significatives dans ce cas sont 1) raccourci pour le mappage ( :!est équivalent à {!}%), 2) raccourci pour la réduction ( :+est équivalent à {+}*), 3) qui .est changé en _(parce que CJam a des flottants), et 4) que CJam n'a pas d'entrée sur la pile par défaut, ce qui signifie que vous enveloppez le code {}pour en faire une fonction.
Esolanging Fruit
2

Rétine , 13 octets

M`\b0
T`d`320

Essayez-le en ligne

Également basé sur la réponse de Leaky Nun .

mbomb007
la source
Cela ne fonctionne pas si l'entrée contient 10par exemple. Le premier regex devrait être \b0.
Martin Ender
1

JavaScript, 25 octets

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

Basé sur la réponse de Leaky Nun.

ericw31415
la source
1

Perl 6, 18 octets

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

ABCR , 30 octets

L'entrée se présente sous la forme A,B,Coù les virgules peuvent être remplacées par n'importe quel caractère non numérique -.

BBi7baxci7baxci7bax@7)A7(xxo

Pas encore d'interprète en ligne, mais voici une explication:

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.
la source
0

Deorst , 12 octets

l0EN))A:k?Z+

Essayez-le en ligne!

Un peu basé sur la réponse de Leaky ; utilise le même principe, mais une méthode de mappage différente.

Comment ça fonctionne

Deorst a un nombre d'occurrences intégré, mais n'a pas (pour une raison quelconque) de commande d'indexation, j'ai donc dû créer le mappage suivant, où la gauche est a.count(0)et la droite est le résultat souhaité

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

Le programme lui-même fonctionne comme ceci (exemple d'entrée 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
la source
0

Ajouter ++ , 23 octets

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

Essayez-le en ligne!

Sur la base de ma réponse Deorst et de la réponse Peakon de Leaky

Comment ça fonctionne

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]

Cependant, je pense que j'utilise trop de fonctions dans Add ++, plutôt que le corps de code principal. J'ai donc essayé de le faire en utilisant les deux fonctions et le corps du code, et j'ai abouti à un morceau de 50 octets beaucoup plus agréable (oui, c'est la réponse la plus longue ici):

# 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

Essayez-le en ligne!

caird coinheringaahing
la source