Транспонировать облако слов

18

Фон

Я хотел сделать красивое облако слов, например так:

these    are
    words   

  floating  

Я вычислил (x,y)-координаты первой буквы каждого слова, подключил их к своему генератору облака слов и позволил ему выполнить свою работу. Однако я случайно использовал (y,x)-координаты, поэтому результат выглядит так:

these      

   floating

 words     



are        

Поскольку мне лень пересчитывать координаты, мне нужно, чтобы вы перенесли слово «облако» для меня.

вход

Ваш ввод - это прямоугольная сетка строчных букв и символов ASCII. Это означает, что каждая строка дополняется пробелами одинаковой длины. Входные данные могут быть приняты как многострочная строка или массив строк.

Слово представляет собой горизонтальный отрезок букв, и его позиция является (x,y)-координатами его крайнего левого письма, в верхнем левом углу сетки бытия (0,0). Всегда будет хотя бы одно слово, и в нем нет конечных строк или столбцов пробелов. Однако могут присутствовать ведущие строки или столбцы пробелов.

Выход

Ваш вывод представляет собой еще одну прямоугольную сетку символов, полученную путем перемещения каждого слова с позицией (x,y)в позицию (y,x). Ваши выходные данные не должны содержать дополнительные конечные строки или столбцы пробелов. Ведущие строки и столбцы должны быть сохранены, а выходные данные должны быть прямоугольными .

Вы можете предположить, что это преобразование не создает перекрывающихся слов и не объединяет несколько слов в одно. Это означает, что запуск программы на выходе должен производить исходный ввод.

Правила и оценки

Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены.

Контрольные примеры

Для ясности (и так как Stack Exchange не любит строки, содержащие только пробелы), каждая строка заканчивается символом канала |. Они не являются частью реального ввода или вывода , и вы должны удалить их. Еще раз обратите внимание, что запуск программы на каждом выходе также должен давать соответствующий ввод.

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
источник

Ответы:

7

Perl, 58 байт

Добавлено +2 для -lp

Дай ввод на STDIN, запусти как perl -lp wordcloud.pl

wordcloud.pl:

s/\w+/$l|=$a[pos]|=$"x~-$..$&/eg}for(@a){$_|=$l=~y// /cr
Тон Хоспел
источник