Làm thế nào xa bên ngoài?


15

Lấy một vùng 2D của không gian được chia thành các phần tử vuông đơn vị được căn chỉnh theo trục với tâm của chúng được căn chỉnh theo các khoảng nguyên. Một cạnh được gọi là bên trong nếu nó được chia sẻ bởi hai yếu tố, nếu không nó là một cạnh bên ngoài.

Mục tiêu của bạn là tìm ra số lượng tối thiểu các phần tử lân cận phải đi qua để đạt được cạnh bên ngoài bắt đầu từ trung tâm của mỗi phần tử, được gọi là traversal distance, hoặc distanceviết tắt. Bạn chỉ có thể đi qua một cạnh (tức là không có chuyển động cắt góc / đường chéo). Lưu ý rằng "các yếu tố bên ngoài" (các yếu tố có ít nhất một cạnh bên ngoài) được coi là cần phải đi qua 0các yếu tố lân cận để đạt được cạnh bên ngoài ..

Đầu vào

Đầu vào là danh sách các tọa độ cặp số nguyên không âm biểu thị (x, y) của tâm của tất cả các phần tử. Giả định không có phần tử chồng lấp (nghĩa là một cặp x / y xác định duy nhất một phần tử). Bạn không thể giả định bất cứ điều gì về thứ tự đầu vào phần tử.

Bạn có thể chuyển đổi nguồn gốc của đầu vào sang bất kỳ vị trí nào (ví dụ 0,0 hoặc 1,1, v.v.).

Bạn có thể giả định rằng tất cả các yếu tố đầu vào được kết nối, hay nói cách khác, có thể đi từ bất kỳ một yếu tố nào đến bất kỳ yếu tố nào khác bằng cách sử dụng các quy tắc ở trên. Lưu ý rằng điều này không có nghĩa là khu vực 2D được kết nối đơn giản; nó có thể có lỗ bên trong của nó.

Ví dụ: sau đây là một đầu vào không hợp lệ.

0,0
2,0

nhập mô tả hình ảnh ở đây

kiểm tra lỗi là không cần thiết.

Đầu vào có thể từ bất kỳ nguồn nào (tệp, stdio, tham số hàm, v.v.)

Đầu ra

Đầu ra phải là một danh sách các tọa độ xác định từng phần tử và khoảng cách nguyên tương ứng đi qua để đến một cạnh. Đầu ra có thể theo bất kỳ thứ tự phần tử nào mong muốn (ví dụ: bạn không cần các phần tử đầu ra theo cùng thứ tự nhận làm đầu vào).

Đầu ra có thể là bất kỳ nguồn nào (tệp, stdio, giá trị trả về của hàm, v.v.)

Bất kỳ đầu ra nào khớp với tọa độ của phần tử với khoảng cách bên ngoài của nó đều ổn, ví dụ: tất cả các đầu ra này đều ổn:

x,y: distance
...

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

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

Ví dụ

Đầu vào ví dụ văn bản có dạng x,y, với một phần tử trên mỗi dòng; bạn có thể định hình lại định dạng này thành định dạng đầu vào thuận tiện (xem quy tắc định dạng đầu vào).

Kết quả ví dụ văn bản có định dạng x,y: distance, với một phần tử trên mỗi dòng; một lần nữa, bạn được chào đón để định hình lại nó thành một định dạng ouput thuận tiện (xem quy tắc định dạng đầu ra).

Các hình đồ họa có giới hạn dưới bên trái là (0,0) và các số bên trong biểu thị khoảng cách tối thiểu dự kiến ​​di chuyển để đạt đến cạnh bên ngoài. Lưu ý rằng những số liệu này hoàn toàn chỉ dành cho mục đích trình diễn; chương trình của bạn không cần phải xuất những thứ này.

ví dụ 1

đầu vào:

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

Đầu ra:

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

biểu diễn đồ họa:

nhập mô tả hình ảnh ở đây

Ví dụ 2

đầu vào:

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

đầu ra:

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

biểu diễn đồ họa:

nhập mô tả hình ảnh ở đây

Ví dụ 3

đầu vào:

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

đầu ra:

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

biểu diễn đồ họa:

nhập mô tả hình ảnh ở đây

Chấm điểm

Đây là mã golf. Mã ngắn nhất trong byte thắng. Tiêu chuẩn áp dụng. Bất kỳ tích hợp nào khác ngoài những thiết kế đặc biệt để giải quyết vấn đề này đều được cho phép.


Chúng ta có thể xuất ra dưới dạng [((1,0), 0), ...] không?
lirtosiast

@lirtosiast vâng
helloworld922

1
Trong ví dụ của bạn, bạn không nói rõ các đầu vào.
Dale Johnson

@DaleJohnson chỉ cần lấy hai cột đầu tiên của mỗi kiểu nhập văn bản cho các cặp x, y. Tôi đã không thêm một hộp trích dẫn riêng cho các đầu vào vì nó dường như hơi dài. Có cách nào để thêm một hộp trích dẫn và tự giới hạn chiều cao của nó không?
hellowworld922

tìm số lượng tối thiểu của các phần tử lân cận phải đi qua để đạt được cạnh bên ngoài Bắt đầu từ đâu? Và bạn có thể thêm đầu ra trong caes thử nghiệm?
Luis Mendo

Câu trả lời:


2

MATLAB / Octave, 143 byte

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

Ung dung

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

Giải trình

Tạo ma trận S ource và R esult có kích thước phù hợp, chứa đầy số không.

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

Tính toán các chỉ số tuyến tính tương ứng với xy-pairs, với một phần tử đệm ở viền.

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

Vẽ kết cấu.

S(i)=1;

Sđược hiển thị ở đây cho ví dụ 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

Loại bỏ tất cả các yếu tố biên bằng xói mòn hình ảnh

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

sử dụng đĩa phần tử cấu trúc có bán kính 1 :

0   1   0
1   1   1
0   1   0

Nếu chuyển động chéo được cho phép, thay vào đó chúng ta sẽ sử dụng hình chữ nhật:

1   1   1
1   1   1
1   1   1

Sau đó, tăng kết quả cho tất cả các yếu tố không biên giới

R+=S;

và lặp cho đến khi hình ảnh bị xói mòn hoàn toàn.

while nnz(S)

Trả về kết quả cho mỗi xytuyệt vọng.

v=R(i);

2

Bình thường, 26 byte

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

Ví dụ 2

Định dạng đầu ra tôi sử dụng là:

[[4, 3]]
2

Đó là, một danh sách chứa điểm, theo sau là khoảng cách từ bên ngoài.

Mã này hoạt động bằng cách sử dụng một tập hợp đạt được hiện tại, cho mỗi điểm lọc đầu vào cho tất cả các điểm cách chính xác 1 điểm so với điểm đó và kiểm tra xem số điểm kết quả có gấp 4 lần số bắt đầu hay không và lặp lại cho đến khi không . Khi bắt đầu tại một điểm nhất định, điều này cho biết điểm đó cách bề ngoài bao xa.


2

MATL , 38 37 36 33 byte

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

Điều này sử dụng phiên bản hiện tại (15.0.0) của ngôn ngữ / trình biên dịch.

Định dạng đầu vào là: một mảng có giá trị x và một mảng có giá trị y . Đầu vào và đầu ra là 1 dựa trên. Vì vậy, các trường hợp thử nghiệm có các đầu vào sau:

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

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

Giải trình

Một ma trận ban đầu được xây dựng với 1 tại các vị trí đầu vào và 0 khác. Sau đó, tích chập được áp dụng với mặt nạ "Bắc, Đông, Nam, Tây" ( [0 1 0; 1 0 1; 0 1 0]và kết quả tại mỗi vị trí được so sánh với 4. Kết quả của 4 có nghĩa là vị trí đó được bao quanh bởi các điểm khác và do đó có khoảng cách- đến bên ngoài ít nhất 1. Kết quả (0 hoặc 1 cho mỗi điểm) được thêm vào ma trận gốc. Các vị trí đó hiện chứa 2 (ở cuối quá trình, ma trận sẽ được giảm đi 1).

Quá trình tích chập được lặp lại. Đối với lần lặp tiếp theo, đầu vào của tích chập là ma trận tích lũy được ngưỡng 2; nghĩa là, các giá trị thấp hơn 2 được đặt thành 0. Kết quả của phép chập cho biết điểm nào có khoảng cách ít nhất là 2 (tất cả các lân cận của chúng có khoảng cách 1).

Số lần lặp được chọn, để thuận tiện, là số cột của ma trận đầu vào. Điều này là đủ (trên thực tế, số lần lặp yêu cầu tối đa bằng một nửa kích thước ma trận tối thiểu). Các lần lặp cuối cùng có thể là vô ích, nhưng không gây hại (chúng chỉ đơn giản là thêm 0 vào tất cả các điểm).

Khi kết thúc quá trình, 1 bị trừ khỏi kết quả, bởi vì các vị trí có giá trị k có khoảng cách k -1 đến bên ngoài. Các tọa độ và giá trị của tất cả các vị trí được trích xuất và hiển thị.

           % 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

Python 3, 180 166 160 byte

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

Chúng tôi biết rằng nếu một tọa độ có ít hơn bốn lân cận, thì nó phải ở "bên ngoài". Do đó, chúng ta có thể liên tục tước các ô bên ngoài và gán cho chúng một khoảng cách bằng số lần lặp / độ sâu đệ quy trong trường hợp này.

Chắc chắn nghĩ rằng có chỗ để cải thiện - Cách tốt nhất để kiểm tra hàng xóm lân cận là gì?

chỉnh sửa: Tôi nên được phép chấp nhận một danh sách các cặp như bộ dữ liệu.


0

PHP, 316 byte

<?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;

Phiên bản trực tuyến

Phá vỡ

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

Hình dung như chars

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";}
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.