Nhãn chết


16

Đưa ra một đầu vào của "con đường" nghệ thuật ASCII, đầu ra con đường với tất cả các ngõ cụt được dán nhãn.

Đây là một con đường:

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

Đây là con đường có ngõ cụt được dán nhãn X:

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

Một ngõ cụt được định nghĩa là bất kỳ ngói đường biên giới n gạch đường khác, ít nhất là n-1 trong số đó được coi là những ngõ cụt đã được quy tắc này. "Biên giới" nằm trong bốn hướng chính, do đó, các đường viền giáp đường chéo không được tính.

Quy tắc này được áp dụng nhiều lần, vì chính những ngõ cụt mới được tạo ra có thể tự tạo ra nhiều ngõ cụt hơn . Cũng lưu ý rằng bất kỳ lát đường nào chỉ giáp với một lát đường khác đều được coi là ngõ cụt trong lần đầu tiên áp dụng quy tắc này.

Đầu vào và đầu ra có thể là một chuỗi đơn (với các dòng được phân tách bằng bất kỳ ký tự nào không #hoặc .) hoặc một mảng / danh sách / v.v. Nếu ngôn ngữ của bạn hỗ trợ nó, bạn cũng có thể lấy đầu vào với mỗi dòng là một đối số chức năng.

Bạn có thể giả sử như sau về đầu vào:

  • Sẽ luôn có ít nhất một "vòng lặp", một nhóm các #nhân vật có thể được theo dõi vô tận. (Nếu không, mỗi ô sẽ trở thành ngõ cụt.)

  • Điều này ngụ ý rằng đầu vào sẽ luôn là 2 × 2 hoặc lớn hơn, vì vòng lặp nhỏ nhất là:

    ##
    ##
    

    (Mà, tình cờ, nên là đầu ra không có thay đổi.)

  • Tất cả các #nhân vật sẽ được kết nối. Đó là, nếu bạn thực hiện việc lấp lũ trên bất kỳ #, tất cả chúng sẽ bị ảnh hưởng.

Vì đây là , mã ngắn nhất tính bằng byte sẽ thắng.

Ví dụ ở trên và lưới 2 × 2 nhỏ có thể được sử dụng làm trường hợp thử nghiệm (không có nhiều trường hợp cạnh để giải quyết trong thử thách này).

Câu trả lời:


8

CJam, 61 byte

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

Hãy thử nó ở đây .

Giải trình

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.

(Martin đã lưu hai byte, cảm ơn!)


Đó là một trong những câu trả lời dài nhất mà tôi từng thấy. =)
DJMcMayhem

2
@DJMcGoathem Ummm ...
Martin Ender

Chúng tôi '#"#"khác nhau ở CJam?
Sản phẩm ETH

Đúng, họ là. "#"bằng ['#].
Lynn

5

JavaScript (ES6), 110 109 byte

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

Lưu 1 byte nhờ @ edc65 !

Giải trình

Cách tiếp cận rất đơn giản cho vấn đề. Tìm kiếm cho mỗi# , và nếu có ít hơn 2 #giây xung quanh nó, thay thế nó bằng một X. Lặp lại quá trình này nhiều lần cho đến khi nó được đảm bảo tất cả các ngõ cụt đã được thay thế bằng 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
Thủ thuật phổ biến mà tôi sử dụng luôn cho loại nhiệm vụ này. Khi bạn sử dụng cả l và -l theo cùng một cách, bạn có thể tính toán l=~r.searchthay vì l=1+r.search. (Chỉ lưu 1 byte)
edc65

@ edc65 Khéo léo. Cảm ơn!
dùng81655

0

Con trăn (3.5) 362 331 329 314 byte

cảm ơn @Alissa. cô ấy giúp tôi giành được ~ 33 byte

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]))

Giải thích

d='.'
r=range

Định nghĩa hàm

def f(s):

Thêm đường viền của '.' bên phải và bên trái của bảng

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

Thêm đường viền của '.' trên và dưới

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

Hàm Lambda để kiểm tra '#'

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

Lặp lại độ dài đầu vào để đảm bảo chúng ta không quên ngõ cụt

 for k in r(l*c):

Vòng lặp trên cột và đường

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

Kiểm tra xem chúng tôi có '#' xung quanh và trên vị trí không

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

Thay thế '#' bằng 'X'

     t[h][x]='X'

Cắt đường viền chứa đầy '.' và tham gia chuỗi

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

Sử dụng

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) sử dụng split()thay vì splitlines(). 2) t=['.'*(c+2)]+['.'+i+'.'for i in s]+['.'*(c+2)]ngắn hơn. Và nó có thể được rút ngắn hơn nữa: d='.';t=[d*c]+t+[d*c];t=[d+i+d for i in t]3) bạn không cần tất cả danh sách (zip (....)), hãy sử dụngprint('\n'.join([''.join(i[1:-1])for i in t])
Alissa

@Alissa cảm ơn sự giúp đỡ của bạn, tôi sử dụng các mẹo của bạn cho điểm 1) và 3) nhưng đối với 2) tôi không thể xóa tất cả dấu ngoặc, chúng tôi cần một danh sách danh sách char chứ không phải danh sách chuỗi vì 'str' object does not support item assignment. danh sách danh sách cho phép tôi sử dụng t [h] [x] = 'X'
Erwan

xin lỗi, tôi đã bỏ lỡ điều về tính bất biến của chuỗi. Bạn cũng có thể di chuyển tất cả các hằng số ( r, gd) ra khỏi chức năng của bạn (giúp bạn tiết kiệm một số lập bảng). Có thể một số người chơi xung quanh split () có thể giúp : t=[d+list(i)+d for i in s.split()], sau đó tính toán độ dài, sau đó thêm các dòng chấm vào cuối một đầu và sau đó thay đổi chu kỳ của bạn để hoạt động với các độ dài mở rộng này. Không chắc chắn nếu nó sẽ rút ngắn mã, nhưng nó có thể
Alissa

@Alissa Tôi không thể chuyển g ra khỏi chức năng vì nó sử dụng tôi sẽ kiểm tra bình luận khác của bạn
Erwan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.