以下是清点自由挑战的高级版本。
自由和团体一词的定义与前一项挑战相同,因此,请看一下前一项的细节,但简单地说,
例如,
. . O .
. X X .
. X . .
. O O .黑组(X)有5项自由,上层白人(O)有2项自由,下一组白人有3项自由。
对于输入,您将得到一个任意大小的2D数组,其中每个单元格都有一个black、white或empty。您可以为black、white和empty映射任何数据类型的值;但是可以将一个值映射到每个值。
输入中的所有组都有一个或更多的自由。
输出时,具有empty的单元将是0,而具有black或white的单元将填充其组的自由数量。
. . 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如果你参与了之前的挑战,那么必须计算多个群体的自由可能需要一个完全不同的策略。
发布于 2022-05-17 16:07:41
发布于 2022-05-17 18:40:00
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')https://codegolf.stackexchange.com/questions/247438
复制相似问题