首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >CGAC2022第14天:清扫烟囱

CGAC2022第14天:清扫烟囱
EN

Code Golf用户
提问于 2022-12-14 00:08:47
回答 5查看 670关注 0票数 9

代码:高尔夫预告牌2022事件的一部分。有关详细信息,请参阅链接的元帖子。

我们都知道,圣诞老人从烟囱里下来给好孩子送礼物。所以他们决定用电子鼓风机把烟吹出去。

烟囱被建模为矩形网格。每个单元格中的数字表示该区域的烟雾量。左右两边是墙壁,顶部是开放的,吹风机是从底部吹来的。

代码语言:javascript
运行
复制
||========||
||  |99|  ||
||--+--+--||
||  |  |24||
||--+--+--||
||36|  |12||
||--+--+--||
||  |  |  ||
||--+--+--||
||  |50|  ||
||^^^^^^^^||

每一秒,以下情况都会按顺序发生。在任何步骤中,烟囱外通过顶部的烟雾都被排除在模拟之外。

  1. 烟雾往上吹了一个牢房。
  2. 烟雾扩散到相邻的(4路)细胞(包括外部).
    • 假设一个单元格含有n的烟雾量。然后,对于每个可用的方向,确切地说,floor(n/5)的烟雾量向这个方向移动。

在上述初始状态下,烟雾将以以下方式移动和扩散:

代码语言:javascript
运行
复制
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单位高。

适用标准的密码-高尔夫规则。以字节为单位的最短代码获胜。

测试用例

代码语言:javascript
运行
复制
[[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]]
EN

回答 5

Code Golf用户

发布于 2022-12-14 00:58:48

Python3,301个字节:

代码语言:javascript
运行
复制
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

在网上试试!

票数 3
EN

Code Golf用户

发布于 2022-12-14 06:12:57

JavaScript (Node.js),108个字节

代码语言:javascript
运行
复制
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),函数后面的值是:

代码语言:javascript
运行
复制
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),
)
票数 2
EN

Code Golf用户

发布于 2022-12-14 02:24:06

JavaScript (ES2020),129个字节

代码语言:javascript
运行
复制
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)

在网上试试!

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

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

复制
相关文章

相似问题

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