Trasponi una nuvola di parole


18

sfondo

Volevo creare una bella nuvola di parole, in questo modo:

these    are
    words   

  floating  

Ho calcolato le (x,y)coordinate della prima lettera di ogni parola, le ho inserite nel mio generatore di word cloud e ho lasciato che facesse il suo lavoro. Tuttavia, ho usato accidentalmente (y,x)coordinate, quindi il risultato è simile al seguente:

these      

   floating

 words     



are        

Dato che sono troppo pigro per ricalcolare le coordinate, ho bisogno che tu trasponga la nuvola di parole per me.

Ingresso

Il tuo input è una griglia rettangolare di lettere e spazi ASCII minuscoli. Ciò significa che ogni riga è riempita con spazi per avere la stessa lunghezza. L'input può essere preso come una stringa multilinea o una matrice di stringhe.

Una parola è un segmento orizzontale di lettere e la sua posizione è le (x,y)coordinate della sua lettera più a sinistra, essendo l'angolo in alto a sinistra della griglia (0,0). Ci sarà sempre almeno una parola e non ci sono righe o colonne finali di spazi. Tuttavia, possono essere presenti righe o colonne iniziali di spazi.

Produzione

L'output è un'altra griglia rettangolare di caratteri, ottenuta spostando ogni parola con posizione (x,y)in posizione (y,x). L'output non deve contenere righe o colonne di spazi finali finali. Le righe e le colonne iniziali devono essere preservate e l'output deve essere rettangolare .

Si può presumere che questa trasformazione non crei parole sovrapposte e non unisca più parole in una sola. Ciò significa che l'esecuzione del programma sull'output dovrebbe produrre l'input originale.

Regole e punteggio

È possibile scrivere un programma completo o una funzione. Vince il conteggio di byte più basso e non sono consentite scappatoie standard.

Casi test

Per chiarezza (e poiché Stack Exchange non ama le righe di solo spazio), ogni riga termina con un carattere pipe |. Questi non fanno parte dell'input o dell'output effettivo e dovresti rimuoverli. Notare ancora che l'esecuzione del programma su ogni uscita dovrebbe produrre anche l'input corrispondente.

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      |

Risposte:


7

Perl, 58 byte

Aggiunto +2 per -lp

Fornisci input su STDIN, esegui come perl -lp wordcloud.pl

wordcloud.pl:

s/\w+/$l|=$a[pos]|=$"x~-$..$&/eg}for(@a){$_|=$l=~y// /cr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.