填满湖泊


19

给定ASCII图片格式的土地地形,计算出湖泊将往何处填满。假定有无数的降雨。

输入

         #               
         ##              
      # ####             
#    #########           
##  ###########          
## #############   ####  
## ##############  ##### 
################# #######
#########################
#########################

输出

         #               
         ##              
      #@####             
#@@@@#########           
##@@###########          
##@#############@@@####  
##@##############@@##### 
#################@#######
#########################
#########################

输入将仅包含空格和#标记。每行的长度相同。输出应该是相同的#模式,并带有将在其中积聚水的空间并填充@标记。

底部输入行将始终是所有#号。土地上不会有孔洞或悬垂物。最短的代码胜出。


这似乎有点容易。我认为,我们也应该有显示的湖水单元的数量@是被填充的。
mellamokb

1
@mellamokb:这大概是一个([char[]]"$a"-eq'@').Count这里。没有太多的补充。同意这样做有点太容易了。但是,这并不属于我会否决的领域。
乔伊(Joey)

3
有关堆栈溢出的信息:Code Golf:流水。我想,LiraNuna最好的一种。
dmckee,2011年

1
那么,我们还必须处理地下洞穴吗?这些地下洞穴可能像流水难题一样具有高于水位的空气?这使事情更具挑战性,我认为应该绝对是一个示例用例。
mellamokb

@dmckee:虽然那不是那么容易。
乔伊(Joey)

Answers:


8

sed -r,27 24(带有的27 -r

24(27):

:;s/(#|@) ( *#)/\1@\2/;t

27(30):

:e;s/([#@]) ( *#)/\1@\2/;te

与两种perl解决方案中的更好者竞争


#|@会缩短一个字符

2
您应该将-r标志的计数加3。您可以从删除es中删除两个,从S.Mark的建议中删除另一个,回到27。
2011年

@Nabb谢谢,发现了带有空标签的东西
asoundmove 2011年

我以前试过用sed,但失败了
铭堂

@Keith,感谢您的奖励。
2011年

7

Perl,25岁

s/# +#/$_=$&;y| |@|;$_/ge

我添加了一个字符数。请查看它是否确实正确,因为它可能需要包括一些解释器标志(-p也许吗?)。
乔伊(Joey)

我不懂perl语言,但我能感受到它的力量:)
蚂蚁

实际上,它需要`-pe`才能在我的盒子上运行,因此应该额外增加4个字符。还是e不算数,因此只需要3个额外的字符?
2011年

出于同样的原因,也不需要我在其他地方提到的e。:)
罗伯特·P

6

Perl(> = v5.9.5),24个字符

运行perl -p

1while s/#.*\K (?=\S)/@/

这要求Perl 5.9.5或更高版本使用特殊转义符\K


1
除非Nabb是正确的,否则您需要将-p计为3个字符,使总数达到27个字符。实际上,它需要使用-pe . I don't know the full rules about flags, so not sure the e计数。
2011年

如果您只是简单地按Enter键,然后将其键入,或者将代码放在文件中并运行它,则实际上并不需要e。因此,-e并不是真正需要的。:)
罗伯特·P

3

Windows PowerShell,36 74 138

$input-replace'(?<!^ *) (?! *$)','@'

2

视网膜,10字节

视网膜比这个挑战要新得多。但是这个解决方案太整齐了,不能发布它:

T` `@`#.*#

在线尝试。

这只是简单的音译阶段,用代替空格@,但操作仅限于匹配#.*#,即字符在两侧都被大地包围。


1

Ruby 1.8,30个字符

#!ruby -p
gsub(/# +#/){$&.tr" ","@"}

如果有人知道为什么它在Ruby 1.9(经1.9.2p0和1.9.2p204测试)中不起作用,即使文档说它应该可以工作,请告诉我!


真的很奇怪,在$_=$_.第二行的开头添加内容使其可以在1.9.2中使用,因此与关联Kernel.gsub。没有明确添加,Rubinius也将失败$_
Nemo157

根据1.9.1 NEWS日志,不建议使用内核#getc,#gsub,#sub。

1
我认为您可以将其计算为30(需要-p标记的为27 + 3 )。哈希值和解释器的名称不计算在内。
卡莱布(Caleb)

1

Python,95 92字节

for s in S.split('\n'):b=s.find('#');e=s.rfind('#');print s[:b]+s[b:e].replace(' ','@')+s[e:]

1

05AB1E17 16 字节

|εγć?D¨ð'@:sθJJ,

在线尝试。

说明:

|            # Take all input-lines as list
 ε           # For each line:
  γ          #  Split the line into chunks of consecutive equal characters
             #   i.e. " ##   # " → [' ','##','   ','#',' ']
   ć         #  Split into head and the rest of the list
             #   i.e. [' ','##','   ','#',' '] → ['##','   ','#',' '] and ' '
    ?        #  Print this head
   D         #  Duplicate the rest of the list
    ¨        #  Remove the last element
             #   i.e. ['##','   ','#',' '] → ['##','   ','#']
     ð'@:    #  Replace every space with a "@"
             #   i.e. ['##','   ','#'] → ['##','@@@','#']
     sθ      #  Swap so the duplicated list is at the top, and take the last item as is
             #   i.e. ['##','   ','#',' '] → ' '
         JJ  #  Join the lists and individual items in the list together to a single string
             #   i.e. ['##','@@@','#'] and ' ' → "##@@@# "
           , #  Print with trailing new-line

0

Javascript,107个字节

var f=function(x){return x.replace(/# +#/g, function(x){return "#"+new Array(x.length-1).join("@")+"#";})};

取消高尔夫:

var f = function(x) {
    return x.replace(/# +#/g, function(x){
        return "#" + new Array(x.length - 1).join("@") + "#";
    })
};

我建议您(1)发布答案的常规格式版本,以便于阅读和遵循;(2)查看ES6 ...可以为您的功能节省很多字符。
SirPython

我将发布普通版本,但我不是ES6型人员。
BobTheAwesome

@BobTheAwesome您为什么只建议编辑?
蒂姆(Tim)

哦,天哪,我正在尝试修复测试用例错误,但是我有这个如果您知道xkcd,则已在chrome中启用了扩展名。对于那个很抱歉。
BobTheAwesome

除了ES6内容:逗号后不需要空格,第二个空格后不需要空格 return,你可以删除两个分号,它可以只是function f(x)...或者f=function(x)...
扎卡里

0

Python中,108个 106 92字节

import re
n=1
while n: S,n=re.subn('# +#',lambda m:'#'+'@'*len(m.group(0)[2:])+'#',S)
print S


0

点子,15字节

aR:`#.*#`_TRs'@

通过命令行参数将输入作为多行字符串:在线尝试!(或者,指定-rn标志并将第一个标志更改ag,您可以通过stdin输入:在线尝试!

与Retina答案相同的想法:将正则表达式的每个匹配替换为对匹配#.*#进行音译的结果@。在纯粹的正则表达式问题上,Pip无法与Retina的简洁性相提并论,但毕竟不是每天都能与Jelly配合。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.