Transpor uma nuvem de palavras

18

fundo

Eu queria criar uma nuvem de palavras bonita, assim:

these    are
    words   

  floating  

(x,y)Calculei as coordenadas da primeira letra de cada palavra, conectei-as ao meu gerador de nuvem de palavras e deixei que ele fizesse seu trabalho. No entanto, acidentalmente usei (y,x)-coordinates, portanto, o resultado fica assim:

these      

   floating

 words     



are        

Como tenho preguiça de recalcular as coordenadas, preciso que você transponha a nuvem de palavras para mim.

Entrada

Sua entrada é uma grade retangular de letras e espaços ASCII minúsculos. Isso significa que cada linha é preenchida com espaços para ter o mesmo comprimento. A entrada pode ser tomada como uma sequência de linhas múltiplas ou uma matriz de sequências.

Uma palavra é um segmento horizontal de letras e sua posição é a (x,y)coordenada da letra mais à esquerda, sendo o canto superior esquerdo da grade (0,0). Sempre haverá pelo menos uma palavra e não há linhas ou colunas finais de espaços. No entanto, linhas ou colunas à esquerda de espaços podem estar presentes.

Resultado

Sua saída é outra grade retangular de caracteres, obtida movendo cada palavra com posição (x,y)para posição (y,x). Sua saída não deve conter linhas ou colunas finais extras de espaços. As linhas e colunas iniciais devem ser preservadas e a saída deve ser retangular .

Você pode assumir que essa transformação não cria palavras sobrepostas e não mescla várias palavras em uma. Isso significa que a execução do programa na saída deve produzir a entrada original.

Regras e pontuação

Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas.

Casos de teste

Para maior clareza (e como o Stack Exchange não gosta de linhas somente de espaço), cada linha termina em um caractere de barra vertical |. Isso não faz parte da entrada ou saída real e você deve removê-los. Observe novamente que a execução do programa em cada saída também deve produzir a entrada correspondente.

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
fonte

Respostas:

7

Perl, 58 bytes

Adicionado +2 para -lp

Dê entrada no STDIN, execute como perl -lp wordcloud.pl

wordcloud.pl:

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