외부와 얼마나 멀어요?


15

중심이 정수 간격으로 정렬 된 축 정렬 단위 사각형 요소로 나눈 2D 공간 영역을 가져옵니다. 모서리는 두 요소가 공유하는 경우 내부라고하며, 그렇지 않으면 외부 모서리입니다.

당신의 목표는로 알려진 각 요소의 중심에서 시작하여 외부 가장자리에 도달하기 위해 통과해야 이웃 요소의 최소 수를 찾을 수 있습니다 traversal distance, 또는 distance짧은합니다. 모서리 만 통과 할 수 있습니다 (예 : 코너 절단 / 대각선 이동). "외부 요소"(적어도 하나의 외부 모서리가있는 요소)는 외부 모서리 0에 도달하기 위해 인접한 요소를 횡단해야하는 것으로 간주됩니다 .

입력

입력은 모든 요소 중심의 (x, y)를 나타내는 음이 아닌 정수 쌍 좌표의 목록입니다. 겹치는 요소가 없다고 가정합니다 (즉, x / y 쌍은 요소를 고유하게 식별합니다). 당신은 할 수 없는 요소 입력 순서에 대해 아무것도 가정합니다.

입력 원점을 임의의 위치 (예 : 0,0 또는 1,1 등)로 변환 할 수 있습니다.

모든 입력 요소가 연결되어 있다고 가정 할 수 있습니다. 즉, 위 규칙을 사용하여 한 요소에서 다른 요소로 이동할 수 있습니다. 이것이 2D 영역이 단순히 연결된다는 것을 의미하지는 않습니다. 내부에 구멍이있을 수 있습니다.

예 : 다음은 유효하지 않은 입력입니다.

0,0
2,0

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

오류 점검이 필요하지 않습니다.

입력은 모든 소스 (파일, stdio, 함수 매개 변수 등)에서 올 수 있습니다.

산출

출력은 각 요소를 식별하는 좌표 목록과 모서리에 도달하기 위해 통과 한 해당 정수 거리 여야합니다. 출력은 원하는 임의의 요소 순서 일 수 있습니다 (예 : 입력과 동일한 순서로 요소를 출력 할 필요는 없음).

출력은 임의의 소스 (파일, stdio, 함수 반환 값 등) 일 수 있습니다.

요소의 외부 거리와 요소의 좌표를 일치시키는 모든 출력은 괜찮습니다. 예를 들어 다음은 모두 괜찮습니다.

x,y: distance
...

[((x,y), distance), ...]

[(x,y,distance), ...]

텍스트 예제 입력은 x,y한 줄에 하나의 요소 가있는 형식입니다 . 이를 편리한 입력 형식으로 재구성 할 수 있습니다 (입력 형식 규칙 참조).

텍스트 예제 출력은 x,y: distance한 줄에 하나의 요소 가있는 형식입니다 . 다시, 이것을 편리한 출력 형식으로 재구성 할 수 있습니다 (출력 형식 규칙 참조).

그래픽 수치의 왼쪽 아래 경계는 (0,0)이며, 내부 숫자는 외부 가장자리에 도달하기 위해 이동 한 예상 최소 거리를 나타냅니다. 이 수치는 순전히 설명을위한 것입니다. 당신의 프로그램은 이것을 출력 할 필요가 없습니다.

실시 예 1

입력:

1,0
3,0
0,1
1,2
1,1
2,1
4,3
3,1
2,2
2,3
3,2
3,3

산출:

1,0: 0
3,0: 0
0,1: 0
1,2: 0
1,1: 1
2,1: 0
4,3: 0
3,1: 0
2,2: 1
2,3: 0
3,2: 0
3,3: 0

그래픽 표현 :

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

실시 예 2

입력:

4,0
1,1
3,1
4,1
5,1
6,1
0,2
1,2
2,2
3,2
4,2
5,2
6,2
7,2
1,3
2,3
3,3
4,3
5,3
6,3
7,3
8,3
2,4
3,4
4,4
5,4
6,4
3,5
4,5
5,5

산출:

4,0: 0
1,1: 0
3,1: 0
4,1: 1
5,1: 0
6,1: 0
0,2: 0
1,2: 1
2,2: 0
3,2: 1
4,2: 2
5,2: 1
6,2: 1
7,2: 0
1,3: 0
2,3: 1
3,3: 2
4,3: 2
5,3: 2
6,3: 1
7,3: 0
8,3: 0
2,4: 0
3,4: 1
4,4: 1
5,4: 1
6,4: 0
3,5: 0
4,5: 0
5,5: 0

그래픽 표현 :

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

실시 예 3

입력:

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

산출:

4,0: 0
4,1: 0
1,2: 0
3,2: 0
4,2: 1
5,2: 0
6,2: 0
8,2: 0
0,3: 0
1,3: 1
2,3: 0
3,3: 1
4,3: 2
5,3: 1
6,3: 1
7,3: 0
8,3: 1
9,3: 0
1,4: 0
2,4: 1
3,4: 2
4,4: 2
5,4: 2
6,4: 1
7,4: 0
8,4: 0
9,4: 0
2,5: 0
3,5: 1
4,5: 1
5,5: 1
6,5: 0
9,5: 0
10,5: 0
11,5: 0
3,6: 0
4,6: 0
5,6: 0
9,6: 0
10,6: 1
11,6: 0
6,7: 0
7,7: 0
8,7: 0
9,7: 0
10,7: 0
11,7: 0

그래픽 표현 :

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

채점

이것은 코드 골프입니다. 바이트 단위의 짧은 코드가 이깁니다. 표준 허점이 적용됩니다. 이 문제를 해결하기 위해 특별히 설계된 것 이외의 모든 내장 기능이 허용됩니다.


[((1,0), 0), ...]로 출력 할 수 있습니까?
lirtosiast 5

@lirtosiast yes
helloworld922

1
귀하의 예에서는 입력을 명시 적으로 언급하지 않습니다.
데일 존슨

@DaleJohnson은 x, y 쌍에 대한 각 텍스트 입력의 처음 두 열을 가져옵니다. 조금 오래 걸리는 것 같아서 입력에 대해 별도의 따옴표 상자를 추가하지 않았습니다. 따옴표 상자를 추가하고 세로 높이를 수동으로 제한하는 방법이 있습니까?
helloworld922

외부 모서리에 도달하기 위해 이송해야하는 주변 요소의 최소 수를 찾으십시오. 어디에서 시작합니까? 테스트 케이에 출력을 추가 할 수 있습니까?
Luis Mendo

답변:


2

MATLAB / 옥타브, 143 바이트

function [v,x,y]=d(x,y)R=S=zeros(max(y+3),max(x+3));i=sub2ind(size(S),y+2,x+2);S(i)=1;while nnz(S=imerode(S,strel('disk',1,0)))R+=S;end;v=R(i);

언 골프

function [v,x,y]=d(x,y)
  R=S=zeros(max(y+3),max(x+3));
  i=sub2ind(size(S),y+2,x+2);
  S(i)=1;
  while nnz(S=imerode(S,strel('disk',1,0)))
    R+=S;
  end;
  v=R(i);

설명

만들기 S에 ource 및 R의 0으로 채워 적절한 크기의 esult 행렬.

R=S=zeros(max(y+3),max(x+3));

xy테두리에 하나의 요소 패딩 을 사용하여- 쌍에 해당하는 선형 인덱스를 계산하십시오 .

i=sub2ind(size(S),y+2,x+2);

구조를 그리십시오.

S(i)=1;

S예 2에 대해 여기에 표시됩니다 .

0   0   0   0   0   0   0   0   0   0   0
0   0   0   0   0   1   0   0   0   0   0
0   0   1   0   1   1   1   1   0   0   0
0   1   1   1   1   1   1   1   1   0   0
0   0   1   1   1   1   1   1   1   1   0
0   0   0   1   1   1   1   1   0   0   0
0   0   0   0   1   1   1   0   0   0   0
0   0   0   0   0   0   0   0   0   0   0

이미지 침식으로 모든 경계 요소 제거

S=imerode(S,strel('disk',1,0))

반경이 1 인 구조 요소 디스크 사용 :

0   1   0
1   1   1
0   1   0

대각선 이동이 허용 된 경우 대신 사각형을 사용합니다.

1   1   1
1   1   1
1   1   1

그런 다음 모든 비 테두리 요소의 결과를 증가시킵니다.

R+=S;

이미지가 완전히 침식 될 때까지 반복합니다.

while nnz(S)

xy쌍 의 결과를 반환하십시오 .

v=R(i);

2

Pyth, 26 바이트

V]MQNf>*4Nl=Nsmfq1.a,dYQN0

실시 예 2

내가 사용한 출력 형식은 다음과 같습니다.

[[4, 3]]
2

즉, 점과 외부와의 거리가 포함 된 목록입니다.

이 코드는 현재 도달 한 세트를 사용하여 각 포인트에 대해 해당 포인트에서 정확히 1 거리 떨어진 모든 포인트에 대한 입력을 필터링하고 결과 포인트 수가 시작 번호의 4 배인지 확인하고 그렇지 않을 때까지 반복합니다. . 주어진 지점에서 시작하면 해당 지점이 외부에서 얼마나 떨어져 있는지 알려줍니다.


2

MATL , 38 37 36 33 바이트

1Z?t"tX@<~5Bt!Z~2X53$Y+4=+]3#fqhh

이 사용하는 최신 버전 (15.0.0) 언어 / 컴파일러를.

입력 형식은 x 값을 가진 하나의 배열과 y 값을 가진 하나의 배열입니다 . 입력 및 출력은 1 기반입니다. 따라서 테스트 케이스에는 다음 입력이 있습니다.

[2 4 1 2 2 3 5 4 3 3 4 4]
[1 1 2 3 2 2 4 2 3 4 3 4]

[5 2 4 5 6 7 1 2 3 4 5 6 7 8 2 3 4 5 6 7 8 9 3 4 5 6 7 4 5 6]
[1 2 2 2 2 2 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 5 5 5 5 5 6 6 6]

[5 5 2 4 5 6 7 9 1 2 3 4 5 6 7 8 9 10 2 3 4 5 6 7 8 9 10 3 4 5 6 7 10 11 12 4 5 6 10 11 12 7 8 9 10 11 12]
[1 2 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 7 7 7 7 7 7 8 8 8 8 8 8]

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

설명

행렬은 처음에 입력 위치에서 1로, 그렇지 않으면 0으로 작성됩니다. 그런 다음 "North, East, South, West"마스크 ( [0 1 0; 1 0 1; 0 1 0])를 사용 하여 컨벌루션을 적용 하고 각 위치의 결과를 4와 비교합니다. 4의 결과는 해당 위치가 다른 점으로 둘러싸여 거리가 있음을 의미합니다. 결과 (각 점에 대해 0 또는 1)가 원래 행렬에 추가됩니다. 이 위치는 이제 2를 포함합니다 (프로세스가 끝날 때 매트릭스는 1 씩 감소합니다).

컨벌루션 프로세스가 반복됩니다. 다음 반복의 경우 컨볼 루션의 입력은 2로 임계 값이 누적 된 누적 행렬입니다. 즉, 2보다 작은 값은 0으로 설정됩니다. 컨볼 루션의 결과는 거리가 2 이상인 모든 포인트를 나타냅니다 (모든 이웃의 거리가 1 임).

반복 횟수는 편의를 위해 입력 행렬의 열 개수로 선택됩니다. 이것으로 충분합니다 (사실 필요한 최대 반복 횟수는 최소 매트릭스 차원의 절반 임). 마지막 반복은 쓸모가 없지만 해를 끼치 지 않습니다 (모든 점에 단순히 0을 추가합니다).

값이 k 인 위치 는 거리 k -1을 외부로 가져 오기 때문에 프로세스가 끝나면 결과에서 1을 뺍니다 . 모든 위치의 좌표와 값이 추출되어 표시됩니다.

           % take x and y implicitly
1          % push 1
Z?         % build sparse matrix from that x, y indices with 1 as value
t          % duplicate
"          % for each column of that matrix
  t        %   duplicate
  X@       %   push iteration index
  <~       %   true for matrix entries that are >= iteration index
  5B       %   5 in binary: row vector [1 0 1]
  t!       %   duplicate and transpose into a column vector
  Z~       %   element-wise XOR with broadcast: gives desired mask,
           %   [0 1 0; 1 0 1; 0 1 0]
  2X53$Y+  %   2D convolution. Output has same size as input
  4=       %   compare with 4: are all neighbouring positions occupied?
  +        %   add to accumulated matrix from previous iteration
]          % end for each
3#f        % extract row index, column index and value for nonzero
           % entries. In this case all entries are nonzero
q          % subtract 1 to value to yield distance to exterior
hh         % concatenate vertically twice
           % display implicitly 

1

파이썬 3, 180 166 160 바이트

def f(l,d=0):
 l=set(l);
 if l:i={(a,b)for a,b in l if all([x in l for x in[(a+1,b),(a-1,b),(a,b+1),(a,b-1)]])};return{(c,d)for c in l-i}|f(i,d+1)
 return set()

좌표가 4 개 미만의 이웃 인 경우 좌표가 "외부"에 있어야합니다. 따라서 외부 셀을 반복적으로 제거 하고이 경우 반복 횟수 / 재귀 수와 동일한 거리를 할당 할 수 있습니다.

확실히 개선의 여지가 있다고 생각하십시오-인접한 이웃을 확인하는 가장 좋은 방법은 무엇입니까?

편집 : 쌍 목록을 튜플로 허용 할 수 있어야합니다.


0

PHP, 316 바이트

<?preg_match_all("#^(\d+),(\d+)#m",$_GET[i],$t);foreach($t[1]as$k=>$v)$a[$v][$t[2][$k]]=0;function w($x,$y){global$a;return isset($a[$x][$y])?$a[$x][$y]:-1;};for(;$z++<max($t[2]);$o=$s,$s="")foreach($a as$x=>$b)foreach($b as$y=>$c)$s.="\n$x,$y: ".$a[$x][$y]=1+min(w($x+1,$y),w($x-1,$y),w($x,$y-1),w($x,$y+1));echo$o;

온라인 버전

고장

preg_match_all("#^(\d+),(\d+)#m",$_GET[i],$t); 
foreach($t[1]as$k=>$v) 
$a[$v][$t[2][$k]]=0;  # make a 2 D array
function w($x,$y){global$a;return isset($a[$x][$y])?$a[$x][$y]:-1;};# check the neighbours
for(;$z++<max($t[2]);$o=$s,$s="") # stored the last loop string first run make possible to 1 and so on
foreach($a as$x=>$b) # x values
foreach($b as$y=>$c) # y values
$s.="\n$x,$y: ".$a[$x][$y]=1+min(w($x+1,$y),w($x-1,$y),w($x,$y-1),w($x,$y+1)); # concanate array item x+y+value
echo$o; #Output

아스키 문자로 시각화

ksort($a); 
foreach($a as$x=>$b){
for($y=0;$y<=max($t[2]);$y++)
echo isset($a[$x][$y])?$a[$x][$y]:" ";
#The better way would be make a SVG and use the text element and use a factor
#echo '<text x="'.($x*$factor).'" y="'.($y*$factor).'">'.$a[$x][$y].'</text>';
echo"\n";}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.