Quadrant đi qua bởi một dòng


15

Bài tập

Cho một đại diện của một dòng, xuất ra số góc phần tư mà dòng đó đi qua.

Đại diện hợp lệ của một dòng

Bạn có thể biểu diễn một dòng như

  • Ba số nguyên ký A, BCđó chia sẻ không có yếu tố chung và ở đâu ABkhông phải là cả hai không, đại diện cho các dòng Ax + By = C,
  • Bốn nguyên ký , , , và , đại diện cho dòng đi qua các điểm và , hoặcX1Y1X2Y2(X1, Y1)(X2, Y2)
  • Một kiểu dữ liệu mô tả một dòng, nếu ngôn ngữ của bạn có một dòng (nó phải hỗ trợ các dòng dọc).

Bạn không được nhận đầu vào ở bất kỳ định dạng nào không cho phép một đường thẳng đứng (ví dụ: hình thức chặn dốc). Nếu bạn chọn lấy số nguyên làm đầu vào, bạn có thể giả sử rằng chúng nằm trong phạm vi bao gồm [-127, 128].

Thông số kỹ thuật

  • Đầu ra sẽ luôn là 0, 2 hoặc 3 (một dòng không bao giờ có thể đi qua cả bốn góc phần tư, và cũng không thể đi qua chỉ một cái duy nhất).
  • Một đường trên một trục được coi là không đi qua bất kỳ góc phần tư nào. Một dòng qua gốc được coi là chỉ đi qua 2 góc phần tư.
  • Bạn không phải trả lại các góc phần tư nào đang được chuyển qua (mặc dù các trường hợp kiểm tra bao gồm chúng cho rõ ràng).
  • Đây là , vì vậy câu trả lời hợp lệ ngắn nhất (tính bằng byte) sẽ thắng.

Các trường hợp thử nghiệm

Bạn sẽ phải chuyển đổi chúng sang một định dạng phù hợp trước khi sử dụng chúng.

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
Họ nên dạy chiến thuật mà tất cả chúng ta đã mượn từ Leaky Nun ở trường, nếu có nhu cầu.
mbomb007

Câu trả lời:


22

Python 3 , 24 byte

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

Hãy thử trực tuyến!


3
... wow. Điều này là tầm thường hơn tôi nghĩ.
Esolanging Fruit 19/11/17

Bạn có thể sử dụng một chuỗi thay vì một danh sách nếu I / O cho phép nó.
Jonathan Frech

Việc sử dụng '320'[a.count(0)]và trả về giá trị ở dạng chuỗi có được chấp nhận không?
FlipTack

2
Và wow, có vẻ như tất cả các câu trả lời bây giờ sẽ là "dựa trên Leaky"
FlipTack

3
Chiến thắng bithacks @FlipTack: P
Leaky Nun

3

Thạch , 5 byte

TL’ȧ$

Hãy thử trực tuyến!

  • -1 byte nhờ Challenger5
  • -1 byte nhờ Leaky Nun
  • -2 byte nhờ H.PWiz

Không còn dựa vào câu trả lời của Leaky!


ċ0ị2,0,3tiết kiệm một byte
Esolanging Fruit 19/11/17

@ Challenger5 Huh, vậy là xong. Cảm ơn!
caird coinheringaahing


1
Thế còn TL’ȧ$. Không biết Jelly, vì vậy đây có thể là sân golf
H.PWiz

@ H.PWiz Rất đẹp! Tôi không nghĩ rằng có thể chơi gôn, nhưng tôi có thể sai.
caird coinheringaahing

3

Javascript (ES6), 30 24 22 byte

Đây là lần đầu tiên tôi thử chơi golf trong Javascript. Có một cách tốt hơn để đếm số không ...

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

-6 byte nhờ Herman Lauenstein, -2 byte để ghi nhớ các ưu tiên toán tử.

Thay thế giải pháp 24 byte để trả về một chuỗi thay thế:

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

1
Điều đó thực sự khá thông minh ...
Trái cây Esolanging

1
24 byte bằng cách không sử dụng một mảng(a,b,c)=>3<<(!a+!b+!c)&3
Herman L

Có vẻ như tôi không thể chơi golf để không sử dụng một mảng nữa ...
ericw31415



2

GolfScript , 16 14 byte

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

Hãy thử trực tuyến!

  • @ Challenger5 -2 byte

Chương trình này có một mảng gồm 3 số nguyên biểu thị các hệ số trong phương trình Ax + By = C

Ví dụ đầu vào / đầu ra

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

Làm thế nào nó hoạt động

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

Đây là một chút khó khăn lúc đầu để tôi tìm ra một cách toán học để tính toán điều này. Tuy nhiên, chỉ có 8 cấu hình có thểa != 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

Cuối cùng tôi đã đến chức năng sau đây.

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

và toàn bộ điều có thể được cô đọng thành một bài toán duy nhất

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

Tôi nghĩ bạn có thể sử dụng {!!}%thay vì [{!!}/].
Trái cây Esolanging

Bản dịch của CJam của đệ trình này là {:!:!:+_1>*}.
Trái cây Esolanging

@ Challenger5 lol, làm sao tôi không nhận ra điều đó. Cũng cổng đẹp, tôi chỉ cần học cách đọc nó bây giờ.
Marcos

Sự khác biệt đáng kể trong trường hợp này là 1) tốc ký cho ánh xạ ( :!tương đương với {!}%), 2) tốc ký để giảm ( :+tương đương {+}*), 3) .được đổi thành _(vì CJam có số float) và 4) mà CJam không có đầu vào trên ngăn xếp theo mặc định, có nghĩa là bạn bọc mã {}để biến nó thành hàm.
Esolanging Fruit


1

JavaScript, 25 byte

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

Dựa trên câu trả lời của Leaky Nun.




1

ABCR , 30 byte

Đầu vào ở dạng A,B,Cdấu phẩy có thể được thay thế bằng bất kỳ số không, không phải số nào- ký tự ký tự nào.

BBi7baxci7baxci7bax@7)A7(xxo

Chưa có thông dịch viên trực tuyến, nhưng đây là một lời giải thích:

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

Khử nhiễu , 12 byte

l0EN))A:k?Z+

Hãy thử trực tuyến!

Hơi dựa câu trả lời của Leaky ; sử dụng cùng một tiền đề, nhưng một phương pháp ánh xạ khác nhau.

Làm thế nào nó hoạt động

Deorst có số lần xuất hiện được tích hợp sẵn, nhưng không (vì một số lý do) có lệnh lập chỉ mục, vì vậy tôi phải tạo ánh xạ sau, trong đó bên trái a.count(0)và bên phải là kết quả mong muốn

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

Chương trình tự hoạt động như thế này (ví dụ đầu vào của [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

Thêm ++ , 23 byte

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

Hãy thử trực tuyến!

Dựa trên cả câu trả lời Deorst của tôi câu trả lời Python của Leaky

Làm thế nào nó hoạt động

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]

Tuy nhiên, tôi nghĩ rằng tôi đã sử dụng các hàm quá nhiều trong Add ++, thay vì thân mã chính. Vì vậy, tôi đã cố gắng thực hiện điều này bằng cả hai hàm và thân mã, và kết quả là một mảnh 50 byte đẹp hơn nhiều (vâng, đó là câu trả lời dài nhất ở đây):

# 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

Hãy thử trực tuyến!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.