Liệu dòng này đi qua hình vuông đó?


19

Chia góc phần tư thứ nhất (bao gồm trục x dương, trục y dương và gốc) thành các lưới 1x1, với mỗi lưới được dán nhãn bởi tọa độ của góc dưới bên trái của nó, như được minh họa dưới đây:

Lưu ý rằng mỗi lưới chứa ranh giới và các đỉnh của nó. Sử dụng các ký hiệu toán học, lưới có nhãn (m, n) sẽ đại diện cho hình vuông {(x,y) | m ≤ x ≤ m+1, n ≤ y ≤ n+1}.


Cho một đường thẳng dưới dạng ax+by+c=0với các số nguyên a, bc, và một lưới được biểu thị bằng (m,n), xuất ra liệu đường thẳng đó có đi qua lưới hay không, tức là có bất kỳ điểm nào trong lưới đã cho nằm trên đường thẳng hay không.


a  b  c m n output
1  1  0 0 0 true
1  1  0 1 1 false
1  1  0 0 2 false
1  1 -3 0 1 true
1  1 -3 0 0 false
2 -1  0 1 1 true
2 -1  0 1 0 false
2 -1  0 0 2 true
2 -1  0 0 1 true
2 -1  0 1 2 true
2  0 -1 0 0 true
2  0 -1 0 1 true
2  0 -1 0 2 true
2  0 -1 1 0 false
2  0 -1 1 1 false
0  2 -1 0 0 true
0  2 -1 1 0 true
0  2 -1 2 0 true
0  2 -1 0 1 false
0  2 -1 1 1 false
1  0 -1 0 0 true
1  0 -1 0 1 true
1  0 -1 0 2 true
1  0 -1 1 0 true
1  0 -1 1 1 true

Xin đề nghị thêm testcase trong các ý kiến.


Đây là . Câu trả lời ngắn nhất trong byte thắng. Tiêu chuẩn áp dụng.


1
Tất nhiên chúng ta có thể giả sử rằng không phải cả a và b đều bằng 0, vì khi đó nếu c bằng 0 thì có thể có các dòng vô hạn trong khi nếu c khác không thì không thể có dòng nào cả.
Erik the Outgolfer

Tôi có thể nhận đầu vào là hai hoặc nhiều mảng, giả sử [a, b, c](dòng) và [m, n](hình vuông) không?
Erik the Outgolfer

@EriktheOutgolfer Tôi ngạc nhiên rằng không có trong meta.
Rò rỉ Nun


Câu trả lời:


5

Python 3, 84 66 byte

Golf đầu tiên, thất bại đầu tiên (có thể).

Cảm ơn Rod đã loại bỏ 18 byte bằng cách sử dụng chức năng thay vì nhập trực tiếp.

def f(a,b,c,m,n):f=-(a*m+c)/b;g=f-a/b;print(min(f,g)<=n<=max(f,g))

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

Giải trình:

Về cơ bản, chúng tôi tính giá trị của hàm dòng cho m và m + 1, nếu n nằm giữa các giá trị, thì danh sách phải đi qua nó tại một số điểm. Sẽ tốt hơn nhiều nếu ngôn ngữ có một số cách đơn giản hơn để nhập nhiều số nguyên.



2
Chào mừng đến với PPCG!
betseg

1
Điều này có cần phải kiểm tra so với n + 1 cũng như m + 1 không?
Neil

3
Chia cho số 0 khi b0.
Olivier Grégoire

Ngoài ra, nó không vượt qua một số trường hợp thử nghiệm được đánh dấu bởi Leaky Nun.
Olivier Grégoire

5

Thạch , 10 byte

ż‘{Œpæ.ṠE¬

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

Lý lịch

Giống như các câu trả lời khác trước tôi, điều này phụ thuộc vào thực tế là một đường thẳng chia mặt phẳng thành hai mặt phẳng. Hình chữ nhật hoặc được chứa trong một trong các mặt phẳng bán này (không có giao điểm với đường thẳng) hoặc giao nhau cả hai bán nguyệt (và do đó đường phân cách chúng.

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

ż‘{Œpæ.ṠE¬  Main link. Left argument: [m, n]. Right argument: [a, b, c]

 ‘{         Increment left; yield [m+1, n+1].
ż           Zipwith; yield [[m, m+1], [n, n+1]].
   Œp       Cartesian product; yield [[m, n], [m, n+1], [m+1, n], [m+1, n+1]].
     æ.     Take the dot products with [a, b, c], mapping each [x, y] to ax+by+c.
       Ṡ    Take the signs.
        E   Test the signs for equality.
         ¬  Logical NOT.

4

Python 2 , 59 byte

lambda a,b,c,m,n:min(0,a,b,a+b)<=-a*m-b*n-c<=max(0,a,b,a+b)

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

Chúng ta có thể cho biết phía nào của một điểm là dấu hiệu của a*x+b*y+c. Đường thẳng đi qua hình vuông (đếm chạm) trừ khi cả bốn đỉnh (m,n),(m,n+1),(m+1,n),(m+1,n+1)đều nằm cùng một phía của đường thẳng. Chúng ta có thể cắm các giá trị này vào một trích xuất ra hằng số a*m+b*n+cxuất hiện trong cả bốn:

a*m+b*n+c
a*m+b*n+c+a
a*m+b*n+c+b
a*m+b*n+c+a+b

Vì vậy, đường thẳng đi qua hình vuông trừ khi bốn giá trị này đều dương hoặc tất cả âm. Vì vậy, nó đủ cho tối thiểu của họ là <=0và tối đa là được >=0.

min(a*m+b*n+c,a*m+b*n+c+a,a*m+b*n+c+b,a*m+b*n+c+a+b)<=0<=max(a*m+b*n+c,a*m+b*n+c+a,a*m+b*n+c+b,a*m+b*n+c+a+b)

Trừ đi điểm chung a*m+b*n+ctừ mỗi phần sẽ cho mã.

Cách tiếp cận dài hơn một chút là kiểm tra xem tập hợp các dấu (+, 0, -) có độ dài ít nhất là 2 hay không.

Python 2 , 62 byte

lambda a,b,c,m,n:len({cmp(a*m+b*n+c,-d)for d in(0,a,b,a+b)})>1

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


3

Toán học, 60 55 byte

Solve[m#+n#2==-#3&&#4<=m<=#4+1&&#5<=n<=#5+1,{m,n}]!={}&

-5 byte sox đến @MartinEnder

hình thức đầu vào

[a, b, c, m, n]


2
À, tôi ước mọi ngôn ngữ đều có Solvechức năng ...
Erik the Outgolfer

3

Mẻ, 66 byte

@cmd/cset/a"q=%1*%4+%2*%5+%3,((-(q+%1)*(q+%2)&-q*(q+%1+%2))>>31)+1

Giải thích: Chúng tôi xem xét các giá trị được thực hiện bởi phương trình ở bốn góc của ô. Nếu dòng không giao nhau với ô, thì cả bốn giá trị đều có cùng một dấu, nhưng nếu nó giao nhau với ô, thì ít nhất một giá trị sẽ bằng 0 hoặc dấu ngược lại. Việc so sánh được đơn giản hóa bằng cách nhân các cặp góc đối diện, sau đó nếu cả hai giá trị đều dương thì đường thẳng không giao nhau với ô. Một số twiddling sau đó chuyển đổi các phép nhân thành một kết quả tổng thể.


1

Toán học, 50 byte

-4<Tr@Sign[Tuples@{{#,#+1},{#2,#2+1}}.{##4}+#3]<4&

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

Lấy m, n, c, a, blàm đầu vào theo thứ tự đó.

Giải thích: lập Tuples@{{#,#+1},{#2,#2+1}}danh sách tọa độ của bốn góc của hình vuông, sau đó lấy sản phẩm chấm với .{##4}(có nghĩa là {#4, #5}) và thêm +#3tính toán ax + by + ccho x,ymỗi góc. Nếu dòng đi qua điểm, đây là số không; nếu dòng này xa nguồn gốc, nó âm tính; và nếu dòng gần với điểm gốc, thì nó dương - do đó chúng tôi kiểm tra Signs của bốn giá trị này. Dòng đi ra ngoài hình vuông khi và chỉ khi cả bốn giá trị là 1 hoặc cả bốn giá trị là -1, vì vậy chúng tôi kiểm tra xem tổng của chúng có nằm trong khoảng từ -4 đến 4 không.

(Câu trả lời này được lấy cảm hứng mơ hồ từ câu trả lời của tôi cho câu hỏi này .)



1

Python , 54 byte

lambda a,b,c,m,n:abs(2*(a*m+b*n+c)+a+b)<=abs(a)+abs(b)

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

(Cảm ơn xnor về kịch bản thử nghiệm.)

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

Dòng đi qua m + 1/2 + x , n + 1/2 + y khi và chỉ khi

a ⋅ ( m + 1/2 + x ) + b ( n + 1/2 + y ) + c = 0
⇔ 2⋅ ( am + bn + c ) + a + b = −2⋅ ax - 2⋅ by .

Điều này có thể cho một số | x |, | y | ≤ 1/2 khi và chỉ khi | 2⋅ ( am + bn + c ) + a + b | ≤ | một | + | b |.


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.