직사각형 차이


20

이 과제에서는 두 개의 겹치는 사각형이 제공되며, 하나를 다른 사각형에서 제거하여 만든 사각형을 계산해야합니다.

예를 들어, 검은 색 사각형에서 빨간색 사각형을 제거하는 경우 :

직사각형

다음 두 사각형 세트 중 하나로 끝납니다.

스플릿 원 스플릿 투

또한 다음을 처리해야합니다.

모든 테스트 사례

더 명확하게 :

  • A와 B의 두 사각형의 좌표를 입력합니다.
  • B를 사용하지 않고 A의 모든 영역을 덮는 가장 겹치지 않는 사각형을 출력해야합니다. 가능한 모든 덮개가 허용됩니다.
  • 직사각형 좌표는 4 개의 정수로 전달됩니다. 두 쌍 (두 모퉁이 점을 나타냄)으로 전달하거나 4 개의 정수로 구성된 튜플 / 목록으로 전달할 수 있습니다. 입력과 출력이 일관되어야합니다.
  • A와 B가 반드시 겹치거나 닿을 필요는 없으며 각각 1 이상의 면적을 갖습니다

테스트 사례 :

[(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

이것은 이므로 가능한 한 코드를 짧게 만드십시오!



1
우리는 주어진 입력이 있다고 가정 할 수 있습니다 {(x1, y1), (x2, y2)}보유 x1 < x2하고 y1 < y2?
tsh

네. 사각형의 면적은 1이며 원하는 순서대로 좌표를 정렬 할 수 있습니다.
Nathan Merrill

가장자리가 두껍습니까? 정의 된 사각형이 모서리를 포함 할 때?
Евгений Новиков

가장자리의 두께는 0입니다.
Nathan Merrill

답변:


3

파이썬 (2) , 375 (360) 345 343 바이트

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]]

온라인으로 사용해보십시오!

EDITS : @notjagan의 제안에서 -15; 솔루션 사각형의 배열을 int36 형식과 짧은 조회 테이블로 다시 인코딩하여 다른 -15; @musicman에 따라 제품을 p로 교체하여 -2

두 개의 사각형을 취하는 함수로, 각 rect는 ((left, top), (right, bottom))의 튜플입니다. 결과 사각형 목록을 반환합니다.

기본 전략 :

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

위의 다이어그램에서 점 A와 B는 각각 '소스'사각형 (첫 번째 사각형)의 왼쪽 위와 오른쪽 아래입니다.

해당 그리드에서 '마스크'사각형의 왼쪽 (u,v)위와 오른쪽 아래 각각의 위치를 ​​찾습니다 (x,y).

이 두 지점이 첫 번째 또는 마지막 열에있는 경우 또는 첫 번째 또는 마지막 행; 그런 다음 겹침이 없습니다. Source rect 만 반환 할 수 있습니다.

그렇지 않으면 16 건이 남습니다. 예를 들어 OP의 첫 번째 예는 라벨을 지정할 수있는 경우입니다 (1,1),(2,2). 각 경우는 모서리가 항상 왼쪽, 오른쪽 소스 사각형 또는 왼쪽, 오른쪽 마스크 사각형의 가로 값과 좌표가되는 일련의 결과 사각형에 매핑 될 수 있습니다. 수직 값, 소스의 상단, 하단 또는 마스크와 유사합니다.

예를 들어,에 대한 (1,1),(2,2)경우, 사각형이 될 것이다 ((l,t),(T,r))하고 ((l,T),(R,b)), 여기서 l,t,r,bL,T,R,B오른쪽 소스 하단, 좌측 상단되고 각각 직사각형 마스크.

그래서 우리는 좌표를 모든 가능한 조합 세트 ( product(product(*zip(*)))비트에 관한 것) 세트에 각 경우 (골프 압축 해제 후)에 제공 해야하는 직사각형 세트에 매핑하는 룩업 테이블을 만들 수 있습니다 , 나머지 목록에 관한 내용입니다).


다양한 골프 개선을 통해 -15 바이트 또는 Python 3에서 문자열을 사용하여 -18 바이트
notjagan

다음을 수행 p=product하고 교체 product(product하여 두 바이트를 더 잘라낼 수 있습니다.p(p
musicman523

3

자바 스크립트, 115 바이트

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)

겹치는 버전 :

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)

다음 형식으로 입력하십시오. f([1,1,8,8])([0,6,9,9])


((x1, y1), (x2, y2)), ((x3, y3), (x4, y4))로 입력을 나타냅니다.

다음 조건 중 하나라도 충족되면 첫 번째 사각형을 그대로 반환하십시오.

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

그렇지 않으면

  • x1 <x3 <x2이면 직사각형 ((x1, y1), (x3, y2))을 생성합니다. x1 : = x3으로 설정
  • x1 <x4 <x2이면 직사각형 ((x4, y1), (x2, y2))을 생성합니다. x2를 설정하십시오 : = x4
  • y1 <y3 <y2이면 직사각형 ((x1, y1), (x2, y3))을 생성합니다. y1 : = y3으로 설정
  • y1 <y4 <y2이면 직사각형 ((x1, y4), (x2, y2))을 생성합니다. y2를 설정하십시오 : = y4

이것은 유망한 접근법입니다. 그러나 마스크 사각형이 소스 사각형과 겹치지 않을 때 현재 때때로 실패합니다. 예를 들어 f([0, 30, 10, 40])([5, 1, 6, 2])반환해야 [[0, 30, 10, 40]]하지만 대신 반환[[0,30,5,40],[6,30,10,40]]
Chas Brown

@NathanMerrill 좋아, 편집했다.
tsh

@ tsh 좋아 보인다!
Nathan Merrill

1

자바, 268 바이트

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]));}}}}}

언 골프

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]));
                }
            }
        }
    }
}

입력을 인수로 전달하십시오. 예

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

0

파이썬 2 , 272 바이트

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]

온라인으로 사용해보십시오!

이것은 첫 번째 사각형 내부의 모든 셀을 왼쪽 = 1, 위 = 4, 오른쪽 = 2 및 아래 = 8 w / r로 테스트하고 결과를 OR 링하여 작동합니다. 다른 것이 첫 번째와 0과 교차하지 않으면 원본이 반환되고, 그렇지 않으면 왼쪽 슬라이스, 오른쪽 슬라이스, 위쪽 슬라이스 및 아래쪽 슬라이스의 일부 조합이 겹치도록 조정되어 반환됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.