외부와 얼마나 멀어요?


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.