막 다른 라벨


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 적어도 다른 도로 타일, N-1 로 간주되는의 데드 끝 이 규칙 이미. "테두리"는 네 가지 기본 방향이므로 대각선으로 경계를 이루는 타일은 계산되지 않습니다.

새로 생성 된 막 다른 골목 자체가 더 많은 막 다른 골목을 만들 수 있으므로이 규칙은 반복적으로 적용 됩니다 . 또한 하나의 다른 도로 타일과 경계를 이루는 도로 타일은 규칙을 처음 적용 할 때 다른 골목 으로 간주 됩니다.

입력 및 출력은 단일 문자열 ( #또는 아닌 문자로 구분 된 행 .) 또는 배열 / 목록 / 등일 수 있습니다. 언어가 지원하는 경우 각 줄을 함수 인수로 입력 할 수도 있습니다.

입력에 대해 다음을 가정 할 수 있습니다.

  • 항상 하나 이상의 "루프", 즉 #무한대로 따라갈 수있는 문자 그룹 이 있습니다. 그렇지 않으면 모든 단일 타일이 막 다른 골목이 될 것입니다.

  • 이것은 가장 작은 루프가 다음과 같기 때문에 입력이 항상 2x2 이상임을 의미합니다.

    ##
    ##
    

    (실수로 변경없이 출력해야합니다.)

  • 모든 #문자가 연결됩니다. 즉,에 대해 채우기를 수행하면 #모든 항목이 영향을받습니다.

이것은 이므로 바이트 단위의 가장 짧은 코드가 승리합니다.

위의 예와 작은 2x2 격자를 테스트 사례로 사용할 수 있습니다 (이 과제에서 다루기에는 많은 경우가 없습니다).

답변:


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.

(Martin은 2 바이트를 절약했습니다. 감사합니다!)


그것은 내가 본 것 중 가장 긴 방해 답변 중 하나입니다. =)
제임스

2
@DJMcGoathem Ummm ...
Martin Ender

인가 '#"#"CJam 다른?
ETHproductions

그렇습니다. "#"와 같습니다 ['#].
Lynn

5

자바 스크립트 (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

@ edc65 영리한. 감사!
user81655

0

파이썬 (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) 당신은 모든 목록 (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'를 사용할 수있다
유안

죄송합니다, 문자열 불변성에 관한 것을 놓쳤습니다. 또한 모든 상수 ( r, gd)를 함수 밖으로 이동할 수 있습니다 (표를 절약 할 수 있음). split () 주위에서 노는 것이 도움이 될 수 있습니다. t=[d+list(i)+d for i in s.split()]길이를 계산 한 다음 끝에 줄에 점선을 추가 한 다음이 확장 길이로 작동하도록주기를 변경하십시오. 코드가 짧아 질지 확실하지 않을 수도 있지만
Alissa

@Alissa 나는 당신의 다른 주석을 테스트 할 것이기 때문에 g를 함수 밖으로 옮길 수 없다
Erwan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.