Transponer una nube de palabras

18

Antecedentes

Quería hacer una bonita nube de palabras, como esta:

these    are
    words   

  floating  

(x,y)Calculé las coordenadas de la primera letra de cada palabra, las conecté al generador de nube de palabras y dejé que hiciera su trabajo. Sin embargo, accidentalmente usé (y,x)-coordinates, por lo que el resultado se ve así:

these      

   floating

 words     



are        

Como soy demasiado vago para volver a calcular las coordenadas, necesito que transpongas la nube de palabras por mí.

Entrada

Su entrada es una cuadrícula rectangular de letras minúsculas ASCII y espacios. Esto significa que cada fila se rellena con espacios para tener la misma longitud. La entrada se puede tomar como una cadena de varias líneas o una matriz de cadenas.

Una palabra es un segmento horizontal de letras, y su posición son las (x,y)coordenadas de su letra más a la izquierda, siendo la esquina superior izquierda de la cuadrícula (0,0). Siempre habrá al menos una palabra y no habrá filas ni columnas de espacios al final. Sin embargo, las primeras filas o columnas de espacios pueden estar presentes.

Salida

Su salida es otra cuadrícula rectangular de caracteres, obtenida moviendo cada palabra con posición (x,y)a posición (y,x). Su salida no debe contener filas o columnas de espacios adicionales. Las filas y columnas iniciales deben conservarse y la salida debe ser rectangular .

Puede suponer que esta transformación no crea palabras superpuestas y no combina varias palabras en una sola. Esto significa que ejecutar el programa en la salida debería producir la entrada original.

Reglas y puntaje

Puede escribir un programa completo o una función. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.

Casos de prueba

Para mayor claridad (y dado que a Stack Exchange no le gustan las líneas de solo espacio), cada fila termina en un carácter de barra |. Estos no son parte de la entrada o salida real , y debe eliminarlos. Tenga en cuenta nuevamente que ejecutar el programa en cada salida también debería producir la entrada correspondiente.

Input:
oneword|
Output:
oneword|

Input:
  spaces|
Output:
      |
      |
spaces|

Input:
   |
row|
Output:
 row|

Input:
these    are|
    words   |
            |
  floating  |
Output:
these      |
           |
   floating|
           |
 words     |
           |
           |
           |
are        |

Input:
   same|
 the   |
       |
same   |
Output:
   same|
 the   |
       |
same   |

Input:
  some |
words k|
       |
       |
       |
  still|
Output:
 words    |
          |
some still|
          |
          |
          |
 k        |

Input:
   hello   |
  world hey|
what   up  |
Output:
  what|
      |
 world|
hello |
      |
      |
      |
  up  |
 hey  |

Input:
  a b  a d cc|
 g h  huh nng|
  ye dunnn   |
    dud  yo  |
 wha   g     |
  huh heh hah|
Output:
        |
 g  wha |
a ye huh|
 h      |
b  dud  |
  dunnn |
 huh heh|
a   g   |
        |
d  yo   |
 nng hah|
cc      |
Zgarb
fuente

Respuestas:

7

Perl, 58 bytes

Se agregó +2 por -lp

Dar entrada en STDIN, ejecutar como perl -lp wordcloud.pl

wordcloud.pl:

s/\w+/$l|=$a[pos]|=$"x~-$..$&/eg}for(@a){$_|=$l=~y// /cr
Ton Hospel
fuente