둘러싸고있는 것


18

나는 항상 일부 텍스트를 #s 로 둘러싸고 싶었지만 이 과제에서 내가 둘러싼 내용을 파악하는 데 어려움이 있으므로이 과제를 수행하는 프로그램을 작성하게됩니다

입력 / 출력은 줄 바꿈으로 구분됩니다.

###
#a#
###

a
 #
#a#
 #

a
  ###  
 # a #
# b c #
#######

  a 
 b c 
ABCDHIJ
E####GK
F# M #L
#   N#O
P####

  M 
   N
###A###
#C#B#o#
#d###e#
 # go#
  ###

C   o
d   e
  go

투기

  • #s는 텍스트 블록을 둘러싸고있는 것입니다.
  • # 항상 서로 인접 해 있습니다 (대각선 포함)
  • # 항상 닫힌 모양을 형성합니다
  • 하나의 #모양 만있을 것 입니다
  • 오목한 모양의 경우, 구멍은 공간으로 채워 져야합니다.
  • 출력에서 공백 유지 해야합니다

처음에 나는 .. 그냥 #s를 꺼내 거기에 가서 ... 그리고 열심히했다.
대머리 Bantha

Javascript에서 입력을 받고 개행으로 나누는 데 문제가 있습니다 ... 입력을 어떻게 받아야합니까? \n각 입력 줄 뒤의 형식으로 함수 매개 변수로 내 프로그램에 전달할 수 있습니까?
대머리 Bantha

1
유효한 입력 문자 세트는 무엇입니까?
Ton Hospel

MN 예제 의 출력에 오류가 있습니까? 출력은 _M_\n___N서식 문제로 인해 공백 대신 밑줄을 사용하여 둘러싸인 텍스트로만 구성되는 반면 abcCodego 예제에서는 출력에 #이 입력 된 공백도 포함됩니다. #S 의해 둘러싸인 텍스트 만 인쇄 할 경우, 다음의 출력 ABC의 예는 다음과 같아야 _a_\n_b_c_(대신 __a_\n_b_c) 및 출력 Codego의 예는 다음과 같아야 Co\nde\n_go(대신 C___o\nd___e\n__go).
전염병

@epidemian 아, 좋은 캐치. MN예제를 수정했습니다 . M 이후에 여분의 공간이 없어야했기 때문에
Downgoat

답변:


6

144 138 132 129 128 127 126 124 바이트

에 +2 포함 -p0

이 코드는 \0유효한 입력 문자가 아니라고 가정 합니다 (적어도 #).

STDIN의 입력으로 실행하십시오.

surround.pl < surround.txt

surround.pl:

#!/usr/bin/perl -p0
/^#[^#\0]/m&&s/^|[^#\n\0]\0/\0\0/mg,s%.%s/.(.*)/$+\0/g;/#/&&reverse"\n",/^./mg%seg until$?++<$$_++;y/\0/#/;s/^#*\n|#+$|^#//mg;y;#; 

이 코드는 작동하지만 교체 \0하고 \n, 청구 점수 그대로의 버전을하여. 줄 끝에 공백 이 있습니다. 코드가 너무 많이 반복되므로 출력을 위해 30 초 정도 기다려야 할 수 있습니다.

설명

외부에서 직교 방향으로 \0멈춰서 범람을하려고합니다 #. 그런 다음 #측면을 잘라 내고 공백으로 남은 모든 것을 바꿉니다. 플러드 필의 모든 방향을 처리하지 않으려면 대상 영역을 반복적으로 회전시키고 오른쪽에서 왼쪽으로 플러드 필 만 반복합니다

/^#[^#\0]/m                   The rotation is written such that it slices
                              off the first column. That is ok unless the
                              first column contains a # that is followed by
                              something that could be the inside. There is
                              no newline inside the [] because short lines
                              will get extended during the rotation and 
                              the character following the # will end
                              up as a \0 and match in a later round
    &&s/^|[^#\n\0]\0/\0\0/mg  In case the # could be an interior border I
                              will add two columns of \0's in front. One 
                              will be a sacrifice for the rotation, the
                              other column will end up at the end of the area
                              after two rotations and function as seed for the
                              floodfill. This regex also does one step of
                              the floodfill from the back to the front.
                              After a certain number of loops we are certain
                              to get to a first column that must not be 
                              dropped so at some point the last column is 
                              guaranteed to consist of only \0. And we only need
                              to fill backward since the rotations will make
                              any direction backward at some point

s%.%  process column  %seg    I will replace each character (including \n)
                              in the string by the next column in reversed
                              order or an empty string if there are no more
                              interesting columns. This is therefore a right
                              rotation. There are less columns than
                              characters so this loop is long enough

    s%.%s/.(.*)/$+\0/g        Remove the next (now first) character from each
                              row (so remove the column). Because the
                              original area is not necessarily a rectangle
                              add a \0 at the end of the row so we won't run
                              out out of columns (this would cause shorter
                              rows to have no entry in the new rotated row)
                              This will not do anything for empty lines so
                              they DO get squeezed out. But that is not a 
                              problem since the problem statement says there
                              will be only one # shape so any empty lines
                              are can be safely dropped (this would not be
                              so if there could be multiple # shapes because
                              that could create a new surrounded area

    /#/                       Check if any of the remaining columns still 
                              has a #. If not all remaining columns are on 
                              the outside and can be dropped
       &&reverse"\n",/^./mg   Collect the column and add a \n to its reverse

 until$?++<$$_++              Keep doing this until we get to a multiple of
                              65536 rotations when $? waraps back around to 0
                              (this is a multiple of 4 so the area is left
                              unrotated) and an area we have seen before
                              ($$_ >= 1)
                              (so all slicing and flood filling is finished)
                              $_ having been seen in a previous rotations is
                              not a problem (though rather tricky to prove)

이 시점에서 예를 들어

AB##J
E####GK
F# M #L
#   N#O
P####

다음으로 대체되었습니다.

0000000
0####00
0# M #0
#   N#0
0####00

기본적으로 내부와 직접 경계를 이루지 않는 모든 열과 행이 분리되었습니다. 남은 외부 문자는 \ 0으로 대체되었습니다. 상단과 오른쪽에는 \ 0의 추가 레이어가 있습니다. 따라서 남은 것은 정리입니다.

y/\0/#/                       Replace any outside that is left by #
s/^#*\n|#+$|^#//mg            Removes the first two and last line (the only 
                              lines that can consist of purely #)
                              Removes any trailing #
                              Removes the first column of #
y;#; \n;                      Replace any remaining # by space since they 
                              are needed to fill the concave parts
                              The final \n; is not written since it is implicit
                              in the -p loop

플러드 필이있을 경우 내부 구석을 돌파합니까?
mbomb007

@ mbomb007 : 네, 그 지역은 반복적으로 회전하기 때문에 뒤틀린 복도를 따라갈 수 있습니다. 매우 두꺼운 벽을 줄이기 전에 루프가 너무 일찍 멈 추면 내가 아는 한 유일한 결함입니다
Ton Hospel

@ mbomb007 : Aaaaand 두꺼운 벽 결함이 해결되었습니다
Ton Hospel

이스케이프 된 문자를 바꾸지 않고 그대로 솔루션을 복사하여 붙여 넣으면 출력은 모두 #스트립 된 입력입니다 . 내 bash 세션을 확인하십시오 : codepad.org/YbCzB4O4
ardnew

@ardnew : 죄송합니다. 마지막 업데이트는 전체 솔루션을 다시 붙여 넣지 않았으므로 while을까지로 바꾸어야했습니다. 해결되었습니다. 다시 시도해주세요
Ton Hospel

4

자바 스크립트, 485464427 417 396390 바이트

s='indexOf';k='lastIndexOf';h="#";t=b=>b[0].map((x,i)=>b.map(x=>x[i]));i=>{m=i.split`
`;for(h of m){m[m[s](h)]=h.split``;}for(y=0;y<m.length;y++){for(z=x=0;x<m[y].length;x++){if(m[y][x]==h)break;if(m[y][s](h)<x&&m[y][k](h)>x)z++;q=t(m);if(q[y][s]h)<x&&m[y][k](h)>x)z++;if(z>2)m[y][x]=h}}for(p of m){v=p.join``.match(/\S/);e=v?p.join``:'';m[m[s](p)]=e;}m=m.join`
`;return m.replace(#/g," ")}

예. 나는 노력했다. 그리고 나는 485 바이트이지만, 아무도이 질문에 대답하는 것을 느끼지 못했기 때문에 우승하고 있습니다. 그래서!
또한, 나는이 짐을 골프로 칠 수 있다는 것을 잘 알고 있습니다. 지금은 피곤합니다 ... 지금은 396 입니다. 골프의 대부분에 대해 Conor에게 감사드립니다 ... : D


1
for 루프 내부의 변수는 다음과 같이 외부 선언합니다.y=z=0
Bálint
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.