标签死角


16

在输入ASCII艺术字“道路”的情况下,输出标记了所有死角的道路。

这是一条路:

########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########

这是一条带有字母标记的死胡同的道路X

########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX

一个死胡同被定义为任何道路瓦片边界ň其他道路砖,至少n-1个,其中被认为死角此规则了。“边界”是在四个基本方向上进行的,因此对角接壤的图块不计算在内。

重复应用此规则,因为新创建的死胡同本身可以创建更多的死胡同。另请注意,第一次仅应用该规则时,仅与另一个道路砖接壤的任何道路砖都被视为死角

输入和输出可以是单个字符串(用非#或字符分隔的行.)或数组/列表/等。如果您的语言支持,您也可以接受输入,并且每一行都是一个函数参数。

您可以假设以下有关输入的内容:

  • 总会有至少一个“循环”,#即可以无限跟随的一组字符。(否则,每个单独的图块都将变成死胡同。)

  • 这意味着输入将始终为2×2或更大,因为最小的循环为:

    ##
    ##
    

    (顺便说一下,应该原样输出)。

  • 所有#字符将被连接。也就是说,如果您要对any进行洪水填充#,那么所有这些都会受到影响。

由于这是,因此以字节为单位的最短代码将获胜。

上面的示例和微小的2×2网格可用作测试用例(在此挑战中没有很多要涵盖的边缘案例)。

Answers:


8

CJam,61个字节

q_N/{{0f+zW%}4*3ew:z3few::z{e__4=_@1>2%'#e=*"#"='X@?}f%}@,*N*

在这里尝试。

说明

Outline:

    q_N/               Read input lines
        {   }@,*       Perform some operation as many times as there are bytes
                N*     Join lines

Operation:

    {0f+zW%}4*         Box the maze with zeroes
    3ew:z3few::z       Mystical 4D array neighborhood magic.
                       (Think: a 2D array of little 3x3 neighborhood arrays.)

    {                        }f%    For each neighborhood, make a new char:
     e_                                 Flatten the neighborhood
       _4=_                             Get the center tile, C
           @1>2%                        Get the surrounding tiles
                '#e=                    Count surrounding roads, n
                    *                   Repeat char C n times
                     "#"=               Is it "#"? (i.e., C = '# and n = 1)
                         'X@?           Then this becomes an 'X, else keep C.

(马丁节省了两个字节,谢谢!)


这是我见过的最长的Cjam答案之一。=)
DJMcMayhem

2
@DJMcGoathem Ummm ...
Martin Ender

'#"#"在CJam不同?
ETHproductions '02

是的,他们是。"#"等于['#]
林恩

5

的JavaScript(ES6),110个 109字节

r=>[...r].map(_=>r=r.replace(g=/#/g,(_,i)=>(r[i+1]+r[i-1]+r[i+l]+r[i-l]).match(g)[1]||"X"),l=~r.search`
`)&&r

@ edc65节省了1个字节!

说明

解决问题的方法非常简单。搜索每个#,如果#周围少于2 秒,则将其替换为X。重复此过程很多次,直到确保所有死角都已被Xs 取代。

var solution =

r=>
  [...r].map(_=>                    // repeat r.length times to guarantee completeness
    r=r.replace(g=/#/g,(_,i)=>      // search for each # at index i, update r once done
      (r[i+1]+r[i-1]+r[i+l]+r[i-l]) // create a string of each character adjacent to i
      .match(g)                     // get an array of all # matches in the string
        [1]                         // if element 1 is set, return # (the match is a #)
        ||"X"                       // else if element 1 is undefined, return X
    ),
    l=~r.search`
`                                   // l = line length
  )
  &&r                               // return the updated r
<textarea id="input" rows="10" cols="40">########.....######..#..###
#......#######....#..#..#.#
#.##......#...#####..#..###
#..#####..#....#..#######.#
#......#...#####.....##...#
#..###.#...#...###...#..###
##########.#..#..##..#.##.#
..#......#.######.#..#.#.#.
..#......#.#..#.#.#..#.#.#.
..######.###..##..#########</textarea><br>
<button onclick="result.textContent=solution(input.value)">Go</button>
<pre id="result"></pre>


1
我经常用于此类任务的常见技巧。由于您以相同的方式使用l和-l,因此可以l=~r.search代替进行计算l=1+r.search。(仅保存1个字节)
edc65 '16

@ edc65聪明。谢谢!
user81655 '16

0

的Python(3.5)362 331 329 314字节

感谢@Alissa。她帮我赢了〜33个字节

d='.'
r=range
def f(s):
 t=[list(d+i+d)for i in s.split()]
 c=len(t[0])
 u=[[d]*c]
 t=u+t+u
 l=len(t)
 g=lambda h,x:t[h][x]=='#'
 for k in r(l*c):
  for h in r(1,l):
   for x in r(1,c):
    if g(h,x) and g(h+1,x)+g(h-1,x)+g(h,x+1)+g(h,x-1)<2:
     t[h][x]='X'
 print('\n'.join([''.join(i[1:-1])for i in t][1:-1]))

说明

d='.'
r=range

功能定义

def f(s):

添加边框“。” 在板的左右两侧

 t=[list(d+i+d)for i in s.split()]
 c=len(t[0])
 u=[[d]*c]

添加边框“。” 在顶部和底部

 t=u+t+u
 l=len(t)

Lambda函数测试“#”

 g=lambda h,x:t[h][x]=='#'

循环输入长度,以确保我们不会忘记死胡同

 for k in r(l*c):

在列和行上循环

  for h in r(1,l):
   for x in r(1,c):

测试位置附近是否有“#”

    if g(h,x) and g(h+1,x)+g(h-1,x)+g(h,x+1)+g(h,x-1)<2:

将“#”替换为“ X”

     t[h][x]='X'

裁剪填充有“。”的边框 并加入字符串

 print('\n'.join([''.join(i[1:-1])for i in t][1:-1]))

用法

f("########.....######..#..###\n#......#######....#..#..#.#\n#.##......#...#####..#..###\n#..#####..#....#..#######.#\n#......#...#####.....##...#\n#..###.#...#...###...#..###\n##########.#..#..##..#.##.#\n..#......#.######.#..#.#.#.\n..#......#.#..#.#.#..#.#.#.\n..######.###..##..#########")

########.....######..X..###
#......#######....#..X..#.#
#.XX......X...X####..X..###
#..XXXXX..X....#..#######.#
#......X...#####.....##...#
#..###.X...#...###...#..###
##########.#..X..##..#.##.X
..X......#.#XXXXX.#..#.#.X.
..X......#.#..X.X.#..#.#.X.
..XXXXXX.###..XX..######XXX

1)使用split()代替splitlines()。2)t=['.'*(c+2)]+['.'+i+'.'for i in s]+['.'*(c+2)]较短。而且它甚至可以进一步缩短:d='.';t=[d*c]+t+[d*c];t=[d+i+d for i in t]3)您不需要所有list(zip(....))东西,使用print('\n'.join([''.join(i[1:-1])for i in t])
Alissa

@Alissa感谢您的帮助,我在1)和3)中使用了提示,但对于2)我无法删除所有括号,我们需要一个char列表而不是一个字符串列表,因为'str' object does not support item assignment。列表列表允许我使用t [h] [x] ='
X'– Erwan

抱歉,我错过了关于字符串不变性的事情。您也可以将所有的常量(rgd)你的功能(可以节省你一些制表)。也许在split()周围玩一些游戏可能会有所帮助:t=[d+list(i)+d for i in s.split()],然后计算长度,然后将点线添加到开头,然后到开头,然后更改循环以使用这些扩展长度。不知道是否会缩短代码,但是可能会
Alissa

@Alissa我无法将g移出该函数,因为它使用了t,我将测试您的其他评论
Erwan
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.