Đếm số đa giác đã đóng


8

Đầu vào:

Một NxMchuỗi lưới hoặc nhiều dòng (hoặc định dạng đầu vào hợp lý khác), chỉ chứa ASCII có thể in (phạm vi unicode [32,126]).

Đầu ra:

Số lượng đa giác kín có cùng ký tự có thể được tìm thấy, với hai quy tắc đặc biệt:

  • Dấu cách là ký tự đại diện và có thể được sử dụng (nhiều lần) cho bất kỳ ký tự nào
  • o, O0được tính là đa giác khép kín

Quy tắc thử thách:

  • (Anti-) Các kết nối chéo giữa các ký tự (hoặc khoảng trắng) được bao gồm để tạo thành các đa giác khép kín.
  • Bạn không thể vượt qua các ký tự khác (ngoại trừ khoảng trắng ký tự đại diện). (Tức là trong lần đầu tiên test / ví dụ dưới đây, bạn có thể không hình thành hai hình tam giác với A's bằng cách trên x.) Vì vậy, tất cả các nhân vật sử dụng cho một đa giác khép kín nên được kết nối (theo chiều ngang, chiều dọc, và / hoặc (chống) theo đường chéo ).
  • Đa giác ít nhất ba nhân vật (trừ các ký tự đơn o, O, 0).
  • Các dòng ký tự liền kề không phải là đa giác đóng.
  • Các ký tự giống nhau không thể được sử dụng cho nhiều đa giác, ngoại trừ không gian ký tự đại diện.
  • Không gian wildcard không thể được tính là o, Ohoặc 0.
  • Ba hoặc nhiều không gian một mình không thể tạo thành một đa giác khép kín. Nó phải luôn có ít nhất một ký tự không phải dấu cách (và không o/ O/ 0).
  • Đầu vào có thể ở bất kỳ định dạng hợp lý. Có thể là một ma trận ký tự, chuỗi phân cách dòng mới, mảng chuỗi, mảng ký tự có thêm độ rộng số nguyên, v.v.
  • Các đầu vào sẽ luôn là một hình chữ nhật N by M (hoặc hình vuông), vì vậy không có hình dạng đầu vào kỳ lạ
  • Vì cùng một ký tự không thể được sử dụng nhiều lần và chúng tôi muốn có nhiều đa giác đóng, sử dụng nhiều ký tự để tạo thành hai (hoặc nhiều) đa giác đóng thay vì một đa giác lớn hơn tất nhiên là mục tiêu dự định trong việc đếm (cũng là tại sao đa giác đóng được hình thành bởi o, Ohoặc 0sẽ không bao giờ được tính, vì chúng là các đa giác đã đóng riêng lẻ).
  • Chữ in hoa và chữ thường tất nhiên được tính là các ký tự riêng lẻ.

Quy tắc chung:

  • Đây là , vì vậy câu trả lời ngắn nhất bằng byte thắng.
    Đừng để ngôn ngữ mã-golf ngăn cản bạn đăng câu trả lời với các ngôn ngữ không mã hóa. Cố gắng đưa ra một câu trả lời càng ngắn càng tốt cho ngôn ngữ lập trình 'bất kỳ'.
  • Quy tắc chuẩn áp dụng cho câu trả lời của bạn với quy tắc I / O mặc định , vì vậy bạn được phép sử dụng STDIN / STDOUT, các hàm / phương thức với các tham số thích hợp và kiểu trả về, chương trình đầy đủ. Cuộc gọi của bạn.
  • Lỗ hổng mặc định bị cấm.
  • Nếu có thể, vui lòng thêm một liên kết với một bài kiểm tra cho mã của bạn (ví dụ TIO ).
  • Ngoài ra, thêm một lời giải thích cho câu trả lời của bạn rất được khuyến khích.

Ví dụ / Các trường hợp thử nghiệm:

Đầu vào:

AAAw
AxA4
'AoQ

Đầu ra : 2, bởi vì các đa giác có thể được hình thành:
nhập mô tả hình ảnh ở đây


Đầu vào:

1822uaslkoo
12*2sl ljoo
a* 0a91)j$*
()*#J9dddj*
*Q#ID dJj!"
*UJD SO&*93

Đầu ra : 12, bởi vì các đa giác có thể được hình thành:
nhập mô tả hình ảnh ở đây

Lưu ý rằng:
- Màu vàng bên dưới không phải là đa giác, vì các đa giác ođã được tính là đa giác tách biệt
- Các màu tím và nâu không bị đóng
- Màu đỏ, xám, xanh lục và xanh nhạt sử dụng một hoặc nhiều không -space ký tự đã được sử dụng cho các đa giác đóng khác
nhập mô tả hình ảnh ở đây


Đầu vào (kích thước là 2x4):

3  3
  2 

Đầu ra : 3, bởi vì các đa giác có thể được hình thành:
nhập mô tả hình ảnh ở đây


Đầu vào:

AAAA
AAAA
AAxA

Đầu ra : 3, bởi vì các đa giác có thể được hình thành:
nhập mô tả hình ảnh ở đây

Tất nhiên các đa giác khác có thể có ở đây, nhưng không quá 3. Ở đây một ví dụ hợp lệ khác với 3đa giác:
nhập mô tả hình ảnh ở đây


Đầu vào:

0QoO

Đầu ra : 3, bởi vì các đa giác có thể được hình thành:
nhập mô tả hình ảnh ở đây


Đầu vào:

W w
 Ww

Đầu ra : 3, bởi vì các đa giác có thể được hình thành:
nhập mô tả hình ảnh ở đây

Lưu ý rằng không gian lớp trên cùng được sử dụng cho cả ba đa giác. Dưới đây là ba đa giác được tô sáng riêng:
nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây


Đầu vào:

W W
 WW

Đầu ra : 3, bởi vì ba đa giác giống như trong thử nghiệm trước có thể được hình thành. Vì vậy, không, 2với hai đa giác này:
nhập mô tả hình ảnh ở đây


Đầu vào:

abcdQefg
hQiQjQQk
QlQmnopQ
QqrstQQu
QvQQQwxy
QQz0QQQQ

Đầu ra : 3, bởi vì các đa giác có thể được hình thành:
nhập mô tả hình ảnh ở đây


2
Tôi muốn đến +1đây nhưng tôi thực sự không thấy gì đặc biệt vỏ các os, Os & 0s làm tăng thêm thách thức.
Xù xì

Có vẻ như tất cả các đa giác ví dụ là lồi. Trừ khi đa giác lõm được loại trừ, tôi đề nghị thêm một trường hợp thử nghiệm bao gồm một trường hợp.
Arnauld

1
@Arnauld Đã thêm một trường hợp thử nghiệm ở phía dưới. Không chắc chắn nếu nó là đủ cho những gì bạn có ý nghĩa, vì nó chỉ đi vào một lần. Lưới phải khá lớn để tạo đa giác lõm. Nếu bạn có bất kỳ trường hợp thử nghiệm đề nghị nào tôi nên thêm vào, hãy cho tôi biết.
Kevin Cruijssen

@Shaggy Bạn đúng đấy. Khi tôi đã thách thức tôi thấy hình dạng của o, O, 0là vòng tròn như đa giác cá nhân, nhưng trong một dung dịch nó không thêm nhiều, ngoại trừ rằng o, O, 0nên tránh khi hình thành đa giác lớn hơn, và thêm một số cho họ. Quá muộn để thay đổi nó bây giờ, mặc dù.
Kevin Cruijssen

Câu trả lời:


4

Python 2 , 714 737 821 byte

  • -23 byte nhờ Kevin Cruijssen
M=input()
m=''.join(M)
def P(L):
 if len(L)<2:yield[L];return
 for p in P(L[1:]):
	for n,s in enumerate(p):yield p[:n]+[[L[0]]+s]+p[n+1:]
	yield[[L[0]]]+p
h,w,R,C=len(M),len(M[0]),0,[-1,0,1]
K=[(i,j)for i in range(h)for j in range(w)]
Z=[(i,j)for i,j in K if' '==M[i][j]]
from networkx import*
for l in set(m):
 G,S=[],[]
 if l in'oO0':R+=m.count(l);continue
 for I in K:
  i,j=I
  for p in C:
	for q in C:
	 X=x,y=i+p,j+q
	 if X in K and X!=I and set(M[i][j]+M[x][y])<=set(' '+l):G+=[(I,X)];S+=[I,X]
 B=0
 for L in P(list(set(S))):
  b=0
  for p in L:
	for i,j in p:
	 if' '!=M[i][j]: 
		try:find_cycle(from_edgelist([(I,X)for I,X in G if I in p+Z and X in p+Z]));b+=1
		except:1
		break
	if b>B:B=b
 R+=B
print R

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

  1. Đối với mỗi chữ cái A(ngoại trừ o, O0), mã xây dựng một biểu đồ biểu thị sự phụ thuộc của các lần xuất hiện khác nhau của chữ cái Avà khoảng trắng trong ma trận đã cho ban đầu. Sau đó, nó tính toán tập hợp các chu kỳ bán tách biệt bao gồm biểu đồ khi tối đa hóa số chu kỳ (việc phân tách chỉ dựa trên chữ cái A, cùng một không gian có thể được sử dụng cho một vài chu kỳ).

  2. Mã này vượt qua tất cả các bài kiểm tra.

  3. Input: danh sách các dòng của ma trận.

  4. Sắp có thêm lời giải thích và chơi golf.

1
714 byte bằng cách sử dụng kết hợp các tab và khoảng trắng làm vết lõm, thay vì chỉ khoảng trắng.
Kevin Cruijssen
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.