Doblar algunas toallas!

19

Escuché en alguna parte que una cosa que la tecnología aún no puede hacer es doblar las toallas 1 . ¡Así que ahora es tu trabajo demostrar que esa afirmación es falsa!

Dado un hilo como entrada, compuesto de rectángulos (toallas), como el siguiente, dobla cada toalla por la mitad dos veces. Por ejemplo:

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

Tenga en cuenta que cuando se dobla una toalla, primero se pliega, luego de izquierda a derecha. Su programa también debe imitar este comportamiento. Observe también que en los casos de prueba, las toallas permanecen en el mismo lugar, pero dobladas.

Reglas:

  • Métodos estándar de entrada / salida.
  • Se aplican lagunas estándar.
  • La entrada y la salida deben ser como una cadena.
  • Los resultados finales están bien en la salida, siempre y cuando las toallas estén en el lugar correcto entre sí.
  • Puede suponer que la longitud de cada lado de la toalla siempre será divisible por 2.
  • Las toallas pasadas como entrada siempre serán rectangulares.
  • Las toallas siempre estarán separadas, sin embargo, pueden estar separadas por cantidades variables.

  • , ¡el código más corto gana!

Casos de prueba:

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




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

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


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

Output:

   +-+
   | |
   +-+

        +

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

1: Esto ha sido refutado por Geobits y Laikoni. Sin embargo, lo escuché en alguna parte.

Camarada SparklePony
fuente
¿Por qué el voto negativo? Si hay algo que se pueda arreglar, por favor dígame.
Camarada SparklePony
@Laikoni parece que la tecnología PUEDE hacer cualquier cosa :-)
Sr. Xcoder
@LuisMendo Editado, siempre habrá espacio entre las toallas.
Camarada SparklePony
¿Las toallas siempre se alinearán horizontalmente? ¿Quiero decir que no habrá ninguna toalla debajo de la otra?
Dead Possum

Respuestas:

5

Retina , 245 bytes

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

Pruébalo en línea!

Nota: algunas líneas terminan en espacios. Explicación:

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

Elimine cualquier otra línea de cada toalla (esto funciona porque todas las toallas tienen una altura uniforme),

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

cambia todas las toallas desprendidas,

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

y arregle la parte inferior de las toallas, doblándolas efectivamente.

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

Dobla las toallas de ancho 2 a la derecha.

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

Dobla las toallas restantes a la derecha.

Neil
fuente
Me interesaría una explicación más detallada sobre cómo funciona la expresión regular
Kritixi Lithos
@KritixiLithos Algo así, ¿o hubo algo específico?
Neil
Si, gracias. ¿Y estoy en lo cierto al suponer que <-2>es un grupo de equilibrio .NET?
Kritixi Lithos
@KritixiLithos Los usa: (?<-2>.)*hace estallar la captura cada vez, por lo que no puede repetir más veces que la (.)*hizo, mientras (?(2)(?!))verifica que no quedan capturas, por lo que se repite la misma cantidad de veces.
Neil
3

Octava con paquete de imágenes , 277 272 bytes

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

La entrada y la salida son matrices de caracteres 2D.

Pruébalo en línea! O verifique todos los casos de prueba: 1 , 2 , 3 , 4 . (Tenga endfunctionen cuenta que en los casos de prueba solo es necesario separar la función del código posterior. No es necesario si la función se guarda en su propio archivo).

Versión legible y explicación

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
Luis Mendo
fuente