사각형으로 영역을 커버


22

입력

이 과제에 대한 귀하의 입력은 정수 쌍의 목록입니다. 이들은 평면에서 단위 사각형의 남서쪽 모서리를 나타내고 목록은 평면의 하위 집합으로 결합을 나타냅니다. 예를 들어, 목록

[(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)]

이 그림에서 붉은 색 세트를 나타냅니다.

도메인

산출

Yor 출력은 평면의 사각형 부분 집합을 나타내는 정수 4 배의 목록입니다. 보다 명확하게, 4 중 은 남서쪽 모서리가에있는 (x,y,w,h)너비 w > 0와 높이 h > 0의 사각형 을 나타 (x,y)냅니다. 각 사각형은 일부 사각형의 하위 집합이고 각 사각형은 해당 영역의 하위 집합이며 두 사각형은 해당 경계에서만 겹칠 수 있다는 점에서 사각형은 입력 영역을 정확하게 덮어야합니다. 사소한 해결책을 막기 위해, 덮개는 더 큰 사각형으로 병합 될 수있는 두 개의 사각형을 포함해서는 안됩니다.

예를 들어, 목록

[(0,0,2,1),(0,1,3,1),(1,2,2,1)]

법적 취재를 나타냅니다

법적 취재

위의 영역의

[(0,0,2,2),(2,1,1,1),(1,2,1,1),(2,2,1,1)]

인접한 1x1 사각형을 병합 할 수 있으므로 불법입니다.

불법 취재

규칙

당신은 전체 프로그램이나 기능을 제공 할 수 있습니다. 입력 및 출력의 정확한 형식은 이유 내에서 중요하지 않습니다. 가장 짧은 바이트 수가 이기고 표준 허점은 허용되지 않습니다. 알고리즘에 대한 설명과 일부 출력 예를 제공하는 것이 좋습니다.

테스트 사례

U 자형 영역 :

[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(2,0),(2,1),(3,0),(3,1),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5)]

U 자형

큰 삼각형 :

[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(3,0),(3,1),(3,2),(3,3),(3,4),(3,5),(3,6),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(5,0),(5,1),(5,2),(5,3),(5,4),(6,0),(6,1),(6,2),(6,3),(7,0),(7,1),(7,2),(8,0),(8,1),(9,0)]

삼각형

구멍이있는 사각형 :

[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,5),(1,6),(1,7),(1,8),(1,9),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(3,0),(3,1),(3,2),(3,4),(3,5),(3,6),(3,7),(3,8),(3,9),(4,0),(4,1),(4,2),(4,3),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,7),(5,8),(5,9),(6,1),(6,2),(6,3),(6,5),(6,6),(6,7),(6,8),(6,9),(7,0),(7,1),(7,2),(7,3),(7,4),(7,5),(7,6),(7,7),(7,8),(7,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,4),(9,5),(9,6),(9,7),(9,8),(9,9)]

홀드 스퀘어

연결이 끊어진 지역 :

[(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(1,0),(1,1),(1,2),(1,3),(1,4),(1,6),(1,7),(1,8),(1,9),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7),(2,8),(2,9),(4,0),(4,1),(4,2),(4,4),(4,5),(4,6),(4,7),(4,8),(4,9),(5,0),(5,1),(5,2),(5,3),(5,4),(5,5),(5,6),(5,7),(5,8),(5,9),(6,0),(6,1),(6,2),(6,4),(6,5),(6,6),(6,7),(6,8),(6,9),(8,0),(8,1),(8,2),(8,3),(8,4),(8,5),(8,6),(8,7),(8,8),(8,9),(9,0),(9,1),(9,2),(9,3),(9,7),(9,8),(9,9),(10,0),(10,1),(10,2),(10,3),(10,4),(10,5),(10,6),(10,7),(10,8),(10,9)]

연결 해제

검증기

사용 솔루션을 확인하기 위해 파이썬 2 프로그램을. STDIN에서 튜플 목록 (입력)과 사중 목록 (출력)을 쉼표로 구분하여 가져옵니다.

또한 Python 2 프로그램을 작성 하여 그림을 생성하고 사용할 수도 있습니다. STDIN에서 튜플 또는 쿼드 러플 목록을 가져 와서라는 파일을 생성합니다 out.png. PIL 라이브러리가 필요합니다. 원하는 경우 격자 셀의 크기와 거드 선의 너비도 변경할 수 있습니다.

답변:


12

파이썬 : 196 193182 문자

def g(r):
 for p in r:
  for q in r:
   for h in 0,1:
    if p[h::2]==q[h::2]and p[1-h]+p[~h]==q[1-h]:p[~h]+=q[~h];r.remove(q);return g(r)
 return r
f=lambda P:g([x+[1,1]for x in P])

첫 번째 솔루션은 KSFT와 동일한 알고리즘을 사용했기 때문에 다른 방법을 실험했습니다.

먼저 전처리를하고 모든 점을 작은 1x1 사각형으로 변환합니다 {x+(1,1)for x in P}. 이 사각형으로 함수를 호출합니다 g. g사각형의 각 조합을 반복합니다. 더 큰 직사각형으로 병합 될 수있는 두 개의 직사각형을 찾으면 두 직사각형을 모두 삭제하고 새 직사각형을 추가합니다. 그런 다음 새로운 사각형 집합으로 자신을 호출합니다.

용법

f([[0,0],[1,0],[0,1],[1,1],[2,1],[1,2],[2,2]])

결과

결과의 시각화는 다음과 같습니다. 현재 버전에서는 약간 다를 수 있습니다. 그러나 눈에 띄는 패턴은 없다.

U 자형 영역 :

큰 삼각형

구멍이있는 사각형 :

연결이 끊어진 지역 :

재미로만 : Pyth : 73 69 자

D!HFGHFZHV2I&q%2>GN%2>ZNqs%2>G-1N@Z-1N X-3NG@Z-3NR!-H]Z)))RH!m+d*2]1Q

오프라인 버전에서만 작동합니다. 온라인 버전의 버그가 수정되었습니다. Pyth Compiler / Executor 에서 사용해보십시오 . 튜플 목록이 아닌 목록 목록이 필요합니다.

편집 : @ edc65의 아이디어를 사용했습니다. 두 사각형을 모두 삭제하고 새 사각형을 만드는 대신 하나를 조작하고 하나만 삭제합니다. 파이썬 솔루션에서 나는 세트와 튜플리스트 튜플 캐스트를 탈 수있었습니다. Python에서 -11 문자 / Pyth에서 -4 문자


2
Python3 : 웃는 얼굴이 이제 유효한 코드입니다.
flawr

제가 틀릴 수도 있지만, 난 당신이 바꿀 수 생각 3-h~h?
Sp3000

Pyth 버전에 허용됩니다.
Zgarb 2019

14

파이썬 - 272 261 258 251 224

골프를 더 할 수있을 것 같아요. 나는 이것이 효과가 있다고 확신하지만 아직 모든 테스트 사례에서 테스트를 완료하지 않았습니다. 테스트를 마쳤습니다. 모든 테스트 사례에서 작동합니다.

a=sorted(input())
b=[]
r=range
for i in a:
 c=set(a)-set(b);w=h=1;x,y=i
 if i in b:continue
 while not{(x,y+h)}-c:h+=1
 while all((x+w,y+j)in c for j in r(h)):w+=1
 for j in r(w):
  for k in r(h):b+=(j+x,k+y),
 print x,y,w,h

결과 이미지를 추가하려고합니다. 편집 : 예제 및 테스트 사례의 결과는 다음과 같습니다.

출력 예 테스트 사례 1 출력 테스트 사례 2 출력 테스트 사례 3 출력 테스트 케이스 4 출력

나는 이것을 Perl로 쓰려고 노력하고 있지만, 많은 수의 문자없이 stdin에서 다차원 배열을 얻는 방법을 알 수 없습니다. 누구든지 제안이 있습니까?


두 가지 : (i[0]+w,i[1]+j)not in c{(i[0]+w,i[1]+j)}-c이동할 수 있고 w=h=1받는 c=set(a)-set(b)라인
SP3000

조금 더 : b+=[(j+i[0],k+i[1])]를 세 번 b+=(j+i[0],k+i[1]),사용 range하면 할당 시간이 짧아집니다r=range
Sp3000

또한, 저는 잘 모르겠지만, 그것은 할 수 있습니다 x,y=i사용하여 다음 xy대신 i[0]i[1]? 많은 바이트를 절약 할 수 있습니다.
Sp3000

이이 테스트,하지만 난 그것을 작동 생각하지 : 대신에 while not[j for j in r(h)if(x+w,y+j)not in c]:w+=1사용 while all((x+w,y+j)in c for j in r(h)):w+=1.
Jakube

@ Sp3000 / Jakube 나는 당신의 모든 제안을 사용했습니다.
KSFT

8

파이썬 2, 139

이 프로그램은 표준 입력에서 중괄호로 묶인 순서 쌍의 목록을 허용합니다. 예 :{(0,0),(1,0),(0,1),(1,1),(2,1),(1,2),(2,2)}

s=input()
while s:x,y=min(s);w=h=0;exec"while(x+w,y)in s:w+=1\nwhile%s<=s:s-=%s;h+=1"%(("{(X,y+h)for X in range(x,x+w)}",)*2);print x,y,w,h

파이썬이 루프 테스트 내부에서 할당을 허용하지 않는 것은 종종 골프 에서뿐만 아니라 자극적입니다. 이 문제를 해결하기 위해 문자열 형식화 작업을 사용했습니다.


인상적입니다. KSFT와 동일한 알고리즘으로 'only'85 (!!!)자가 더 짧습니다.
Jakube

5

매스 매 티카 - 315 285 267 바이트

f=(r={};For[m=MemberQ;t=Table;s=Sort@#,s!={},For[{x,y,w,h}=#~Join~{1,1}&@@s;i=j=0,i<1||j<1,If[s~m~{x+w,y+a-1}~t~{a,h}==True~t~{h},w++,i++];If[s~m~{x+a-1,y+h}~t~{a,w}==True~t~{w},h++,j++]];s=s~Cases~_?(!m[Join@@t[{x+a,y+b}-1,{a,w},{b,h}],#]&);r~AppendTo~{x,y,w,h}];r)&

@ MartinBüttner의 도움이 필요합니다.

언 골프 드 :

f = (
    rectangles = {};
    For[squares = Sort[#], squares != {},
        For[{x, y, w, h} = Join[squares[[1]], {1, 1}]; i = j = 0, i < 1 || j < 1,
            If[Table[MemberQ[squares, {x + w, y + a - 1}], {a, h}] == Table[True, {h}], w++, i++];
            If[Table[MemberQ[squares, {x + a - 1, y + h}], {a, w}] == Table[True, {w}], h++, j++];
        ];
        squares = Cases[squares, _ ? (!MemberQ[Join@@Table[{x + a - 1, y + b - 1}, {a, w}, {b, h}], #] &)];
        AppendTo[rectangles, {x, y, w, h}]
    ];
    rectangles
)&

용법:

In: f @ {{0,0},{1,0},{0,1},{1,1},{2,1},{1,2},{2,2}}
Out: {{0, 0, 2, 2}, {1, 2, 2, 1}, {2, 1, 1, 1}}

여기에 이미지 설명을 입력하십시오

테스트 사례

U 자형 영역

여기에 이미지 설명을 입력하십시오

{{0, 0, 6, 2}, {0, 2, 2, 4}, {4, 2, 2, 4}}

큰 삼각형

여기에 이미지 설명을 입력하십시오

{{0, 0, 6, 5}, {0, 5, 3, 3}, {0, 8, 2, 1}, {0, 9, 1, 1}, {3, 5, 2, 1}, {3, 6, 1, 1}, {6, 0, 3, 2}, {6, 2, 2, 1}, {6, 3, 1, 1}, {9, 0, 1, 1}}

구멍이있는 사각형

여기에 이미지 설명을 입력하십시오

{{0, 0, 6, 3}, {0, 3, 3, 6}, {1, 9, 9, 1}, {3, 4, 3, 2}, {3, 6, 2, 3}, {4, 3, 6, 1}, {5, 7, 5, 2}, {6, 1, 4, 2}, {6, 5, 4, 2}, {7, 0, 3, 1}, {7, 4, 3, 1}}

연결이 끊어진 지역

여기에 이미지 설명을 입력하십시오

{{0, 0, 2, 5}, {0, 5, 1, 4}, {1, 6, 2, 4}, {2, 1, 1, 5}, {4, 0, 3, 3}, {4, 4, 3, 6}, {5, 3, 1, 1}, {8, 0, 3, 4}, {8, 4, 1, 6}, {9, 7, 2, 3}, {10, 4, 1, 3}}

4

하스켈, 158

f[]=[]
f s@((x,y):_)=(x,y,w-x,h-y):f[r|r@(a,b)<-s,a<x||a>=w||b<y||b>=h]where w=[i|i<-[x..],notElem(i,y)s]!!0;h=[i|i<-[y..],not$all(\x->elem(x,i)s)[x..w-1]]!!0

테스트 사례와 이미지가 곧 제공 될 예정입니다.

알고리즘 : 첫 번째 사각형을 사용하십시오. 입력에없는 사각형을 만나지 않고 가장 오른쪽에 도달하십시오. 그런 다음 입력에 사각형이없는 한 최대한 멀리 도달하십시오. 이제 사각형이없는 사각형이 생겼습니다. 출력에 추가하고 입력에서 모든 사각형을 제거하고 재귀 적으로 호출하십시오.


로 교체 not$all(\x->elem(x,i)s)하여 1 바이트를 절약 할 수 있습니다 any(\x->notElem(x,i)s).
nimi

4

자바 스크립트 (ES6) 148 155 199

Edit2가 좀 더 튜닝
편집 일부 골프 + 재귀를 사용하여 재 작성. 그러한 감소를 기대하지 않았습니다. 이제 따르기가 약간 어렵지만 알고리즘은 동일합니다.

알고리즘은 @jakube answer와 유사합니다.

  1. 각 점은 1x1 정사각형이됩니다 (전처리)
  2. 각 요소마다 다른 요소와 병합 할 수 있는지 확인하십시오.
    예? 첫 번째 요소가 커지고 두 번째 요소가 지워지고 2 단계에서 다시 시작하십시오.
    그렇지 않으면 다음 요소로 진행하십시오.
F=l=>
  (l.map(x=>x.push(1,1)),R=f=>
    l.some(u=>
      (l=l.filter(t=>
        [0,1].every(p=>u[p]-t[p]|u[p^=2]-t[p]|u[p^=3]-t[p]+u[p^=2]||!(f=u[p]+=t[p]))
      ),f)
    )?R():l
  )()

스 니펫에서 테스트

F=l=>(l.map(x=>x.push(1,1)),R=f=>l.some(u=>(l=l.filter(t=>[0,1].every(p=>u[p]-t[p]|u[p^=2]-t[p]|u[p^=3]-t[p]+u[p^=2]||!(f=u[p]+=t[p]))),f))?R():l)()

// Test
MyCanvas.width= 600;
MyCanvas.height = 220;
var ctx = MyCanvas.getContext("2d");
ctx.fillStyle="#f23";

Draw=(x,y,f,l)=>l.forEach(p=>ctx.fillRect(x+p[0]*f,y+p[1]*f,p[2]*f-1||f-1,p[3]*f-1||f-1));

test=[
[[0,0],[1,0],[0,1],[1,1],[2,1],[1,2],[2,2]],
[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[2,0],[2,1],[3,0],[3,1],[4,0],[4,1],[4,2],[4,3],[4,4],[4,5],[5,0],[5,1],[5,2],[5,3],[5,4],[5,5]],
[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[0,9],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8],[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[4,0],[4,1],[4,2],[4,3],[4,4],[4,5],[5,0],[5,1],[5,2],[5,3],[5,4],[6,0],[6,1],[6,2],[6,3],[7,0],[7,1],[7,2],[8,0],[8,1],[9,0]],
[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[1,8],[1,9],[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[2,8],[2,9],[3,0],[3,1],[3,2],[3,4],[3,5],[3,6],[3,7],[3,8],[3,9],[4,0],[4,1],[4,2],[4,3],[4,4],[4,5],[4,6],[4,7],[4,8],[4,9],[5,0],[5,1],[5,2],[5,3],[5,4],[5,5],[5,7],[5,8],[5,9],[6,1],[6,2],[6,3],[6,5],[6,6],[6,7],[6,8],[6,9],[7,0],[7,1],[7,2],[7,3],[7,4],[7,5],[7,6],[7,7],[7,8],[7,9],[8,0],[8,1],[8,2],[8,3],[8,4],[8,5],[8,6],[8,7],[8,8],[8,9],[9,0],[9,1],[9,2],[9,3],[9,4],[9,5],[9,6],[9,7],[9,8],[9,9]],
[[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[0,8],[1,0],[1,1],[1,2],[1,3],[1,4],[1,6],[1,7],[1,8],[1,9],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[2,8],[2,9],[4,0],[4,1],[4,2],[4,4],[4,5],[4,6],[4,7],[4,8],[4,9],[5,0],[5,1],[5,2],[5,3],[5,4],[5,5],[5,6],[5,7],[5,8],[5,9],[6,0],[6,1],[6,2],[6,4],[6,5],[6,6],[6,7],[6,8],[6,9],[8,0],[8,1],[8,2],[8,3],[8,4],[8,5],[8,6],[8,7],[8,8],[8,9],[9,0],[9,1],[9,2],[9,3],[9,7],[9,8],[9,9],[10,0],[10,1],[10,2],[10,3],[10,4],[10,5],[10,6],[10,7],[10,8],[10,9]]
]

Draw(0,0,10,test[0]),Draw(0,110,10,F(test[0]))
Draw(50,0,10,test[1]),Draw(50,110,10,F(test[1]))
Draw(130,0,10,test[2]),Draw(130,110,10,F(test[2]))
Draw(250,0,10,test[3]),Draw(250,110,10,F(test[3]))
Draw(370,0,10,test[4]),Draw(370,110,10,F(test[4]))
<canvas id=MyCanvas></canvas>


3

매쓰, 153 151 144 136 133

Sort[{##,1,1}&@@@Input[]]//.{a___,r:{x_,y_,__},b___,{X_,Y_,W_,H_},c___}/;r=={x,Y,X-x,H}||r=={X,y,W,Y-y}:>{a,r+Sign@{0,0,X-x,Y-y},b,c}

예:

입력:

{{0, 0}, {1, 0}, {0, 1}, {1, 1}, {2, 1}, {1, 2}, {2, 2}}

산출:

{{0, 0, 2, 2}, {1, 2, 2, 1}, {2, 1, 1, 1}}

여기에 이미지 설명을 입력하십시오

입력:

{{0, 0}, {0, 1}, {0, 2}, {0, 3}, {0, 4}, {0, 5}, {0, 6}, {0, 7}, {0, 8}, {1, 0}, {1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, 5}, {1, 6}, {1, 7}, {1, 8}, {1, 9}, {2, 0}, {2, 1}, {2, 2}, {2, 3}, {2, 4}, {2, 5}, {2, 6}, {2, 7}, {2, 8}, {2, 9}, {3, 0}, {3, 1}, {3, 2}, {3, 4}, {3, 5}, {3, 6}, {3, 7}, {3, 8}, {3, 9}, {4, 0}, {4, 1}, {4, 2}, {4, 3}, {4, 4}, {4, 5}, {4, 6}, {4, 7}, {4, 8}, {4, 9}, {5, 0}, {5, 1}, {5, 2}, {5, 3}, {5, 4}, {5, 5}, {5, 7}, {5, 8}, {5, 9}, {6, 1}, {6, 2}, {6, 3}, {6, 5}, {6, 6}, {6, 7}, {6, 8}, {6, 9}, {7, 0}, {7, 1}, {7, 2}, {7, 3}, {7, 4}, {7, 5}, {7, 6}, {7, 7}, {7, 8}, {7, 9}, {8, 0}, {8, 1}, {8, 2}, {8, 3}, {8, 4}, {8, 5}, {8, 6}, {8, 7}, {8, 8}, {8, 9}, {9, 0}, {9, 1}, {9, 2}, {9, 3}, {9, 4}, {9, 5}, {9, 6}, {9, 7}, {9, 8}, {9, 9}}

산출:

{{0, 0, 3, 9}, {1, 9, 9, 1}, {3, 0, 3, 3}, {3, 4, 1, 5}, {4, 3, 1, 6}, {5, 3, 1, 3}, {5, 7, 1, 2}, {6, 1, 1, 3}, {6, 5, 1, 4}, {7, 0, 3, 9}}

여기에 이미지 설명을 입력하십시오

연산:

영역을 단위 사각형으로 덮은 다음 병합하십시오.

여기에 이미지 설명을 입력하십시오

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