상자를 토글하십시오!


9

박스에 넣을 수있는 문자열이 있으면 박스를 토글하십시오. 이것은 테스트 사례와 설명에서 더 명확 해집니다.

입출력

입력 형식

입력은 CR, LF 또는 CRLF로 구분 된 단일 문자열이거나 문자열 목록입니다. 입력 형식은 사용자가 결정해야합니다.

출력 형식

출력 형식은 입력 형식과 같아야합니다.

설명 + 예

박스형 문자열을 예로 들어 보겠습니다.

+-------------+
|Hello, World!|
+-------------+

상자를 토글하기 위해 첫 번째와 마지막 행과 첫 번째와 마지막 열을 제거합니다. 마지막 줄 뒤에 후행 공백이없고 (마지막 줄 끝에 선택적인 후행 줄 바꿈이 없음) 어떤 줄에도 후행 공백이 없다고 가정 할 수 있습니다 (물론 줄 바꿈은 제외).

이것은 다음과 같습니다.

Hello, World!

다른 방법

문자열이 상자에 없으면 상자를 추가하십시오. 이것은 매우 간단합니다. 가장 긴 줄의 길이 인 대시 +---...---+를 사용하여 자체 줄 앞에 추가 한 다음 각 줄에 대해 가장 긴 줄의 길이와 일치하도록 후행 공백으로 채운 다음 파이프 문자 ( ) 를 앞에 추가하고 추가하십시오 . 마지막으로 첫 번째 줄 과 동일한 설정을 포함하는 줄을 추가하십시오 .kk"|"+---...---+

예를 들면 다음과 같습니다.

Hello, World!

된다 :

+-------------+
|Hello, World!|
+-------------+

입력의 어떤 라인도 후행 공백이 없을 것이라고 가정 할 수 있습니다.

상자 주위에 상자가 있어야하는 또 다른 문자열 예 :

Hello,
    World!

된다

+----------+
|Hello,    |
|    World!|
+----------+

여전히 박스에 넣어야 할 것의 예 :

+--------+
|        |
 --------+

된다 :

+----------+
|+--------+|
||        ||
| --------+|
+----------+

규칙 + 사양

  • 표준 허점 적용
  • 박스 입력 여부에 관계없이 입력 라인에는 전체 및 각 라인에 선행 또는 후행 공백이 없습니다.
  • 상자는 +모서리와 |세로 가장자리 및 -가로 에만 사용할 수 있습니다 .
  • 상자는 상자로 간주 될 수있는 플러스가 있어야합니다. 높이 또는 너비가 2 인 경우 (즉, 내용이없는 경우) 여전히 상자를 해제해야 상자의 높이에 따라 줄 바꿈이 발생합니다.
  • 입력에 상자가 있지만 상자 외부에 텍스트가 있으면 모든 것이 상자에 있어야합니다.
  • 프로그램은 문자열의 전체 둘레를 확인해야합니다. 외부를 따라 하나의 문자가 정확하지 않은 경우 (없거나 다른 문자가 있어야 함) 상자가 아닌 상자에 넣어야합니다.
  • 상자에 넣지 않은 문자열 자체에는가 포함될 수 있습니다 + | -. 박스가없는 문자열 자체 주위에 상자가 있으면 상자와 함께 문자열을 반환하십시오. 상자를 한 번만 개봉해야합니다.

가장자리 케이스

1 : 작은 상자

입력:

++
++

출력이 비어 있거나 줄 바꿈

입력:

+----+
+----+

출력이 비어 있거나 줄 바꿈

입력:

++
||
||
++

출력은 개행 2 개 또는 개행 3 개입니다.

2 : 부분 상자

입력:

+-------+
| Hello |
+ ------+

산출:

+---------+
|+-------+|
|| Hello ||
|+ ------+|
+---------+

3 : 상자 외부의 텍스트

입력:

 +-------+
a| Hello |
 +-------+

산출:

+----------+
| +-------+|
|a| Hello ||
| +-------+|
+----------+

1
"입력 라인은 박스 입력 여부와 상관없이 전체 및 각 라인에 선행 또는 후행 공백이 없습니다." 여러 테스트 사례에 공백이 있습니다. 직사각형 입력이 너무 많을까요?
Neil

@Neil 그는 아마도 일관된 선행 공백을 의미하지 않았을 것입니다 . 즉, 3 개의 공백으로 시작하는 각 행은 해당되지 않지만 1, 2, 0, 3 개의 공백으로 시작하는 행은 일치하지 않기 때문입니다.
Outgolfer Erik

상자 나하지?
user41805

@Cowsquack 사양에서 그것은 그렇지 않은 것 같습니다.
Outgolfer Erik

@Neil 죄송합니다. 처음에 공백이 있으면 상자가 아닌 것으로 표시됩니다.
HyperNeutrino

답변:


6

자바 스크립트 (ES2017), 199 바이트

s=>/^\+-*\+\n(\|.*\|\n)*\+-*\+$/.test(s,s=s.split`
`,s.map(z=>z[y]?y=z.length:0,y=0))?s.slice(1,-1).join`
`.replace(/.(.*)./g,"$1"):(x=`+${'-'.repeat(y)}+`)+`
|${s.map(z=>z.padEnd(y)).join`|
|`}|
`+x

순진한 솔루션. 최고 일 수도 있고 아닐 수도 있습니다.


"최고 일 수도 있고 아닐 수도 있지만 ..."JS와 같은 비 골프 언어를 사용하여 <200 바이트로이 문제를 해결하는 것이 좋습니다. ;)
Outgolfer Erik

하하, "지금은 2 달러 미만!" 비용 1.99 : P
ETHproductions

그것은 산업 강도 사건 이라고 불립니다 .
Outgolfer 에릭

이것은 테스트 사례에서 작동하지만 다음과 같이 작동한다고 생각하지 않습니다 '+--+\n|hi|\n|world|\n+----------+'. 직사각형이 아니더라도 선을 제거합니다.
Rick Hitchcock

3

SOGL V0.12 , 72 바이트

2-┌* +1Ο;2-⁴┌@ŗΖ+|ŗ∙⁴++B
▓Aa1w⁄;lGB╬8a⁰I{_=}¹χ?ajk{jk}⁰←a1w⁄;l2+G2+B00╬5

여기 사용해보십시오!

입력이 게으르고 유형이 지정된 입력을 구현 하지 않기 때문에 입력이 제곱 +1 바이트 ( ) 임을 보장 ⁰I{_=}¹χ하지 않기 때문에 elementwise equals는
+1 바이트 ( )를 +7 바이트 ( )로 구현 하지 않습니다 (따라서 스택의 입력이 예상됩니다. 사용 편의성, 온라인 링크 포함 → 입력 상자 사용 가능)
A


⁰I{_=}¹χ+7이 아닌 +8 바이트입니다.
Outgolfer Erik

@EriktheOutgolfer 잘 대체되어야 =하지만, 그 작업을하지 않는 한,에 의해 -1 + 8 = +7 길이 변경
dzaima


2

망막 , 197,195 바이트

+m`^((.)*)(¶(?<-2>.)*(?(2)$|(.)))
$1$#4$* $3$#2$* 
%`^|$
|
^.(.*).
+$.1$*-+¶$&
.(.*).$
$&¶+$.1$*-+
^(\+-*\+)¶(\|\+-*\+\|)¶(\|\|.*\|\|¶)*\2¶\1$
¶$&¶
..(.*)..(?=(.|¶)*¶$)
$1
^¶-*¶-*¶|(\G|¶)-*¶-*¶$

온라인으로 사용해보십시오! 설명:

+m`^((.)*)(¶(?<-2>.)*(?(2)$|(.)))
$1$#4$* $3$#2$* 

이 단계는 그 자체로 상당히 복잡하므로 조금 세분화하겠습니다. +더 이상 교체를 찾을 수 없을 때까지 단계가 반복됨을 의미합니다. m`^스테이지가 모든 라인의 시작에서 일치 함을 의미합니다. ((.)*)그런 다음 전체 줄과 일치합니다. 이제는 $1단순히 $2일치하는 줄이지 ​​만 문자 즉 일치하는 항목의 목록입니다. 그런 다음 줄의 끝과 일치하여 다음 줄의 시작과 일치합니다. (?<-2>.)*.NET 밸런싱 그룹을 사용합니다. <-2>삭제합니다 일치 $2긴 문자로는 두 번째 행에 일치 될 수있다. 이 시점에서 다음 세 가지 중 하나가 발생할 수 있습니다.

  • 두 번째 줄에 문자가 충분하지 않았습니다. $2여전히 일부 일치 항목이 남아 있습니다.
  • 두 줄은 정확히 같은 길이였습니다. $2일치하는 항목이 없습니다. 그리고 우리는 라인의 끝에 있습니다.
  • 두 번째 줄은 더 길기 때문에 하나 이상의 문자가 남아 있습니다.

(?(2)$|(.)))조건을 사용하여이를 구별하는 데 도움이됩니다. $2여전히 일부 일치 항목이 남아 있으면 두 번째 줄이 너무 짧아서 줄의 끝과 일치하기 때문에 이것이 필요합니다. 그러나 $2일치 하는 항목 이 없으면 두 번째 줄을 길게하여 일치시킵니다. 캐릭터 ( $4성냥이 일어 났음을 알 수 있도록) 그렇지 않으면 두 줄의 길이가 같고이 시점에서 일치가 실패합니다 (물론 나중에 줄에서 다시 일치 할 수 있음).

대체 문자열은 $1$#4$* $3$#2$*입니다. $#4로 평가 1우리가, 두 번째 줄에 추가 문자를 일치하는 경우 0하지 않을 경우. 즉 $#4$*, 두 번째 줄이 더 길면 첫 번째 줄에 공백 이 추가됩니다. 마찬가지로 $#2$*첫 번째 행 이상이라면 두 번째 줄에 공간을 추가한다. (실제로, 정확한 수의 공간을 추가하게됩니다. 두 라인 만 균형을 맞추는 경우 +, 네 번째 캡처 그룹에 추가하여 더 긴 두 번째 라인의 경우이를 직접 달성 할 수 있습니다.)

이 모든 결과는이 단계가 입력을 사각형으로 채운다는 것입니다. 이제 주위에 상자를 그릴 수 있습니다.

%`^|$
|

장소 |양쪽이야.

^.(.*).
+$.1$*-+¶$&

장소 +-...-+상단에.

.(.*).$
$&¶+$.1$*-+

그리고 다시 바닥에.

^(\+-*\+)¶(\|\+-*\+\|)¶(\|\|.*\|\|¶)*\2¶\1$
¶$&¶

이중 상자를 만들 었는지 확인하십시오. 그렇다면 남은 스테이지가 일치하도록 상단과 하단에 여분의 빈 줄이 추가되어 두 상자가 모두 삭제됩니다.

..(.*)..(?=(.|¶)*¶$)
$1

빈 줄이 있으면 모든 줄의 시작과 끝에서 두 문자를 제거하십시오.

^¶-*¶-*¶|(\G|¶)-*¶-*¶$

선행 빈 줄이 있으면 그 줄과 다음 두 줄을 삭제합니다 ( -상자 상단에 남음). 빈 줄이 있으면 그 줄과 이전 두 줄을 삭제하십시오. (\G|¶)여섯 명 밖에 선 (따라서 5있을 경우와 거래 상자에 내용이 없음을 때문에들).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.