首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >清点自由-先进

清点自由-先进
EN

Code Golf用户
提问于 2022-05-17 07:37:46
回答 5查看 814关注 0票数 12

以下是清点自由挑战的高级版本。

自由和团体一词的定义与前一项挑战相同,因此,请看一下前一项的细节,但简单地说,

  • 一组是水平或垂直连接的一组石头。
  • “自由”是指与一个组水平或垂直连接的空空间数。

例如,

代码语言:javascript
复制
. . O .
. X X .
. X . .
. O O .

黑组(X)有5项自由,上层白人(O)有2项自由,下一组白人有3项自由。

对于输入,您将得到一个任意大小的2D数组,其中每个单元格都有一个blackwhiteempty。您可以为blackwhiteempty映射任何数据类型的值;但是可以将一个值映射到每个值。

输入中的所有组都有一个或更多的自由。

输出时,具有empty的单元将是0,而具有blackwhite的单元将填充其组的自由数量。

示例

代码语言:javascript
复制
. . O .      0 0 2 0
. X X .  ->  0 5 5 0
. X . .      0 5 0 0
. O O .      0 3 3 0

. X . O  ->  0 2 0 1

X      1
X      1
.  ->  0
.      0
O      2
.      0

. X X .      0 3 3 0
X . X O  ->  2 0 3 2
X X O .      2 2 1 0

如果你参与了之前的挑战,那么必须计算多个群体的自由可能需要一个完全不同的策略。

EN

回答 5

Code Golf用户

发布于 2022-05-17 16:07:41

05AB1E,37字节

我的APL应答端口。这的确不是适合这份工作的语言,但还是略显逊色。

代码语言:javascript
复制
˜©DδÊ®Ā^IāsнgLâDδαO2‹*ΔDøδ*OĀ}®›øOIgä

在网上试试!

票数 3
EN

Code Golf用户

发布于 2022-05-17 18:40:00

Python3,510字节:

代码语言:javascript
复制
E=enumerate
def S(b,x,y):
 for X,Y in[(0,1),(0,-1),(1,0),(-1,0)]:
  try:
   if(A:=x+X)>=0 and(B:=y+Y)>=0:yield(A,B,b[A][B])
  except:1
def f(b):
 a,s=[],[]
 while(o:=[(x,y,c)for x,t in E(b)for y,c in E(t)if c in['X','O']and(x,y,c)not in s]):
  q,A=[o[0]],[]
  while q:x,y,c=q.pop(0);A+=[(x,y,c)];q+=[i for i in S(b,x,y)if i[-1]==c and i not in A]
  a+=[A];s+=A
 for i in a:
  for x,y,_ in i:b[x][y]=str(len({k for X,Y,_ in i for k in S(b,X,Y)if k[-1]=='.'}))
 return '\n'.join(map(' '.join,b)).replace('.','0')

在网上试试!

票数 1
EN

Code Golf用户

发布于 2022-05-20 20:55:44

八度,157个字节

代码语言:javascript
复制
function E=f(B)
A=([W,k]=(l=@bwlabel)(B==1,4))+([R,n]=l(B>1,4))+k.*~~R;
E=0*B;
for x=1:n+k
E=E+(X=A==x)*nnz(conv2(X,[0 1 0;1 0 1;0 1 0],'same').*~B);
end
end

在网上试试!

我怀疑还可以作出进一步的改进。

票数 1
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/247438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档