Kuadran melewati garis

15

Tugas

Diberikan representasi garis, menampilkan jumlah kuadran yang dilewati garis itu.

Representasi Garis yang Valid

Anda dapat mewakili garis sebagai

  • Tiga bilangan bulat ditandatangani A, Bdan Cyang berbagi tidak ada faktor umum dan di mana Adan Btidak keduanya nol, mewakili garis Ax + By = C,
  • Empat bilangan bulat ditandatangani , , , dan , yang mewakili garis yang melewati titik-titik dan , atauX1Y1X2Y2(X1, Y1)(X2, Y2)
  • Tipe data yang menggambarkan garis, jika bahasa Anda memiliki satu (itu harus mendukung garis vertikal).

Anda tidak boleh mengambil input dalam format apa pun yang tidak memungkinkan untuk garis vertikal (mis. Formulir penyadapan miring). Jika Anda memilih untuk mengambil bilangan bulat sebagai input, Anda dapat mengasumsikan bahwa mereka berada dalam kisaran inklusif [-127, 128].

Spesifikasi

  • Output akan selalu 0, 2, atau 3 (garis tidak pernah bisa melewati keempat kuadran, juga tidak bisa melewati hanya satu kuadran).
  • Garis pada sumbu dianggap tidak melewati kuadran mana pun. Garis melalui titik asal dianggap hanya melewati 2 kuadran.
  • Anda tidak harus mengembalikan kuadran mana yang sedang dilewati (meskipun kasus uji menyertakannya untuk kejelasan).
  • Ini adalah , sehingga jawaban terpendek yang valid (diukur dalam byte) menang.

Uji Kasus

Anda harus mengonversi ini ke format yang sesuai sebelum menggunakannya.

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)
Buah Esolanging
sumber
1
Mereka harus mengajarkan taktik yang kita semua pinjam dari Leaky Nun di sekolah, jika diperlukan.
mbomb007

Jawaban:

22

Python 3 , 24 byte

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

Cobalah online!

Biarawati Bocor
sumber
3
... Wow. Ini lebih sepele daripada yang saya kira.
Buah Esolanging
Anda mungkin bisa menggunakan string daripada daftar jika I / O mengizinkannya.
Jonathan Frech
Apakah menggunakan '320'[a.count(0)]dan mengembalikan nilai dalam bentuk string dapat diterima?
FlipTack
2
Dan wow, sepertinya semua jawaban sekarang akan "didasarkan pada Leaky's"
FlipTack
3
@FlipTack menang bithacks: P
Leaky Nun
3

Jelly , 5 byte

TL’ȧ$

Cobalah online!

  • -1 byte terima kasih kepada Challenger5
  • -1 byte terima kasih untuk Leaky Nun
  • -2 byte terima kasih kepada H.PWiz

Tidak lagi berdasarkan jawaban Leaky!

caird coinheringaahing
sumber
ċ0ị2,0,3menghemat satu byte
Buah Esolanging
@ Challenger5 Hah, begitu juga. Terima kasih!
caird coinheringaahing
1
7 byte
Leaky Nun
1
Bagaimana TL’ȧ$. Tidak tahu Jelly, jadi ini mungkin golf
H.PWiz
@ H.Piz sangat bagus! Saya tidak berpikir itu bisa golf, tetapi saya mungkin salah.
caird coinheringaahing
3

Javascript (ES6), 30 24 22 byte

Ini adalah pertama kalinya saya mencoba bermain golf di Javascript. Pasti ada cara yang lebih baik untuk menghitung nol ...

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

-6 byte berkat Herman Lauenstein, -2 byte untuk mengingat prioritas operator.

Alternatif solusi 24-byte untuk mengembalikan string sebagai gantinya:

(a,b,c)=>"320"[!a+!b+!c]
Steven H.
sumber
1
Itu sebenarnya cukup pintar ...
Buah Esolanging
1
24 byte dengan tidak menggunakan array(a,b,c)=>3<<(!a+!b+!c)&3
Herman L
Sepertinya saya tidak dapat menambang golf untuk tidak menggunakan array lagi ...
ericw31415
2

05AB1E , 6 byte

Ƶܹ0¢è

Cobalah online!

Berdasarkan jawaban Leaky Nun.

Erik the Outgolfer
sumber
2

GolfScript , 16 14 byte

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

Cobalah online!

  • @ Challenger5 -2 byte

Program ini mengambil array 3 bilangan bulat yang mewakili koefisien dalam persamaan Ax + By = C

Contoh Input / Output

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

Bagaimana itu bekerja

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

Ini agak sulit pada awalnya bagi saya untuk mencari cara matematika untuk menghitung ini. Namun hanya ada 8 konfigurasi yang memungkinkana != 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

Saya akhirnya datang ke fungsi berikut.

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

dan semuanya bisa diringkas menjadi satu masalah matematika

F(a,b,c) {
    return (sign(a)+sign(b)+sign(c)) * (sign(a)+sign(b)+sign(c) > 1);
}
Marcos
sumber
Saya pikir Anda dapat menggunakan {!!}%bukan [{!!}/].
Buah Esolanging
Terjemahan CJam dari pengajuan ini adalah {:!:!:+_1>*}.
Buah Esolanging
@ Challenger5 lol, Bagaimana saya tidak menyadarinya. Juga port yang bagus, saya hanya perlu belajar cara membacanya sekarang.
Marcos
Perbedaan yang signifikan dalam hal ini adalah 1) singkatan untuk pemetaan ( :!setara dengan {!}%), 2) singkatan untuk mengurangi ( :+setara dengan {+}*), 3) yang .diubah menjadi _(karena CJam mengapung), dan 4) bahwa CJam tidak memiliki input pada tumpukan secara default, artinya Anda membungkus kode {}untuk membuatnya berfungsi.
Buah Esolanging
2

Retina , 13 byte

M`\b0
T`d`320

Cobalah online

Juga berdasarkan jawaban Leaky Nun .

mbomb007
sumber
Ini tidak berfungsi jika inputnya berisi 10misalnya. Regex pertama harus seperti itu \b0.
Martin Ender
1

JavaScript, 25 byte

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

Didasarkan atas jawaban Leaky Nun.

ericw31415
sumber
1

Perl 6, 18 byte

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

ABCR , 30 byte

Input dalam bentuk di A,B,Cmana koma dapat diganti dengan non-numerik, non- -karakter.

BBi7baxci7baxci7bax@7)A7(xxo

Belum ada juru bahasa online, tetapi inilah penjelasannya:

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

Deorst , 12 byte

l0EN))A:k?Z+

Cobalah online!

Agak mendasari jawaban Leaky ; menggunakan premis yang sama, tetapi metode pemetaan yang berbeda.

Bagaimana itu bekerja

Deorst memiliki jumlah kejadian bawaan, tetapi tidak (karena alasan tertentu) memiliki perintah pengindeksan, jadi saya harus membuat pemetaan berikut, di mana kiri a.count(0)dan kanan adalah hasil yang diinginkan

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

Program itu sendiri berfungsi seperti ini (contoh input dari [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
sumber
0

Tambahkan ++ , 23 byte

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

Cobalah online!

Didasarkan atas jawaban Deorst saya dan jawaban Python Leaky

Bagaimana itu bekerja

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]

Namun, saya pikir saya telah menggunakan fungsi terlalu banyak di Add ++, daripada badan kode utama. Jadi saya berusaha melakukan ini menggunakan kedua fungsi, dan kode tubuh, dan menghasilkan potongan 50 byte yang jauh lebih baik (ya, itu adalah jawaban terlama di sini):

# 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

Cobalah online!

caird coinheringaahing
sumber