Hình chữ nhật khác nhau


20

Trong thử thách này, bạn được cung cấp hai hình chữ nhật chồng chéo và bạn cần tính toán các hình chữ nhật được tạo bằng cách xóa cái này khỏi cái kia.

Ví dụ: nếu bạn xóa hình chữ nhật màu đỏ khỏi hình đen:

hình chữ nhật

Bạn kết thúc với một trong hai bộ hình chữ nhật sau:

chia một chia hai

Bạn cũng cần xử lý như sau:

Tất cả các trường hợp thử nghiệm

Nói rõ hơn:

  • Bạn sẽ nhập tọa độ của hai hình chữ nhật A và B.
  • Bạn cần xuất ra một số hình chữ nhật không chồng lấp nhất bao phủ tất cả diện tích của A mà không có B. Mọi sự che phủ có thể được cho phép
  • Tọa độ hình chữ nhật được truyền dưới dạng 4 số nguyên. Bạn có thể vượt qua chúng thành hai cặp (đại diện cho hai điểm góc) hoặc dưới dạng một bộ / danh sách gồm 4 số nguyên. Đầu vào và đầu ra của bạn cần phải nhất quán.
  • A và B sẽ không nhất thiết phải chồng chéo hoặc chạm vào nhau và mỗi vùng sẽ có diện tích ít nhất là 1

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

[(0 0) (5 5)] [(3 4) (8 7)]   -> [(0 0) (5 4)] [(0 4) (3 5)] # or [(0 0) (3 5)] [(3 0) (5 4)]
[(2 4) (10 11)] [(5 5) (6 6)]  -> [(2 4) (10 5)] [(2 5) (5 6)] [(6 5) (10 6)] [(2 6) (10 11)]    #Other sets of 4 rectangles are possible
[(3 3) (8 8)] [(0 1) (10 8)]   ->    #No rectangles should be output
[(0 0) (5 5)] [(1 1) (10 2)]   -> [(0 0) (1 5)] [(1 0) (2 1)] [(2 0) (5 5)]  #Other sets of 3 rectangles are possible
[(1 5) (7 8)] [(0 0) (1 10)]   -> [(1 5) (7 8)]  #Only possible output
[(4 1) (10 9)] [(2 5) (20 7)]   -> [(4 1) (10 5)] [(4 7) (10 9)]  #Only possible output
[(1 1) (8 8)] [(0 6) (9 9)]     -> [(1 1) (8 6)]   #Only possible output

Đây là một , vì vậy hãy làm cho mã của bạn càng ngắn càng tốt!



1
chúng ta có thể giả định rằng đầu vào đã {(x1, y1), (x2, y2)}cho giữ x1 < x2y1 < y2?
tsh

Vâng. Hình chữ nhật sẽ có diện tích là 1 và bạn có thể sắp xếp tọa độ theo bất kỳ thứ tự nào bạn muốn.
Nathan Merrill

Là cạnh dày? Khi hình chữ nhật được xác định là bao gồm cạnh?
Евгений Новиков

Các cạnh có độ dày 0.
Nathan Merrill

Câu trả lời:


3

Python 2 , 375 360 345 343 byte

from itertools import*;P=product
def f(S,M):(l,t),(r,b)=S;(L,T),(R,B)=M;u,v,x,y=(L>=r)+(l<L),(T>=b)+(t<T),(R>=r)+(l<R),(B>=b)+(t<B);return[S]if v==y!=1or u==x!=1else[list(p(p(*zip(*(S+M))),repeat=2))[[43,197,6,199,9,231,142,229,53,189,134,181][int(i,36)]]for i in '38,491,258,2058,8,4B,28,208,7,41,27,461,,4,2,4A'.split(',')[u+2*v+4*x+8*y-12]]

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

EDITS: -15 từ các đề xuất từ ​​@notjagan; khác -15 bằng cách mã hóa lại mảng hình chữ nhật giải pháp thành định dạng int36 và bảng tra cứu ngắn; -2 khác bằng cách thay thế sản phẩm bằng p theo @musicman.

Một hàm lấy hai hình chữ nhật, mỗi trực tràng là một tuple của ((trái, trên cùng), (phải, dưới)); trả về một danh sách các hình chữ nhật kết quả.

Chiến lược cơ bản:

     |     |
 0,0 | 1,0 | 2,0
-----A-----+-----
     |     |
 0,1 | 1,1 | 2,1
-----+-----B-----
     |     |
 0,2 | 1,2 | 2,2
     |     |

Trong sơ đồ trên, các điểm A và B lần lượt là phía trên bên trái và phía dưới bên phải của hình chữ nhật 'Nguồn' (chỉnh lưu đầu tiên).

Chúng tôi tìm thấy vị trí của mỗi hình trên bên trái (u,v)và bên phải (x,y)của hình chữ nhật 'Mặt nạ' trong lưới đó.

Nếu cả hai điểm này nằm trong cột đầu tiên hoặc cuối cùng; hoặc hàng đầu tiên hoặc cuối cùng; sau đó không có sự chồng chéo; và chúng ta có thể trả về nguồn trực tiếp.

Nếu không, có 16 trường hợp còn lại; ví dụ, ví dụ đầu tiên của OP là trường hợp chúng ta có thể dán nhãn (1,1),(2,2). Mỗi trường hợp có thể được ánh xạ tới một tập hợp các hình chữ nhật có kết quả có các góc luôn tọa độ với các giá trị nằm ngang trong các hình chữ nhật Nguồn bên trái, bên phải hoặc hình chữ nhật Mặt nạ bên trái, bên phải; và tương tự cho các giá trị dọc, đỉnh, đáy hoặc mặt nạ của Nguồn.

Ví dụ, đối với (1,1),(2,2)trường hợp, hình chữ nhật sẽ là ((l,t),(T,r))((l,T),(R,b)), ở đâu l,t,r,bL,T,R,Blà hình chữ nhật bên trái, trên cùng, bên phải và dưới cùng của hình chữ nhật Nguồn và Mặt nạ.

Vì vậy, chúng ta có thể tạo một bảng tra cứu ánh xạ tọa độ thành tập hợp của tất cả các kết hợp có thể có (đó là những gì về product(product(*zip(*)))bit) cho một tập hợp các hình chữ nhật cần được cung cấp cho mỗi trường hợp (sau khi giải nén golf , là những gì phần còn lại của danh sách là về).


-15 byte bằng cách thực hiện nhiều cải tiến chơi gôn khác nhau, hoặc -18 byte bằng cách sử dụng các chuỗi trong Python 3.
notjagan

Bạn có thể cắt thêm hai byte bằng cách thực hiện p=productvà thay thế product(productbằngp(p
musicman523

3

JavaScript, 115 byte

f=a=>b=>b.some((n,i)=>(a[i^2]<n)^i/2)?[a]:b.map((n,i)=>a[i&1]<n&&n<a[i|2]&&(p=[...a],p[i^2]=a[i]=n,p)).filter(x=>x)

phiên bản chồng chéo:

f=a=>b=>b.some((n,i)=>(a[i^2]<n)^i/2)?[a]:b.map((n,i)=>a[i&1]<n&&n<a[i|2]&&(p=[...a],p[i^2]=n,p)).filter(x=>x)

Nhập theo định dạng sau: f([1,1,8,8])([0,6,9,9])


Suy ra đầu vào là ((x1, y1), (x2, y2)), ((x3, y3), (x4, y4))

Nếu bất kỳ một trong các điều kiện sau được đáp ứng, hãy trả về hình chữ nhật đầu tiên như:

  • x3> x2
  • x4 <x1
  • y3> y2
  • y4 <y1

nếu không thì

  • Nếu x1 <x3 <x2 thì ta tạo một hình chữ nhật ((x1, y1), (x3, y2)); và đặt x1: = x3
  • Nếu x1 <x4 <x2 thì ta tạo một hình chữ nhật ((x4, y1), (x2, y2)); và đặt x2: = x4
  • Nếu y1 <y3 <y2 thì ta tạo một hình chữ nhật ((x1, y1), (x2, y3)); và đặt y1: = y3
  • Nếu y1 <y4 <y2 thì chúng ta tạo một hình chữ nhật ((x1, y4), (x2, y2)); và đặt y2: = y4

Đây là một cách tiếp cận đầy hứa hẹn; nhưng hiện tại đôi khi nó thất bại, ví dụ, khi hình chữ nhật Mặt nạ không trùng với hình chữ nhật Nguồn; ví dụ: f([0, 30, 10, 40])([5, 1, 6, 2])nên trả lại [[0, 30, 10, 40]]nhưng thay vào đó trả lại[[0,30,5,40],[6,30,10,40]]
Chas Brown

@NathanMerrill ok, đã chỉnh sửa.
tsh

@tsh có vẻ tốt!
Nathan Merrill

1

Java, 268 byte

class W{public static void main(String[]z) {int a[]={0,0,0,0},i,j,y[]={0,1,4,3,6,1,2,3,4,1,6,5,4,7,6,3};for(i=0;i<4;i+=1){for(j=0;j<4;j+=1){a[j]=Integer.parseInt(z[y[i*4+j]]);}if(a[0]<a[2] && a[1]<a[3]){for(j=0;j<4;j+=1){System.out.println(String.valueOf(a[j]));}}}}}

Ung dung

class W{
    public static void main(String[]z) {
        int a[]={0,0,0,0},i,j,y[]={0,1,4,3,6,1,2,3,4,1,6,5,4,7,6,3};

        for(i=0;i<4;i+=1){
            for(j=0;j<4;j+=1){
                a[j]=Integer.parseInt(z[y[i*4+j]]);
            }
            if(a[0]<a[2] && a[1]<a[3]){
                for(j=0;j<4;j+=1){
                    System.out.println(String.valueOf(a[j]));
                }
            }
        }
    }
}

Truyền đầu vào dưới dạng đối số. Thí dụ

java -jar W.jar 0 0 5 5 3 4 8 7

0

Python 2 , 272 byte

lambda((a,b),(c,d)),((e,f),(g,h)):[([([[(a,b),(e,min(h,d))]]+[[(g,max(b,f)),(c,d)]]*2+[[(max(a,e),b),(c,f)]]*4+[[(a,h),(min(c,g),d)]])[m-1]for m in M&{1,2,4,8}]if M&{0}else[(a,b),(c,d)])for M in[{(x<e)*1+(x>g)*2+(y<f)*4+(y>h)*8 for x in range(a,c)for y in range(b,d)}]][0]

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

Điều này hoạt động bằng cách kiểm tra mọi ô bên trong hình chữ nhật đầu tiên cho độ trái = 1, aboveness = 4, rightness = 2 và belowness = 8 w / r cho cái kia và ORing kết quả. Nếu cái kia không giao nhau = 0 với cái đầu tiên, thì bản gốc được trả về, nếu không, một số kết hợp của một lát bên trái, lát bên phải, lát trên và lát dưới được trả về, với chỗ ở để chồng lấp.

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.