Zähle die geschlossenen Polygone


8

Eingang:

Ein NxMRaster oder eine mehrzeilige Zeichenfolge (oder ein anderes vernünftiges Eingabeformat), die nur druckbares ASCII (Unicode-Bereich [32,126]) enthält.

Ausgabe:

Die Anzahl der gefundenen geschlossenen Polygone desselben Zeichens mit zwei Sonderregeln:

  • Leerzeichen sind Platzhalter und können (mehrfach) für jedes Zeichen verwendet werden
  • o, OUnd 0als geschlossene Polygone selbst gezählt

Herausforderungsregeln:

  • (Anti-) Diagonale Verbindungen zwischen denselben Zeichen (oder Leerzeichen) werden eingeschlossen, um geschlossene Polygone zu bilden.
  • Sie können nicht über andere Zeichen gehen (mit Ausnahme der Platzhalter). (Das heißt, im ersten Testfall / Beispiel unten können Sie nicht zwei Dreiecke mit den A's bilden, indem Sie über die gehen x.) Daher sollten alle für ein geschlossenes Polygon verwendeten Zeichen (horizontal, vertikal und / oder (anti)) diagonal verbunden werden ).
  • Polygonen sind mindestens drei Zeichen ( mit Ausnahme der einzelnen Zeichen o, O, 0).
  • Zeilen benachbarter Zeichen sind keine geschlossenen Polygone.
  • Dieselben Zeichen können nicht für mehrere Polygone verwendet werden, ausgenommen Platzhalter.
  • Wildcard Plätze können nicht als gezählt werden o, Ooder 0.
  • Drei oder mehr Leerzeichen allein können kein geschlossenes Polygon bilden. Es sollte immer mindestens ein Nicht-Leerzeichen (und kein o/ O/ 0) Zeichen haben.
  • Die Eingabe kann in jedem vernünftigen Format erfolgen. Kann eine Zeichenmatrix, ein Trennzeichen für neue Zeilen, ein Zeichenfolgenarray, ein Zeichenarray mit zusätzlicher Ganzzahlbreite usw. sein.
  • Die Eingaben sind immer ein N x M-Rechteck (oder Quadrat), also keine seltsamen Eingabeformen
  • Da dieselben Zeichen nicht mehr als einmal verwendet werden können und wir so viele geschlossene Polygone haben möchten, ist die Verwendung mehrerer Zeichen zur Bildung von zwei (oder mehr) geschlossenen Polygonen anstelle eines größeren Polygons natürlich das beabsichtigte Ziel bei der Zählung (was auch der Fall ist) warum geschlossene Polygone gebildet durch o, Ooder 0nie gezählt werden, da sie bereits geschlossene Polygone sind einzeln).
  • Groß- und Kleinbuchstaben werden natürlich als einzelne Zeichen gezählt.

Allgemeine Regeln:

  • Dies ist , also gewinnt die kürzeste Antwort in Bytes.
    Lassen Sie sich nicht von Code-Golf-Sprachen davon abhalten, Antworten mit Nicht-Codegolf-Sprachen zu veröffentlichen. Versuchen Sie, eine möglichst kurze Antwort für "jede" Programmiersprache zu finden.
  • Für Ihre Antwort gelten Standardregeln mit Standard-E / A-Regeln . Sie können also STDIN / STDOUT, Funktionen / Methoden mit den richtigen Parametern und vollständige Programme vom Rückgabetyp verwenden. Ihr Anruf.
  • Standardschlupflöcher sind verboten.
  • Wenn möglich, fügen Sie bitte einen Link mit einem Test für Ihren Code (dh TIO ) hinzu.
  • Es wird dringend empfohlen, eine Erklärung für Ihre Antwort hinzuzufügen.

Beispiele / Testfälle:

Eingang:

AAAw
AxA4
'AoQ

Ausgabe : 2, weil diese Polygone gebildet werden können:
Geben Sie hier die Bildbeschreibung ein


Eingang:

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

Ausgabe : 12, weil diese Polygone gebildet werden können:
Geben Sie hier die Bildbeschreibung ein

Beachten Sie
Folgendes : - Das gelbe unten ist kein Polygon, da die obereits als getrennte Polygone gezählt werden.
- Die violetten und braunen sind nicht geschlossen.
- Die roten, grauen, grünen und hellblauen verwenden ein oder mehrere Nicht- Polygone -Leerzeichen, die bereits für andere geschlossene Polygone verwendet wurden
Geben Sie hier die Bildbeschreibung ein


Eingabe (Abmessungen sind 2x4):

3  3
  2 

Ausgabe : 3, weil diese Polygone gebildet werden können:
Geben Sie hier die Bildbeschreibung ein


Eingang:

AAAA
AAAA
AAxA

Ausgabe : 3, weil diese Polygone gebildet werden können:
Geben Sie hier die Bildbeschreibung ein

Natürlich sind hier andere Polygone möglich, aber nicht mehr als 3. Hier ein weiteres gültiges Beispiel mit 3Polygonen:
Geben Sie hier die Bildbeschreibung ein


Eingang:

0QoO

Ausgabe : 3, weil diese Polygone gebildet werden können:
Geben Sie hier die Bildbeschreibung ein


Eingang:

W w
 Ww

Ausgabe : 3, weil diese Polygone gebildet werden können:
Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass der Raum der obersten Ebene für alle drei Polygone verwendet wird. Hier sind die drei Polygone einzeln hervorgehoben:
Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein


Eingang:

W W
 WW

Ausgabe : 3, weil die gleichen drei Polygone wie im vorherigen Test gebildet werden können. Also nein, es ist nicht 2mit diesen beiden Polygonen:
Geben Sie hier die Bildbeschreibung ein


Eingang:

abcdQefg
hQiQjQQk
QlQmnopQ
QqrstQQu
QvQQQwxy
QQz0QQQQ

Ausgabe : 3, weil diese Polygone gebildet werden können:
Geben Sie hier die Bildbeschreibung ein


2
Ich möchte das , +1aber ich sehe wirklich nicht, welches spezielle Gehäuse das os, Os & 0s zur Herausforderung beiträgt.
Shaggy

Es scheint, dass alle Beispielpolygone konvex sind. Sofern konkave Polygone nicht ausgeschlossen sind, würde ich vorschlagen, einen Testfall mit einem hinzuzufügen.
Arnauld

1
@Arnauld Unten wurde ein Testfall hinzugefügt. Ich bin mir nicht sicher, ob es für das, was Sie gemeint haben, ausreicht, da es nur einmal nach innen geht. Das Gitter muss ziemlich groß sein, um ein konkaves Polygon zu erstellen. Wenn Sie einen vorgeschlagenen Testfall haben, den ich zusätzlich hinzufügen sollte, lassen Sie es mich wissen.
Kevin Cruijssen

@ Shaggy Du hast irgendwie recht. Als ich die Herausforderung habe ich die Form der sah o, O,0 wobei Kreise als einzelne Polygone, sondern in einer Lösung ist es nicht viel hinzuzufügen, außer , dass die o, O, 0sollten vermieden werden , wenn größere Polygone bilden, und das Hinzufügen von ihnen eine Zählung. Es ist jedoch zu spät, um es jetzt zu ändern.
Kevin Cruijssen

Antworten:


4

Python 2 , 714 737 821 Bytes

  • -23 Bytes dank 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

Probieren Sie es online aus!

  1. Für jeden Buchstaben A(außer o, Ound 0) der Code build ein Diagramm , das die Nachbarschaft der verschiedenen Vorkommen von Buchstaben darstellt Aund Raum in der Anfang gegebenen Matrix. Anschließend wird die Menge der halbgetrennten Zyklen berechnet, die den Graphen abdecken, wenn die Anzahl der Zyklen maximiert wird (die Trennung basiert nur auf dem Buchstaben A, derselbe Raum kann für mehrere Zyklen verwendet werden).

  2. Der Code besteht alle Tests.

  3. Eingabe: Die Liste der Zeilen der Matrix.

  4. Weitere Erklärungen und Golfen folgen in Kürze.

1
714 Bytes durch Verwendung einer Kombination aus Tabulatoren und Leerzeichen als Einrückungen anstelle von nur Leerzeichen.
Kevin Cruijssen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.