Quadranten wurden von einer Linie durchquert

15

Aufgabe

Geben Sie bei einer gegebenen Darstellung einer Linie die Anzahl der Quadranten aus , die diese Linie durchläuft.

Gültige Darstellungen einer Linie

Sie können eine Linie als darstellen

  • Drei signierte ganze Zahlen A, Bund Cdie teilen keinen gemeinsamen Faktor und wo Aund Bnicht beide Null, die die Linie Ax + By = C,
  • Vier signierte ganze Zahlen , , , und , die die Linie durch die Punkte und oderX1Y1X2Y2(X1, Y1)(X2, Y2)
  • Ein Datentyp, der eine Linie beschreibt, falls Ihre Sprache eine hat (vertikale Linien müssen unterstützt werden).

Sie dürfen keine Eingabe in einem Format vornehmen, das keine vertikale Linie zulässt (z. B. Steigungsschnittform). Wenn Sie sich für die Eingabe von Ganzzahlen entscheiden, können Sie davon ausgehen, dass diese im Inklusivbereich liegen [-127, 128].

Spezifikationen

  • Die Ausgabe ist immer 0, 2 oder 3 (eine Linie kann niemals alle vier Quadranten oder nur einen einzigen Quadranten durchlaufen).
  • Es wird davon ausgegangen, dass eine Linie auf einer Achse keine Quadranten durchläuft. Es wird angenommen, dass eine Linie durch den Ursprung nur durch zwei Quadranten verläuft.
  • Sie müssen nicht zurückgeben, welche Quadranten durchlaufen werden (obwohl die Testfälle sie aus Gründen der Übersichtlichkeit enthalten).
  • Das ist , also gewinnt die kürzeste gültige Antwort (gemessen in Bytes).

Testfälle

Sie müssen diese in ein geeignetes Format konvertieren, bevor Sie sie verwenden können.

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
quelle
1
Sie sollten die Taktik unterrichten, die wir uns alle in der Schule von Leaky Nun geliehen haben, wenn es nötig war.
mbomb007

Antworten:

22

Python 3 , 24 Bytes

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

Probieren Sie es online!

Undichte Nonne
quelle
3
... Wow. Das ist trivialer als ich dachte.
Esolanging Fruit
Sie könnten möglicherweise eine Zeichenfolge anstelle einer Liste verwenden, wenn die E / A dies zulässt.
Jonathan Frech
Wäre '320'[a.count(0)]es akzeptabel, den Wert in Stringform zu verwenden und zurückzugeben?
FlipTack
2
Und wow, es sieht so aus, als ob alle Antworten jetzt "basierend auf Leaky's" sind
FlipTack
3
@ FlipTack Bithacks gewinnen: P
Leaky Nun
3

Gelee , 5 Bytes

TL’ȧ$

Probieren Sie es online!

  • -1 Byte dank Challenger5
  • -1 Byte dank Leaky Nun
  • -2 Bytes dank H.PWiz

Nicht länger von Leakys Antwort abhängig!

Caird Coinheringaahing
quelle
ċ0ị2,0,3speichert ein Byte
Esolanging Fruit
@ Challenger5 Huh, so geht es. Vielen Dank!
Caird Coinheringaahing
1
7 Bytes
Undichte Nonne
1
Wie wäre es TL’ȧ$. Weiß nicht, Jelly, so könnte dies Golf sein
H.PWiz
@ H.PWiz Sehr schön! Ich glaube nicht, dass man Golf spielen kann, aber ich kann mich irren.
Caird Coinheringaahing
3

Javascript (ES6), 30 24 22 Bytes

Dies ist mein erster Versuch, in Javascript Golf zu spielen. Es muss einen besseren Weg geben, um Nullen zu zählen ...

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

-6 Bytes dank Herman Lauenstein, -2 Bytes, um die Operator-Prioritäten zu speichern.

Alternative 24-Byte-Lösung, um stattdessen eine Zeichenfolge zurückzugeben:

(a,b,c)=>"320"[!a+!b+!c]
Steven H.
quelle
1
Das ist eigentlich ziemlich clever ...
Esolanging Fruit
1
24 Bytes ohne Array(a,b,c)=>3<<(!a+!b+!c)&3
Herman L
Es sieht so aus, als ob ich nicht mehr Golf spielen kann, um ein Array nicht mehr zu benutzen ...
ericw31415
2

GolfScript , 16 bis 14 Bytes

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

Probieren Sie es online!

  • @ Challenger5 -2 Bytes

Dieses Programm verwendet ein Array von 3 Ganzzahlen, die die Koeffizienten in der Gleichung darstellen Ax + By = C

Beispiel Eingabe / Ausgabe

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

Wie es funktioniert

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

Für mich war es zunächst etwas schwierig, einen mathematischen Weg zu finden, um dies zu berechnen. Es gibt jedoch nur 8 mögliche Konfigurationen, so dassa != 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

Ich kam schließlich zu der folgenden Funktion.

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

und das Ganze kann zu einem einzigen mathematischen Problem zusammengefasst werden

F(a,b,c) {
    return (sign(a)+sign(b)+sign(c)) * (sign(a)+sign(b)+sign(c) > 1);
}
Marcos
quelle
Ich denke, Sie können {!!}%anstelle von verwenden [{!!}/].
Esolanging Fruit
CJam Übersetzung dieses Beitrags ist {:!:!:+_1>*}.
Esolanging Fruit 20.11.17
@ Challenger5 lol, wie habe ich das nicht gemerkt. Auch schöner Hafen, ich muss nur lernen, wie man es jetzt liest.
Marcos
Wesentliche Unterschiede in diesem Fall sind 1) Kurzform für das Mapping ( :!entspricht {!}%), 2) Kurzform für das Reduzieren ( :+entspricht {+}*), 3) das .in _(weil CJam Floats hat) geändert wird, und 4) dass CJam keine Eingabe hat Dies bedeutet, dass Sie den Code einschließen {}, um ihn zu einer Funktion zu machen.
Esolanging Fruit
2

Retina , 13 Bytes

M`\b0
T`d`320

Probieren Sie es online aus

Basiert auch auf der Antwort von Leaky Nun .

mbomb007
quelle
Dies funktioniert nicht, wenn die Eingabe beispielsweise enthält 10. Der erste Regex müsste sein \b0.
Martin Ender
1

JavaScript, 25 Byte

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

Basierend auf der Antwort von Leaky Nun.

ericw31415
quelle
1

Perl 6, 18 Bytes

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

ABCR , 30 Bytes

Die Eingabe erfolgt in der Form, A,B,Cin der die Kommas durch beliebige nicht numerische -Zeichen ersetzt werden können.

BBi7baxci7baxci7bax@7)A7(xxo

Noch kein Online-Dolmetscher, aber hier eine Erklärung:

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

Deorst , 12 Bytes

l0EN))A:k?Z+

Probieren Sie es online!

Etwas basierend auf Leakys Antwort ; verwendet dieselbe Prämisse, jedoch eine andere Zuordnungsmethode.

Wie es funktioniert

Deorst verfügt über eine integrierte Anzahl von Vorkommen, hat jedoch (aus irgendeinem Grund) keinen Indizierungsbefehl, sodass ich das folgende Mapping erstellen musste, bei dem links a.count(0)und rechts das gewünschte Ergebnis ist

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

Das Programm selbst funktioniert so (Beispieleingabe von [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
quelle
0

Add ++ , 23 Bytes

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

Probieren Sie es online!

Basierend auf meiner Deorst-Antwort und der Python-Antwort von Leaky

Wie es funktioniert

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]

Ich glaube jedoch, dass ich Funktionen in Add ++ zu oft verwendet habe, anstatt den Haupttextkörper. Also habe ich versucht, dies mit beiden Funktionen und dem Code-Body zu tun und habe ein viel schöneres 50-Byte-Stück erhalten (ja, das ist die längste Antwort hier):

# 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

Probieren Sie es online!

Caird Coinheringaahing
quelle