Lưới có thể cong. Bao lâu là của bạn


12

Xem xét mô tả một đường cong hai chiều đơn giản , mở , trên W rộng bằng lưới văn bản cao H trong đó Xđại diện cho một phần của đường cong và .đại diện cho không gian trống và không có ký tự nào khác được sử dụng.

Mỗi không gian lưới có 8 không gian lưới lân cận, khu phố Moore của nó . Không gian lưới vượt ra ngoài biên giới được coi là trống rỗng.

Một lưới chứa một đường cong nếu nó có chính xác một X HOẶC nếu nó có nhiều hơn một trong Xđó:

  • Chính xác là hai Xs chỉ có một hàng xóm X. Đây là những điểm cuối của đường cong.
  • Mỗi Xbên cạnh các điểm cuối hàng xóm chính xác hai Xs. Chúng tạo thành phần lớn của đường cong.

Ví dụ: lưới này trong đó W = 9 và H = 4 chứa một đường cong:

....X....
.X.X.X.X.
X..X..X.X
.XX.....X

Tương tự, các lưới này (W = 4, H = 3) có các đường cong:

....  .X..  ....  ....  .X.X
....  X..X  ..X.  XX..  X.X.
..X.  .XX.  .X..  ....  ....

Các lưới này, tuy nhiên, không chứa một đường cong:

....  .XX.  ...X  XX..  ....  X.X.
....  X..X  ..XX  XX..  .X.X  .X..
....  .XX.  .X..  ....  ...X  X.X.

Chúng ta có thể tìm thấy độ dài của một đường cong bằng cách tính tổng khoảng cách giữa tất cả các cặp Xs lân cận :

  • Khoảng cách giữa hai Xs lân cận trực giao là 1 đơn vị.

    XX
    X
    X
  • Khoảng cách giữa hai Xs lân cận chéo là units2 đơn vị.

    X.
    .X
    .X
    X.

Ví dụ: chiều dài của đường cong trong lưới

XXX.
...X
..X.

có thể được hình dung như

ví dụ chiều dài

vì vậy chúng ta có thể thấy nó là 1 + 1 + 2 + 2 = 4.828427 ...

Độ dài của một đường cong chỉ có một Xlà bằng không.

Khi lưới không tạo thành đường cong, chiều dài của nó không được xác định rõ.

Thử thách

Cho một lưới văn bản của Xs và .s, xuất độ dài của đường cong mà nó chứa hoặc nếu không thì xuất ra một cái gì đó như -1hoặc Nullđể chỉ ra lưới không có đường cong.

Đối với đầu vào, bạn có thể sử dụng các ký tự khác ngoài X.nếu muốn, và H và W có thể được lấy làm đầu vào nếu cần. Nhập vào dưới dạng một danh sách lồng nhau hoặc ma trận chứa đầy 1 và 0 thay vì một chuỗi cũng tốt.

Bạn có thể xuất một số float cho chiều dài đường cong hoặc thay vào đó là hai số nguyên A và B trong đó length = A + B*√2.

Mã ngắn nhất tính bằng byte thắng.

Các trường hợp thử nghiệm

XXX.
...X
..X.
2 + 2*√2 = 4.828427...

....X....
.X.X.X.X.
X..X..X.X
.XX.....X
3 + 8*√2 = 14.313708...

....
....
..X.
0 + 0*√2 = 0

.X..
X..X
.XX.
1 + 3*√2 = 5.242640...

....
..X.
.X..
0 + 1*√2 = 1.414213...

....
XX..
....
1 + 0*√2 = 1

.X.X
X.X.
....
0 + 3*√2 = 4.242640...

....
....
....
....
-1

.XX.
X..X
.XX.
-1

...X
..XX
.X..
-1

....
.X.X
...X
-1

X.X.
.X..
X.X.
-1

Tôi khuyên bạn nên cho phép người giải chọn định dạng đầu ra của họ cho các lưới không có đường cong (bất kỳ giá trị nhất quán nào không có dạng m + n * sqrt (2) cho mọi m, n≥0).
Greg Martin

@Greg Âm thanh tốt. Xong
Sở thích của Calvin

[x.x,...,.x.]không phải là một đường cong hợp lệ, phải không?
Bạch tuộc ma thuật Urn

@carusocomputing đúng
Sở thích của Calvin

Câu trả lời:


3

MATL , 52 51 byte

t2Y6~Z+*ssGt3Y6Z+*tt1=z2=wssGzqE=*Gz1=+?}_q]ssy-h2/

Đầu vào là một ma trận các số không và số một.

Đầu ra là B , sau đó A. Không đường cong cho một tiêu cực A.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình

Việc tính toán độ dài của đường cong sử dụng hai cấu trúc 2D 1 : một với mặt nạ Moore và một với mặt nạ chỉ chứa các hàng xóm chéo. Kết quả là hai ma trận có cùng kích thước của đầu vào, sẽ được ký hiệu lần lượt là MD. M đưa ra tổng số hàng xóm cho mỗi điểm, trong khi D cho số lượng hàng xóm chéo.

Kết quả trong M D phải được lọc để loại bỏ các điểm không thuộc đường cong. Ngoài ra, chúng phải được chia cho 2, vì "là hàng xóm của" là mối quan hệ đối xứng, vì vậy mỗi điểm trong đường cong được tính hai lần.

Xác định xem đường cong có hợp lệ không không hơn tôi mong đợi. Để làm điều này, mã kiểm tra ba điều kiện:

  1. Số lượng người trong M bằng nhau 2? (Đó là, có chính xác hai điểm với một người hàng xóm không?)
  2. Tổng tổng của M có bằng số điểm trong đường cong đầu vào 2trừ đi 2không? (Cùng với điều kiện 1, điều này kiểm tra nếu tất cả các giá trị khác không trong M ngoại trừ hai bằng nhau 2)
  3. Đường cong đầu vào có chứa một điểm không?

Đường cong hợp lệ nếu điều kiện 1 và 2 là đúng hoặc nếu điều kiện 3 là.

t       % Implicit input matrix of zeros and ones. Duplicate
2Y6~    % Push [1 0 1; 0 0 0; 1 0 1]
Z+      % 2D convolution, keeping size
*       % Multiply to zero out results for non-curve points. Gives matrix D
ss      % Sum of matrix D
Gt      % Push input again wtice
3Y6     % Push [1 1 1; 1 0 1; 1 1 1]
Z+      % 2D convolution, keeping size
*       % Multiply to zero out results for non-curve points. Gives matrix M
tt      % Duplicate twice
1=z     % Number of ones
2=      % Does it equal 2? This is condition 1
wss     % Swap. Sum of matrix
G       % Push input again
zqE     % Number of nonzeros values minus 1, and then multiplied by 2
=       % Are they equal? This is condition 2
*       % Multiply. This is a logical AND of conditions 1 and 2
G       % Push input again
z1=     % Does it contain exactly one nonzero value? This is condition 3
+       % Add. This is a logical OR with condition 3
?}      % If result was false
  _q    %   Negate and subtract 1. This makes sure we get a negative value
]       % End
ss      % Sum of matrix M
y       % Duplicate sum of matrix D from below
-       % Subtract
h       % Concatenate horizontally
2/      % Divide by 2. Implicitly display

1 Convolution là chìa khóa để thành công .


1

Trăn 3 , 316 315 311 byte

Tôi nghĩ rằng điều này bao gồm tất cả các trường hợp; ít nhất các trường hợp thử nghiệm làm việc.

Ngoài ra, chắc chắn vẫn còn rất nhiều để chơi golf, có thể là vào lúc bắt đầu xử lý các trường hợp cạnh.

def f(d,R,C):
 s=sum;d=[0]*(C+2),*[[0,*r,0]for r in d],[0]*(C+2);o=-1,0,1;k=[[[(1,0),(0,1)][i*j]for i in o for j in o if d[r+i][c+j]and i|j]for c in range(1,-~C)for r in range(1,-~R)if d[r][c]];w=[x/2for x in map(s,zip(*s(k,[])))]or[0,0];print([w,-1][s(w)!=s([s(z)for z in d])-1or[len(t)for t in k].count(1)>2])

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

Làm thế nào nó hoạt động:

  1. d,R,C là 1. danh sách các danh sách có 1 là đường cong và 0 làm nền, 2. số hàng và số cột
  2. Chèn một hàng 0 trước và sau và một cột 0 trước và sau d để chúng ta không phải lo lắng về cạnh của mảng 2d
  3. Đối với mỗi 1 trong mảng 2d, quét vùng lân cận trong 1 giây và thêm (1,0) vào danh sách nếu mối quan hệ là đường chéo, khác thêm (0,1)
  4. Tính tổng tất cả các bộ dữ liệu, sao cho (n, m) tương ứng với số lượng lân cận chéo và không chéo
  5. Kiểm tra xem số lượng quan hệ có chính xác bằng số 1 trừ đi không; nếu không, không phải là một đường cong.

Cảm ơn @Helka Homba đã chỉ ra một trường hợp mất tích. Cảm ơn @TuukkaX và @Trelzevir về các mẹo chơi gôn.


Có vẻ như d=[[1,0,1],[0,1,0],[1,0,1]]sẽ thất bại ở đây (thêm testcase).
Sở thích của Calvin

@HelkaHomba Bạn nói đúng, tôi giám sát điều đó. Cảm ơn! Đã sửa nó (bây giờ không may có nhiều byte hơn).
nile

1
s=sumtiết kiệm 4 byte.
Trelzevir

0

Toán học, 153 150 byte

Switch[Sort[Join@@BlockMap[If[#[[2,2]]<1,Nothing,Tr[Tr/@#]]&,#~ArrayPad~1,{3,3},1]],{1},0,{2,2,3...},1/.#~ComponentMeasurements~"PolygonalLength",_,]&

Lấy một mảng 2D, với 0s cho .s và 1s cho Xs. Đầu ra Nullcho các đường cong không.

1/.#~ComponentMeasurements~"PolygonalLength"&

Mathematica có sẵn 45 byte cho việc này, nhưng nó xuất ra một số số cho các đường cong không và 1 / sqrt (2) cho đầu vào {{1}}. Sửa các chi phí 105 byte (có thể được đánh golf?).

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.