閉じたポリゴンを数える


8

入力:

NxMのみ印刷可能なASCII(Unicodeの範囲を含むグリッドまたは複数行の文字列(またはその他の妥当入力フォーマット)[32,126])。

出力:

2つの特別なルールを使用して、検索できる同じ文字の閉じたポリゴンの数:

  • スペースはワイルドカードであり、任意の文字に(複数回)使用できます
  • oO、および0閉じた多角形そのものとしてカウントされ

チャレンジルール:

  • 同じ文字(またはスペース)間の(対)対角線接続が閉じたポリゴンを形成するために含まれています。
  • 他の文字(ワイルドカードスペースを除く)を超えることはできません。(つまり、以下の最初のテストケース/例では、次の2つの三角形を形成することができないA上行くことによってさんをx斜めに閉じた多角形のために使用されるすべての文字が(水平方向、垂直方向に接続する必要がありますので。)、および/または(反) )。
  • ポリゴンは、(単一文字を除く少なくとも3つの文字ですoO0)。
  • 隣接する文字の線は閉じた多角形ではありません。
  • ワイルドカードスペースを除き、同じ文字を複数のポリゴンに使用することはできません。
  • ワイルドカードスペースはとしてカウントすることができないoOまたは0
  • 3つ以上のスペースだけでは、閉じたポリゴンを形成できません。常に少なくとも1つの非スペース(およびo/ O/ 以外0)文字が必要です。
  • 入力は適切な形式にすることができます。文字マトリックス、改行区切り文字列、文字列配列、整数幅を追加した文字配列などを使用できます。
  • 入力は常にN x Mの長方形(または正方形)になるため、奇妙な入力形状はありません
  • 同じ文字を複数回使用することはできず、閉じたポリゴンをできるだけ多くしたいので、1つの大きなポリゴンの代わりに複数の文字を使用して2つ(またはそれ以上)の閉じたポリゴンを形成することは、当然のことながらカウントの目的です(これもなぜ、閉じた多角形が形成されることでoOまたは0それらは、すでに個別のポリゴンを閉じているので)、カウントされません。
  • もちろん、大文字と小文字は個別の文字として数えられます。

一般的なルール:

  • これはなので、バイト単位の最短の回答が優先されます。
    コードゴルフ言語が非コードゴルフ言語で回答を投稿することを思いとどまらせないでください。「あらゆる」プログラミング言語について、可能な限り短い答えを考え出すようにしてください。
  • デフォルトのI / Oルールを使用した回答には標準のルールが適用されるため、STDIN / STDOUT、関数/メソッドを適切なパラメーターで使用し、戻り値の型の完全なプログラムを使用できます。あなたの電話。
  • デフォルトの抜け穴は禁止されています。
  • 可能であれば、コードのテスト(TIOなど)のリンクを追加してください。
  • また、回答の説明を追加することを強くお勧めします。

例/テストケース:

入力:

AAAw
AxA4
'AoQ

出力:2これらのポリゴンは形成できるため、
ここに画像の説明を入力してください


入力:

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

出力:12これらのポリゴンは形成できるため、
ここに画像の説明を入力してください

注:
-の下の黄色のものはポリゴンではありません。なぜなら、oは既に分離されたポリゴンとしてカウントされているためです
-紫と茶色のものは閉じられていません
-赤、灰色、緑、水色は1つ以上の非ポリゴンを使用しています-他の閉じたポリゴンですでに使用されているスペース文字
ここに画像の説明を入力してください


入力(寸法は2x4):

3  3
  2 

出力:3これらのポリゴンは形成できるため、
ここに画像の説明を入力してください


入力:

AAAA
AAAA
AAxA

出力:3これらのポリゴンは形成できるため、
ここに画像の説明を入力してください

もちろん、ここでは他のポリゴンも可能ですが、3つまでです。ここでは、3ポリゴンを使用した別の有効な例を示します。
ここに画像の説明を入力してください


入力:

0QoO

出力:3これらのポリゴンは形成できるため、
ここに画像の説明を入力してください


入力:

W w
 Ww

出力:3これらのポリゴンは形成できるため、
ここに画像の説明を入力してください

最上層のスペースは3つのポリゴンすべてに使用されることに注意してください。以下は、個別に強調表示された3つのポリゴンです。
ここに画像の説明を入力してください ここに画像の説明を入力してください ここに画像の説明を入力してください


入力:

W W
 WW

出力:3、前のテストと同じ3つのポリゴンを形成できるため。つまり、2次の2つのポリゴンではありません。
ここに画像の説明を入力してください


入力:

abcdQefg
hQiQjQQk
QlQmnopQ
QqrstQQu
QvQQQwxy
QQz0QQQQ

出力:3これらのポリゴンは形成できるため、
ここに画像の説明を入力してください


2
私はこれをやりたいのです+1が、os、Os 、sが特別な大文字小文字を組み合わせ0てチャレンジに追加するものは本当にわかりません。
Shaggy

すべてのサンプルポリゴンが凸型のようです。凹型ポリゴンが除外されない限り、1つを含むテストケースを追加することをお勧めします。
アーノールド

1
@Arnauld下部にテストケースを追加しました。それは内部に1回しか行くことがないので、それがあなたの意味するものに対して十分であるかどうかはわかりません。グリッドは、凹型のポリゴンを作成するためにかなり大きくする必要があります。さらに追加する必要がある推奨テストケースがある場合は、お知らせください。
Kevin Cruijssen、

@シャギーあなたはちょっと正しいです。私はの形を見て挑戦をしたときはoO0個々のポリゴンとしての円であることが、溶液中で、それは多くを追加していない、ことを除いてoO0大きなポリゴンを形成する際に避けるべきである、と彼らのために数を追加します。しかし、今それを変更するには遅すぎます。
Kevin Cruijssen、

回答:


4

Python 2、714 737 821バイト

  • ケビン・クルーセンのおかげで-23バイト
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

オンラインでお試しください!

  1. 各文字のためのA(但し oOおよび0文字の異なる発生の隣接表すグラフ)コードのビルドA初期与えられた行列で、スペースを。次に、サイクル数を最大化するときに、グラフをカバーする半分離サイクルのセットを計算します(分離は文字のみに基づいておりA、同じスペースを複数のサイクルで使用できます)。

  2. コードはすべてのテストに合格します。

  3. 入力:行列の行のリスト。

  4. より多くの説明とゴルフがすぐに来ます。

1
スペースだけではなく、タブとスペースの組み合わせをインデントとして使用することにより、714バイト
Kevin Cruijssen、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.