Transposer un nuage de mots

18

Contexte

Je voulais faire un joli nuage de mots, comme ceci:

these    are
    words   

  floating  

J'ai calculé les (x,y)coordonnées de la première lettre de chaque mot, je les ai branchées sur mon générateur de nuage de mots et je l'ai laissé faire son travail. Cependant, j'ai accidentellement utilisé des (y,x)coordonnées, donc le résultat ressemble à ceci:

these      

   floating

 words     



are        

Comme je suis trop paresseux pour recalculer les coordonnées, j'ai besoin que vous transposiez le mot nuage pour moi.

Contribution

Votre saisie est une grille rectangulaire de lettres et d'espaces ASCII minuscules. Cela signifie que chaque ligne est remplie d'espaces pour avoir la même longueur. L'entrée peut être considérée comme une chaîne multi-lignes ou un tableau de chaînes.

Un mot est un segment horizontal de lettres, et sa position est les (x,y)coordonnées de sa lettre la plus à gauche, le coin supérieur gauche de la grille étant (0,0). Il y aura toujours au moins un mot et il n'y aura pas de lignes ou de colonnes d'espaces de fin. Cependant, des lignes ou des colonnes d'espaces en tête peuvent être présentes.

Production

Votre sortie est une autre grille rectangulaire de caractères, obtenue en déplaçant chaque mot avec position (x,y)en position (y,x). Votre production ne doit pas contenir de lignes ou colonnes d'espaces de fin supplémentaires. Les lignes et colonnes de tête doivent être conservées et la sortie doit être rectangulaire .

Vous pouvez supposer que cette transformation ne crée pas de mots qui se chevauchent et ne fusionne pas plusieurs mots en un seul. Cela signifie que l'exécution du programme sur la sortie devrait produire l'entrée d'origine.

Règles et notation

Vous pouvez écrire un programme complet ou une fonction. Le nombre d'octets le plus bas l'emporte et les failles standard sont interdites.

Cas de test

Pour plus de clarté (et puisque Stack Exchange n'aime pas les lignes d'espace uniquement), chaque ligne se termine par un caractère de canal |. Ceux-ci ne font pas partie de l'entrée ou de la sortie réelle et vous devez les supprimer. Notez à nouveau que l'exécution du programme sur chaque sortie devrait également produire l'entrée correspondante.

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
la source

Réponses:

7

Perl, 58 octets

+2 ajouté pour -lp

Donnez une entrée sur STDIN, exécutez en tant que perl -lp wordcloud.pl

wordcloud.pl:

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