Conte os polígonos fechados

8

Entrada:

Uma NxMgrade ou sequência de várias linhas (ou outro formato de entrada razoável), contendo apenas ASCII (intervalo unicode [32,126]) imprimível .

Resultado:

A quantidade de polígonos fechados do mesmo caractere que pode ser encontrado, com duas regras especiais:

  • Os espaços são curingas e podem ser usados ​​(várias vezes) para qualquer caractere
  • o, O, E 0são contadas como próprios polígonos fechados

Regras do desafio:

  • (Anti-) Conexões diagonais entre os mesmos caracteres (ou espaços) estão incluídas para formar polígonos fechados.
  • Você não pode passar por cima de outros caracteres (exceto os espaços curinga). (Ou seja, no primeiro caso de teste / exemplo abaixo, você não pode formar dois triângulos com os A, passando por cima dox .) Portanto, todos os caracteres usados ​​para um polígono fechado devem ser conectados (horizontal, vertical e / ou (anti-) diagonalmente )
  • Polígonos são, pelo menos, três caracteres (excluindo os caracteres individuais o, O, 0).
  • Linhas de caracteres adjacentes não são polígonos fechados.
  • Os mesmos caracteres não podem ser usados ​​para vários polígonos, excluindo espaços curinga.
  • Espaços curinga não pode ser contado como o, Oou 0.
  • Apenas três ou mais espaços não podem formar um polígono fechado. Sempre deve ter pelo menos um caractere não-espaço (e não o/ O/ 0).
  • A entrada pode estar em qualquer formato razoável. Pode ser uma matriz de caracteres, uma linha delimitadora de nova linha, uma matriz de cadeias, uma matriz de caracteres com largura de número inteiro adicionada, etc.
  • As entradas sempre serão um retângulo N por M (ou quadrado), portanto, nenhuma forma estranha de entrada
  • Como os mesmos caracteres não podem ser usados ​​mais de uma vez e queremos ter o maior número de polígonos fechados, o uso de vários caracteres para formar dois (ou mais) polígonos fechados em vez de um polígono maior é obviamente o objetivo pretendido na contagem (que também é por que polígonos fechados formados por o, Oou 0nunca serão contados, pois já são polígonos fechados individualmente).
  • Letras maiúsculas e minúsculas são obviamente contadas como caracteres individuais.

Regras gerais:

  • Isso é , então a resposta mais curta em bytes vence.
    Não permita que idiomas com código de golfe o desencorajem a postar respostas com idiomas que não sejam codegolf. Tente encontrar uma resposta o mais curta possível para 'qualquer' linguagem de programação.
  • As regras padrão se aplicam à sua resposta com as regras de E / S padrão , para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados e programas completos do tipo retorno. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código (ou seja, TIO ).
  • Além disso, é altamente recomendável adicionar uma explicação para sua resposta.

Exemplos / casos de teste:

Entrada:

AAAw
AxA4
'AoQ

Saída:, 2porque esses polígonos podem ser formados:
insira a descrição da imagem aqui


Entrada:

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

Saída:, 12porque esses polígonos podem ser formados:
insira a descrição da imagem aqui

Observe que:
- O amarelo abaixo não é um polígono, porque os ojá são contados como polígonos separados
- Os roxos e marrons não estão fechados
- Os vermelhos, cinza, verde e azul claro usam um ou mais caracteres de espaço que já foram usados ​​para outros polígonos fechados
insira a descrição da imagem aqui


Entrada (dimensões são 2x4):

3  3
  2 

Saída:, 3porque esses polígonos podem ser formados:
insira a descrição da imagem aqui


Entrada:

AAAA
AAAA
AAxA

Saída:, 3porque esses polígonos podem ser formados:
insira a descrição da imagem aqui

É claro que outros polígonos são possíveis aqui, mas não mais que 3. Aqui outro exemplo válido com 3polígonos:
insira a descrição da imagem aqui


Entrada:

0QoO

Saída:, 3porque esses polígonos podem ser formados:
insira a descrição da imagem aqui


Entrada:

W w
 Ww

Saída:, 3porque esses polígonos podem ser formados:
insira a descrição da imagem aqui

Observe que o espaço da camada superior é usado para todos os três polígonos. Aqui estão os três polígonos destacados individualmente:
insira a descrição da imagem aqui insira a descrição da imagem aqui insira a descrição da imagem aqui


Entrada:

W W
 WW

Saída:, 3porque os mesmos três polígonos que no teste anterior podem ser formados. Então não, não é 2com esses dois polígonos:
insira a descrição da imagem aqui


Entrada:

abcdQefg
hQiQjQQk
QlQmnopQ
QqrstQQu
QvQQQwxy
QQz0QQQQ

Saída:, 3porque esses polígonos podem ser formados:
insira a descrição da imagem aqui

Kevin Cruijssen
fonte
2
Eu quero que +1isso, mas eu realmente não vejo o que especial invólucro os os, OS & 0s aumenta o desafio.
Salsicha
Parece que todos os exemplos de polígonos são convexos. A menos que polígonos côncavos sejam excluídos, sugiro adicionar um caso de teste, incluindo um.
Arnauld
1
@ Arnauld Adicionado um caso de teste na parte inferior. Não tenho certeza se é suficiente para o que você quis dizer, uma vez que só vai para dentro uma vez. A grade deve ser bem grande para criar um polígono côncavo. Se você tiver algum caso de teste sugerido que eu deva adicionar, informe-me.
Kevin Cruijssen 19/01/19
@ Shagy Você está meio certo. Quando eu fiz o desafio eu vi a forma do o, O, 0sendo círculos como polígonos individuais, mas em uma solução que não acrescenta muito, exceto que o o, O, 0deve ser evitado quando formando polígonos maiores, e adicionando uma contagem para eles. Tarde demais para mudar isso agora, no entanto.
Kevin Cruijssen 19/01/19

Respostas:

4

Python 2 , 714 737 821 bytes

  • -23 bytes graças a 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

Experimente online!

  1. Para cada letra A(exceto o, Oe 0), o código cria um gráfico representando a adjacência das diferentes ocorrências de letraA e espaço na matriz inicial especificada. Em seguida, calcula o conjunto de ciclos semi-separados que cobrem o gráfico ao maximizar o número de ciclos (a separação é baseada apenas na letra A, o mesmo espaço pode ser usado por vários ciclos).

  2. O código passa em todos os testes.

  3. Entrada: a lista de linhas da matriz.

  4. Mais explicações e golfe em breve.
mdahmoune
fonte
1
714 bytes usando uma combinação de guias e espaços como recuos, em vez de apenas espaços.
Kevin Cruijssen 21/01/19