首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >预测落石

预测落石
EN

Code Golf用户
提问于 2014-11-11 07:55:36
回答 3查看 1.1K关注 0票数 18

在这个挑战中,你会得到一张二维地形的地图,从侧面看。不幸的是,地形的某些部分漂浮在空中,这意味着它们会崩溃。你的工作是预测他们降落的地方。

输入

您的输入是一个或多个换行符分隔的字符串,长度相等,只包含字符# (数字符号,表示岩石)或. (句号,表示空空间)。

输出

您的输出具有与输入相同的格式,但需要进行以下修改。让我们把输入字符串看作一个二维的岩石网格。输入端的每一块岩石,通过相邻岩石的路径连接到网格底部,都是牢固的,其他的岩石是松散的。对角线相邻的岩石不被认为是相邻的。所有松散的岩石都会直接掉下来,最后形成一堆坚硬的岩石或底部的岩石。松散的岩石彼此不相连,所以它们会单独坠落,而不是大的地层。输出是生成的网格。

示例

  • 输入..###。.##.#。.#....##.#。不含松动岩石,因此输出与之相同。
  • 输入...#...#..#。.#..## .#...# .##### .#...#在顶部有一个松动的岩石,落在它下面的坚硬岩石上。输出是..#..#。.#..## .#.#.# .##### .#...#
  • 输入.#####..。.#....#### ###.###..# #.#...##..####..#.# ......###...#...#..# ..#...#..#左边有一大群松散的岩石。当岩石脱落时,这群人就会垮掉,所以产量是.....###### ..#.###..# .#...##...##....#...##...#### ####..#..# #####.#..#

Clarifications

  • 您可以从STDIN获取输入并输出到STDOUT,也可以编写函数。
  • 这是代码-高尔夫,所以最短的程序(字节)是赢家。
  • 标准的漏洞是不允许的。
EN

回答 3

Code Golf用户

发布于 2014-11-12 09:34:03

JavaScript (ES6) 232

代码语言:javascript
复制
s=>{for(s=[...s+'1'.repeat(r=1+s.search('\n'))];s=s.map((c,p)=>c=='#'&(s[p+1]|s[p-1]|s[p-r]|s[p+r])?f=1:c,f=0),f;);for(;s.map((c,p)=>c=='#'&s[p+r]=='.'&&(s[p]='.',f=s[p+r]=c),f=0),f;);return s.join('').replace(/1/g,rok).slice(0,-r)}

作为一个带有字符串参数的函数并返回一个字符串。

首先,添加底部一行“1”来识别地线。

第一个循环搜索固定岩石(接近'1'),并将其标记为'1‘为well.The搜索,直到找不到更牢固的岩石为止。

第二个循环将剩余的'#‘字符移动到底部行。再一次,这是重复的,直到岩石不能移动。

最后,将“1”再次替换为“#”,并剪下一行。

少镀金

代码语言:javascript
复制
s=>{
  r = 1+s.search('\n');
  s = [...s+'1'.repeat(r)];
  for (; s = s.map((c,p) => c=='#' & (s[p+1]|s[p-1]|s[p-r]|s[p+r])?f=1:c,f=0),f; );
  for (; s.map((c,p) => c=='#' & s[p+r]=='.'&& (s[p] ='.', s[p+r]=c, f=1),f=0),f; );
  return s.join('')
    .replace(/1/g,'#')
    .slice(0,-r)
}

测试(你可以有证据证明什么岩石是坚固的,什么是落下的)

代码语言:javascript
复制
F=
s=>{for(s=[...s+'1'.repeat(r=1+s.search('\n'))];s=s.map((c,p)=>c=='#'&(s[p+1]|s[p-1]|s[p-r]|s[p+r])?f=1:c,f=0),f;);for(;s.map((c,p)=>c=='#'&s[p+r]=='.'&&(s[p]='.',f=s[p+r]=c),f=0),f;);return s.join('').replace(/1/g,rok).slice(0,-r)}

var rok // using rok that is 3 chars like '#'

function update() {
  rok = C.checked ? '@' : '#';
  O.textContent=F(I.textContent)
}

update()
代码语言:javascript
复制
td { padding: 5px }
pre { border: 1px solid #000; margin:0 }
代码语言:javascript
复制
<table><tr><td>Input</td><td>Output</td></tr>
<tr><td><pre id=I>.#####....
.#....####
###.###..#
#.#...##..
.####..#.#
......###.
..#...#..#
..#...#..#</pre></td>
<td><pre id=O></pre>
</td></tr></table>
<input type='checkbox' id=C oninput='update()'>Show firm rocks
票数 5
EN

Code Golf用户

发布于 2014-11-11 19:51:37

JS-443字节

代码语言:javascript
复制
function g(b){function f(b,c,e){return b.substr(0,c)+e+b.substr(c+1)}function e(d,c){"#"==b[c][d]&&(b[c]=f(b[c],d,"F"),1<d&&e(d-1,c),d<w-1&&e(d+1,c),1<c&&e(d,c-1),c<h-1&&e(d,c+1))}b=b.split("\n");w=b[0].length;h=b.length;for(i=0;i<w;i++)"#"==b[h-1][i]&&e(i,h-1);for(j=h-2;-1<j;j--)for(i=0;i<w;i++)if(k=j+1,"#"==b[j][i]){for(;k<h&&"F"!=b[k][i]&&"#"!=b[k][i];)k++;k--;b[j]=f(b[j],i,".");b[k]=f(b[k],i,"#")}return b.join("\n").replace(/F/g,"#")};

洪水从底部注入岩石,然后将未被洪水淹没的岩石压下来.使用大量的递归与洪水填充,因此它可能会滞后您的浏览器一段时间。

这是一个函数-用g("input")调用它

JSFiddle:http://jsfiddle.net/mh66xge6/1/

Ungolfed:http://jsfiddle.net/mh66xge6/

票数 2
EN

Code Golf用户

发布于 2014-11-11 22:46:38

Python 3,364字节

我敢肯定会有更多的人被挤出.但无论如何,它永远不会与CJam和Perl竞争。

代码语言:javascript
复制
z="%";R=range
def F(r,c,g):
 if z>g[r][c]:g[r][c]=z;[F(r+d%2*(d-2),c+(d%2-1)*(d-1),g)for d in R(4)]
def P(s):
 t=s.split()[::-1];w=len(t[0]);g=[list(r+".")for r in t+["."*w]];[F(0,c,g)for c in R(w)]
 for c in R(w):
  for r in R(len(g)):
   while g[r][c]<z<g[r-1][c]and r:g[r][c],g[r-1][c]=".#";r-=1
 return"\n".join(''.join(r[:w])for r in g[-2::-1]).replace(z,"#")

类似于其他的答案。一个奇怪之处是,它首先将网格颠倒(以使循环索引更方便),并添加额外的.行和列(以避免包装-1索引时出现的问题)。通过调用P(string)来运行。

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

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

复制
相关文章

相似问题

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