Kwadranty przechodziły przez linię

15

Zadanie

Biorąc pod uwagę reprezentację linii, wypisz liczbę kwadrantów , przez które przechodzi ta linia.

Prawidłowe reprezentacje linii

Możesz przedstawić linię jako

  • Trzy podpisane liczby całkowite A, Bi Cktóre nie dzielić wspólny czynnik i gdzie Ai Bnie są oba zero, reprezentująca linię Ax + By = C,
  • Cztery podpisane liczb całkowitych , , , i , reprezentująca linię przechodzącą przez punkty a , lubX1Y1X2Y2(X1, Y1)(X2, Y2)
  • Typ danych opisujący linię, jeśli Twój język ją ma (musi obsługiwać linie pionowe).

Być może nie wziąć wkład w dowolnym formacie, który nie pozwala na linii pionowej (np formularza nachylenie osią). Jeśli wybierzesz przyjmowanie liczb całkowitych jako danych wejściowych, możesz założyć, że leżą one w zakresie obejmującym [-127, 128].

Dane techniczne

  • Wynik zawsze będzie wynosił 0, 2 lub 3 (linia nigdy nie może przejść przez wszystkie cztery ćwiartki, ani nie może przejść tylko przez jedną).
  • Uważa się, że linia na osi nie przechodzi przez żadne ćwiartki. Uważa się, że linia przechodząca przez początek przechodzi tylko przez 2 ćwiartki.
  • Nie musisz zwracać, które kwadraty są przekazywane (chociaż przypadki testowe zawierają je dla jasności).
  • To jest , więc wygrywa najkrótsza ważna odpowiedź (mierzona w bajtach).

Przypadki testowe

Będziesz musiał przekonwertować je na odpowiedni format przed ich użyciem.

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
źródło
1
Powinni uczyć taktyki, którą wszyscy pożyczyliśmy od Dziurawej Zakonnicy w szkole, jeśli zajdzie taka potrzeba.
mbomb007,

Odpowiedzi:

22

Python 3 , 24 bajty

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

Wypróbuj online!

Leaky Nun
źródło
3
... łał. To jest bardziej trywialne niż myślałem.
Esolanging Fruit,
Możesz użyć ciągu zamiast listy, jeśli pozwala na to I / O.
Jonathan Frech,
Czy użycie '320'[a.count(0)]i zwrócenie wartości w postaci ciągu byłoby dopuszczalne?
FlipTack,
2
I wow, wygląda na to, że wszystkie odpowiedzi będą teraz „oparte na
Dziurawych
3
Zwycięstwo w bitwach FlipTack: P
Leaky Nun
3

Galaretka , 5 bajtów

TL’ȧ$

Wypróbuj online!

  • -1 bajt dzięki Challenger5
  • -1 bajt dzięki Dziurawej Zakonnicy
  • -2 bajty dzięki H.PWiz

Nie opiera się już na odpowiedzi Leaky'ego!

Cairney Coheringaahing
źródło
ċ0ị2,0,3zapisuje bajt
Esolanging Fruit
@ Challenger5 Huh, więc to robi. Dzięki!
caird coinheringaahing
1
7 bajtów
Leaky Nun
1
Jak o TL’ȧ$. Nie znam Galaretki, więc to może być gra w golfa
H.PWiz
@ H.PWiz Bardzo miło! Nie sądzę, że można grać w golfa, ale mogę się mylić.
caird coinheringaahing
3

JavaScript (ES6), 30 24 22 bajtów

To moja pierwsza gra w golfa w Javascript. Musi być lepszy sposób na liczenie zer ...

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

-6 bajtów dzięki Hermanowi Lauensteinowi, -2 bajty do zapamiętywania priorytetów operatorów.

Alternatywne 24-bajtowe rozwiązanie, aby zamiast tego zwrócić ciąg:

(a,b,c)=>"320"[!a+!b+!c]
Steven H.
źródło
1
To właściwie dość sprytne ...
Esolanging Fruit
1
24 bajty bez użycia tablicy(a,b,c)=>3<<(!a+!b+!c)&3
Herman L
Wygląda na to, że nie mogę grać w golfa, żeby nie korzystać z tablicy ...
ericw31415,
2

05AB1E , 6 bajtów

Ƶܹ0¢è

Wypróbuj online!

Na podstawie odpowiedzi Dziurawej Zakonnicy.

Erik the Outgolfer
źródło
2

GolfScript , 16 14 bajtów

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

Wypróbuj online!

  • @ Challenger5 -2 bajty

Ten program przyjmuje tablicę 3 liczb całkowitych reprezentujących współczynniki w równaniu Ax + By = C

Przykład wejścia / wyjścia

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

Jak to działa

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

Na początku było to dla mnie trochę trudne, aby wymyślić matematyczny sposób obliczenia tego. Istnieje jednak tylko 8 możliwych konfiguracji, takich jaka != 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

W końcu doszedłem do następującej funkcji.

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

a całość może zostać skondensowana do jednego problemu matematycznego

F(a,b,c) {
    return (sign(a)+sign(b)+sign(c)) * (sign(a)+sign(b)+sign(c) > 1);
}
Marcos
źródło
Myślę, że możesz użyć {!!}%zamiast [{!!}/].
Esolanging Fruit
Tłumaczenie CJam tego zgłoszenia to {:!:!:+_1>*}.
Esolanging Fruit
@ Challenger5 lol, Jak nie zdawałem sobie z tego sprawy. Również fajny port, muszę tylko nauczyć się go teraz czytać.
Marcos,
Istotne różnice w tym przypadku to 1) skrót do mapowania ( :!jest równoważny {!}%), 2) skrót do redukowania ( :+jest równoważny {+}*), 3) .zmieniony na _(ponieważ CJam ma zmiennoprzecinkowe) i 4) że CJam nie ma danych wejściowych na stosie domyślnie, co oznacza, że ​​kod jest zawijany, {}aby stał się funkcją.
Esolanging Fruit
2

Siatkówka , 13 bajtów

M`\b0
T`d`320

Wypróbuj online

Także na podstawie odpowiedzi Dziurawej Zakonnicy .

mbomb007
źródło
To nie działa, jeśli dane wejściowe zawierają 10na przykład. Pierwszym wyrażeniem regularnym musiałoby być \b0.
Martin Ender
1

JavaScript, 25 bajtów

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

Na podstawie odpowiedzi Dziurawej Zakonnicy.

ericw31415
źródło
1

Haskell , 22 bajty

f l="320"!!sum[1|0<-l]

Wypróbuj online!

Rozwiązanie punktowe, 27 bajtów

("320"!!).(\l->sum[1|0<-l])

Wypróbuj online!

całkowicie ludzki
źródło
Już miałam zasugerować tę zmianę ... pobiła mnie do tego
Esolanging Fruit
1

Perl 6, 18 bajtów

{3+<@_.grep(0)+&3}
bb94
źródło
1

ABCR , 30 bajtów

Dane wejściowe mają postać A,B,Cprzecinków, które można zastąpić dowolnymi nienumerycznymi -znakami.

BBi7baxci7baxci7bax@7)A7(xxo

Nie ma jeszcze tłumacza online, ale oto wyjaśnienie:

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.
źródło
0

Najgorsze , 12 bajtów

l0EN))A:k?Z+

Wypróbuj online!

Nieco oparte na odpowiedzi Leaky'ego ; używa tej samej przesłanki, ale innej metody mapowania.

Jak to działa

Najgorszy ma wbudowaną liczbę wystąpień, ale nie ma (z jakiegoś powodu) polecenia indeksowania, więc musiałem utworzyć następujące odwzorowanie, w którym lewy jest, a.count(0)a prawy pożądany wynik

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

Sam program działa w ten sposób (przykładowe wprowadzenie [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]
Cairney Coheringaahing
źródło
0

Dodaj ++ , 23 bajty

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

Wypróbuj online!

Na podstawie zarówno mojej najgorszej odpowiedzi, jak i odpowiedzi Leaky's Python

Jak to działa

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]

Myślę jednak, że zbyt często korzystam z funkcji w Add ++, a nie w głównej części kodu. Próbowałem to zrobić, używając obu funkcji i treści kodu, i uzyskałem znacznie ładniejszy 50-bajtowy kawałek (tak, to najdłuższa odpowiedź tutaj):

# 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

Wypróbuj online!

Cairney Coheringaahing
źródło