수건을 접어 라!


19

나는 기술이 아직 할 수없는 한 가지는 접는 수건 1 이라고 들었다 . 그러므로 이제 그 진술을 거짓으로 증명하는 것이 당신의 일입니다!

다음과 같이 사각형 (타월)으로 구성된 문자열이 입력으로 주어지면 각 타월을 반으로 접습니다. 예를 들면 다음과 같습니다.

+------+    +------+        +--+
|      |    |      |        |  |
|      |    |      |        |  |
|      | -> +------+ ->     +--+
|      |    
|      |    
|      |    
+------+    

수건을 접을 때는 먼저 접은 다음 왼쪽에서 오른쪽으로 접습니다. 프로그램도이 동작을 모방해야합니다. 또한 테스트 사례에서 수건은 같은 위치에 있지만 접혀 있습니다.

규칙 :

  • 표준 입출력 방법.
  • 표준 허점이 적용됩니다.
  • 입력과 출력은 문자열이어야합니다.
  • 타월이 서로에 대해 올바른 위치에있는 한 출력물에 문제가없는 것입니다.
  • 수건의 각면의 길이는 항상 2로 나눌 수 있다고 가정 할 수 있습니다.
  • 입력으로 전달 된 타월은 항상 직사각형입니다.
  • 타월은 항상 분리되지만 가변 량으로 분리 될 수 있습니다.

  • , 가장 짧은 코드가 승리합니다!

테스트 사례 :

Input:
+------+
|      |
|      |
|      |
|      |
|      |
|      |
+------+
Output:
    +--+
    |  |
    |  |
    +--+




Input:
+--+ +--+ +--+
|  | |  | |  |
|  | |  | |  |
+--+ +--+ +--+

Output:
  ++   ++   ++
  ++   ++   ++


Input:
+----+
|    |
|    |
|    |
|    | ++
+----+ ++

Output:

   +-+
   | |
   +-+

        +

Input:
+--+
+--+     ++
         ||
         ||
         ++
Output:
  ++
          +
          +

1 : 이것은 Geobits와 Laikoni에 의해 반증되었습니다. 그러나 나는 어딘가에서 들었습니다.


왜 공감해야합니까? 고칠 수있는 것이 있으면 말씀해주세요.
동지 SparklePony


@Laikoni 그것은 기술이 할 수있는 것처럼 보입니다 :-)
Mr. Xcoder

@LuisMendo 편집, 수건 사이에 항상 공간이 있습니다.
동지 SparklePony

주어진 수건은 항상 가로로 줄을입니까? 다른 수건 밑에 수건이 없다는 뜻입니까?
Dead Possum

답변:


5

레티 나 245 바이트

m1+`^((.)*(?!\+ )[+|]([- ])*[+|].*¶(?<-2>.)*)([+|][- ]*[+|])
$1$.4$* 
m+`^((.)*) ( *) (.*¶(?<-2>.)*)(?(2)(?!))\|\3\|
$1|$3|$4 $3 
m+`^((.)*)\|( *)\|(?=.*¶(?<-2>.)*(?(2)(?!)) )
$1+$.3$*-+
([+|])\1
 $1
(?!\+ )([+|])([- ])\2(\2*)\3\1
$.3$*   $1$3$1

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

참고 : 일부 줄은 공백으로 끝납니다. 설명:

m1+`                    Repeatedly search from the beginning of input
    ^((.)*              Optional indentation
      (?!\+ )           Towel does not start with a plus and a space
      [+|]([- ])*[+|]   A row of towel
      .*¶               Rest of the line
      (?<-2>.)*         Some indentation on the next line
     )
     ([+|][- ]*[+|])    Another row of towel
$1$.4$*                 Replace the second row with blanks

모든 수건의 다른 줄을 모두 삭제하십시오 (모든 수건의 높이가 균일하므로 작동합니다)

m+`             Repeatedly search
   ^((.)*)      Optional indentation
    ( *)        Find some space
    (.*¶        Rest of the line
     (?<-2>.)*) Matching indentation on the next line
    (?(2)(?!))  Ensure that the indentation exactly matches
    \|\3\|      Piece of towel
$1|$3|$4 $3     Swap the piece into the space above

분리 된 타월 조각을 모두 위로 올리십시오.

m+`                 Repeatedly search
   ^((.)*)          Optional indentation
    \|( *)\|        Piece of towel
    (?=             Followed by
       .*¶          Rest of the line
       (?<-2>.)*    Matching indentation on the next line
       (?(2)(?!))   Ensure that the indentation exactly matches
        )           Nothing on the next line
$1+$.3$*-+          Change the piece into a towel bottom

수건의 바닥을 고정시켜 효과적으로 접습니다.

([+|])\1    Match a row of towel of width 2, which is just ++ or ||
 $1         Change the first column to a space, which folds it

너비 2의 수건을 오른쪽으로 접습니다.

(?!\+ )     Towel does not start with a plus and a space
([+|])      Start with a + or a |
([- ])\2    Then at least two -s or spaces
(\2*)\3     Then an even number of -s or spaces
\1          Then another + or |
$.3$*       Replace the left half with spaces
$1$3$1      Replace the first character of the right half

남은 수건을 오른쪽으로 접습니다.


정규 표현식의 작동 방식에 대한 자세한 설명에 관심이 있습니다.
Kritixi Lithos

@KritixiLithos 그런 것 같습니까, 아니면 뭔가 특별한 것이 있습니까?
Neil

네 감사합니다. 그리고 그것이 <-2>.NET 밸런싱 그룹 이라고 가정하면 정확 합니까?
Kritixi Lithos

그것은 그들을 사용 @KritixiLithos : (?<-2>.)*캡처 매번 팝업되는, 그래서 다음 번 이상 반복 할 수 없습니다 (.)*않았지만, (?(2)(?!))더 캡처가 없는지 확인 왼쪽은 동일한 횟수를 반복 그래서.
Neil

3

옥타브이미지 패키지 , 277 272 바이트를

function x=f(x)
[i,j,v]=find(bwlabel(x-32));a=@(w)accumarray(v,w,[],@max);r=-a(-i);R=a(i);s=-a(-j);S=a(j);x(:)=32;for k =1:nnz(r)
u=(r(k)+R(k)-1)/2;v=(s(k)+S(k)+1)/2;p=v:S(k);x(r(k),p)=45;x(u,p)=45;q=r(k):u;x(q,v)=124;x(q,S(k))=124;x(u,[v S(k)])=43;x(r(k),[v S(k)])=43;end

입력과 출력은 2D 문자 배열입니다.

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 : 1 , 2 , 3 , 4 . ( endfunction테스트 케이스에서는 함수를 후속 코드와 분리하기 위해서만 필요합니다. 함수가 자체 파일에 저장된 경우에는 필요하지 않습니다.)

읽을 수있는 버전 및 설명

function x = f(x)
[i,j,v] = find(bwlabel(x-32)); % make background equal to 0 by subtracting 32.
% Then label each connected component (i.e. towel) with a unique integer
% Then get row indices (i) and column indices (j) of nonzero values (v)
a = @(w)accumarray(v,w,[],@max); % helper function. Gives the maximum of w for
% each group given by an integer label in v
r = -a(-i); % upper coordinate of each towel (minimum row index)
R = a(i); % lower coordinate of each towel (maximum row index)
s = -a(-j); % left coordinate of each towel (minimum column index)
S = a(j); % right coordinate of each towel (maximum column index)
x(:) = 32; % remove all towels: fill x with spaces
for k = 1:nnz(r) % for each original towel: create the new, folded towel 
    u = (r(k)+R(k)-1)/2; % new lower coordinate
    v = s(k)+S(k)+1)/2; % new left coordinate
    p = v:S(k); % column indices of horizontal edges
    x(r(k),p) = 45; % fill upper horizontal edge with '-'
    x(u,p) = 45; % fill lower horizontal edge with '-'
    q = r(k):u; % row indices of vertical edges
    x(q,v) = 124; % fill left vertical edge with '|'
    x(q,S(k)) = 124; % fill right vertical edge with '|'
    x(u,[v S(k)]) = 43; % fill lower corners with '+'
    x(r(k),[v S(k)]) = 43; % fill upper corners with '+'
end
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.