Gấp vài cái khăn!


19

Tôi nghe nói ở đâu đó rằng một điều mà công nghệ không thể làm được là gấp khăn 1 . Vì vậy, bây giờ công việc của bạn là chứng minh tuyên bố đó là sai!

Cho một chuỗi làm đầu vào, được tạo thành từ các hình chữ nhật (khăn), như sau, gấp mỗi chiếc khăn lại một nửa hai lần. Ví dụ:

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

Lưu ý rằng khi một chiếc khăn được gấp lại, đầu tiên nó được gấp lại, sau đó từ trái sang phải. Bạn phải lập trình hành vi này. Cũng lưu ý rằng trong các trường hợp thử nghiệm, khăn vẫn ở cùng một chỗ, nhưng gấp lại.

Quy tắc:

  • Phương pháp tiêu chuẩn đầu vào / đầu ra.
  • Tiêu chuẩn áp dụng.
  • Đầu vào và đầu ra phải là một chuỗi.
  • Những người bán hàng rong đều ổn trong đầu ra, miễn là những chiếc khăn nằm đúng vị trí so với nhau.
  • Bạn có thể cho rằng chiều dài của mỗi bên của khăn sẽ luôn chia hết cho 2.
  • Các khăn được thông qua như đầu vào sẽ luôn luôn là hình chữ nhật.
  • Khăn sẽ luôn được tách ra - tuy nhiên, chúng có thể được phân tách bằng số lượng khác nhau.

  • , vì vậy mã ngắn nhất sẽ thắng!

Các trường hợp thử nghiệm:

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




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

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


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

Output:

   +-+
   | |
   +-+

        +

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

1: Điều này đã bị Geobits và Laikoni từ chối. Tuy nhiên, tôi đã nghe thấy nó ở đâu đó.


Tại sao các downvote? Nếu có một cái gì đó có thể được sửa chữa, xin vui lòng cho tôi biết.
Đồng chí SparklePony


@Laikoni có vẻ như công nghệ CÓ THỂ làm bất cứ điều gì :-)
Ông Xcoder

@LuisMendo Đã chỉnh sửa, sẽ luôn có khoảng trống giữa các khăn.
Đồng chí SparklePony

Cho khăn sẽ luôn luôn nằm ngang? Ý tôi là sẽ không có chiếc khăn nào dưới cái kia?
Xác chết

Câu trả lời:


5

Võng mạc , 245 byte

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

Hãy thử trực tuyến!

Lưu ý: một số dòng kết thúc trong không gian. Giải trình:

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

Xóa mọi dòng khác của mỗi chiếc khăn (điều này hoạt động vì tất cả các khăn đều có chiều cao bằng nhau),

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

thay đổi tất cả các mảnh khăn tách ra

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

và cố định phần dưới của khăn, gấp chúng lại một cách hiệu quả.

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

Gấp khăn có chiều rộng 2 sang phải.

(?!\+ )     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

Gấp các khăn còn lại sang phải.


Tôi sẽ quan tâm đến một lời giải thích chi tiết hơn về cách thức hoạt động của regex
Kritixi Lithos

@KritixiLithos Một cái gì đó như thế, hoặc có cái gì đó cụ thể?
Neil

Vâng, cảm ơn. Và tôi có đúng không khi cho rằng đó <-2>là một nhóm cân bằng .NET?
Kritixi Lithos

@KritixiLithos Nó sử dụng chúng: (?<-2>.)*bật chụp mỗi lần, do đó không thể lặp lại nhiều lần sau đó (.)*, trong khi (?(2)(?!))kiểm tra rằng không còn ảnh chụp nào, do đó, nó lặp lại cùng một số lần.
Neil

3

Octave với gói hình ảnh , 277 272 byte

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

Đầu vào và đầu ra là mảng char 2D.

Hãy thử trực tuyến! Hoặc xác minh tất cả các trường hợp thử nghiệm: 1 , 2 , 3 , 4 . (Lưu ý rằng endfunctiontrong các trường hợp thử nghiệm chỉ cần tách chức năng khỏi mã tiếp theo. Không cần thiết nếu chức năng được lưu trong tệp riêng của nó.)

Phiên bản dễ đọc và giải thích

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
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.