代码:高尔夫预告牌2022事件的一部分。有关详细信息,请参阅链接的元帖子。
我们都知道,圣诞老人从烟囱里下来给好孩子送礼物。所以他们决定用电子鼓风机把烟吹出去。
烟囱被建模为矩形网格。每个单元格中的数字表示该区域的烟雾量。左右两边是墙壁,顶部是开放的,吹风机是从底部吹来的。
||========||
|| |99| ||
||--+--+--||
|| | |24||
||--+--+--||
||36| |12||
||--+--+--||
|| | | ||
||--+--+--||
|| |50| ||
||^^^^^^^^||每一秒,以下情况都会按顺序发生。在任何步骤中,烟囱外通过顶部的烟雾都被排除在模拟之外。
n的烟雾量。然后,对于每个可用的方向,确切地说,floor(n/5)的烟雾量向这个方向移动。在上述初始状态下,烟雾将以以下方式移动和扩散:
After step 1:
||========||
|| | |24||
||--+--+--||
||36| |12||
||--+--+--||
|| | | ||
||--+--+--||
|| |50| ||
||--+--+--||
|| | | ||
||^^^^^^^^||
After step 2: (1 second passed)
||========||
||7 |4 |14||
||--+--+--||
||15|9 |10||
||--+--+--||
||7 |10|2 ||
||--+--+--||
||10|10|10||
||--+--+--||
|| |10| ||
||^^^^^^^^||
2 seconds passed:
||========||
||8 |12|5 ||
||--+--+--||
||11|6 |8 ||
||--+--+--||
||7 |10|6 ||
||--+--+--||
||4 |4 |4 ||
||--+--+--||
|| |2 | ||
||^^^^^^^^||
5 seconds passed:
||========||
||5 |1 |5 ||
||--+--+--||
||1 |4 |1 ||
||--+--+--||
|| | | ||
||--+--+--||
|| | | ||
||--+--+--||
|| | | ||
||^^^^^^^^||7秒后,这个烟囱完全没有烟雾了。
给定一个非负整数的二维网格,表示烟囱中烟雾的当前状态,模拟上面指定的烟囱,并在1秒后输出状态。你可以假设烟囱至少有2单位宽,2单位高。
适用标准的密码-高尔夫规则。以字节为单位的最短代码获胜。
[[0, 99, 0], [0, 0, 24], [36, 0, 12], [0, 0, 0], [0, 50, 0]]
-> [[7, 4, 14], [15, 9, 10], [7, 10, 2], [10, 10, 10], [0, 10, 0]]
-> [[8, 12, 5], [11, 6, 8], [7, 10, 6], [4, 4, 4], [0, 2, 0]]
-> [[7, 7, 7], [8, 5, 6], [5, 6, 5], [0, 2, 0], [0, 0, 0]]
-> [[7, 4, 5], [4, 5, 4], [1, 3, 1], [0, 0, 0], [0, 0, 0]]
-> [[5, 1, 5], [1, 4, 1], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
-> [[1, 4, 1], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]
-> [[0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0], [0, 0, 0]]发布于 2022-12-14 00:58:48
E=enumerate
def f(b):
while any(map(any,b)):
T=[]
for x,r in E(b):
for y,c in E(r):
b[x][y]=0;p=x-1
if x:
b[p][y]=c
for X,Y in(0,1),(-1,0),(1,0),(0,-1):
K=0<=y+Y<len(b[0]);b[p][y]-=c//5*K
if-1<p+X<len(b):T+=K*[(p+X,y+Y,c//5)]
for x,y,v in T:b[x][y]+=v
yield b发布于 2022-12-14 06:12:57
a=>a.map((r,y)=>r.map((c,x)=>(g=c=>p+2&&c/5*(p-y<3)+c%5*!p--+g((R=a[y-~(p>1)])?R[x+p%2]??R[x]:0)|0)(c,p=3)))对于单元格(x,y),函数后面的值是:
sum(
floor(a[x,y]/5) only if (y is not 0),
floor(a[x,y+1]/5),
floor(a[x-1,y+1]/5),
floor(a[x+1,y+1]/5),
floor(a[x,y+2]/5),
a[x,y+1] mod 5,
floor(a[x,y+1]/5) only if (x is one of edge),
)发布于 2022-12-14 02:24:06
m=>[...m,m[0].fill(0)].map((r,y,m)=>r.map((v,x)=>[-1,s=0,1,2].map(d=>s-=1/(V=m[y+d%2]?.[x+~-d%2])?~(V/5)-~(v/5):0)|v+s)).slice(1)https://codegolf.stackexchange.com/questions/255464
复制相似问题