Texto de diseño en columnas

8

Escriba un programa o función que, dado un texto, varias columnas y el ancho de la columna, formatee el texto en columnas. Esta es la texto sin formato .

Reglas

Entrada

  • El texto será una cadena de ASCII imprimible y puede contener nuevas líneas y espacios (pero no pestañas).
  • El número de columnas será un entero positivo.
  • El ancho de la columna es un número entero mayor o igual a 2 que especifica cuántos caracteres por columna.

Para este desafío, una palabra consistirá en cualquier carácter que no sea un espacio en blanco. La entrada consta de una cadena y dos enteros, que pueden tomarse en cualquier orden.

Salida

La salida es el texto formateado en columnas equilibradas con tantas palabras en cada línea como quepan.

  • Si una palabra es demasiado larga para caber en una columna, colóquela en la línea siguiente si hay otra palabra en la línea actual y la línea podría rellenarse al ancho de la columna con tres espacios o menos.
  • De lo contrario, separe la palabra con guiones para que ocupe el resto de la línea. Separar dondequiera que termine la línea; no te preocupes por separar las sílabas entre sílabas.
  • Las columnas deben estar separadas por un margen de cuatro caracteres de espacio.
  • Las columnas deben estar equilibradas para que todas tengan el mismo número de líneas si es posible.
  • Las columnas más a la izquierda deben tener una línea adicional si es necesario.
  • Cualquier salto de línea y espacios múltiples deben ser preservados. Los espacios finales son opcionales después de la última columna.

Ejemplos

Texto:

The number of columns will be a positive integer.  Columns should be separated by a margin of four space characters.

The columns should be balanced.  The column width is greater than two.

Columnas: 3, ancho: 10

The number    separated     ns should 
of columns    by a marg-    be balanc-
will be a     in of four    ed.  The  
positive      space cha-    column wi-
integer.      racters.      dth is gr-
Columns                     eater than
should be     The colum-    two.      

Texto:

This line is hyphenated.
This line, on the other hand, is not.  

Columnas: 1, ancho: 20

This line is hyphen-
ated.               
This line, on the
other hand, is not.

Texto: Tiny columns.columnas: 4, ancho: 2

T-    c-    u-    s.
i-    o-    m-      
ny    l-    n-

Texto: Two spaces.<space>columnas: 5, ancho: 2

T-          p-    c-    s.
wo    s-    a-    e-

Texto: <newline>A phrasecolumnas: 2, ancho: 5

         rase
A ph-

Texto: A short sentence.columnas: 10, ancho: 5

A sh-    ort      sent-    ence.

Texto: It's "no word" 1234567890 -+-+-+-+ (*&!)columnas: 3, ancho: 6

It's      12345-    +-+
"no       67890     (*&!)
word"     -+-+--

Este es el ; Se aplican reglas estándar.

codificador intrépido
fuente
44
@Mego Los desafíos están relacionados, sin embargo, este requiere separar ciertas palabras y equilibrar columnas, así que creo que es lo suficientemente diferente.
intrepidcoder
Es s:'tiny', c:4, w:2= t- i- n- yo t- i- ny??
TFeld
@TFeld Mis ejemplos estaban equivocados, debería estarlo t- i- ny. ¿Está todo ahora o necesito arreglarlo de nuevo?
intrepidcoder
No estoy seguro, debería tiny sser t- i- n- y_ sot- i- ny s
TFeld

Respuestas:

1

Python 2, 346 338 bytes

i,C,W=input()
r=[]
for l in [x or' 'for x in i.split('\n')]:
 while l:
  if' '==l[0]:l=l[1:]
  w=l[:W];x=W;s=w.rfind(' ')+1
  if max(W-3,0)<s:w=w[:s];x-=W-s
  elif x<len(l)and' 'not in l[x:x+1]:w=w[:-1]+'-';x-=1
  r+=[w];l=l[x:]
r=[s.ljust(W)for s in r+['']*(C-1)]
print'\n'.join('    '.join(s)for s in zip(*zip(*[iter(r)]*((len(r))/C))))

Entrada como 'string',C,W

TFeld
fuente
Gracias, arreglado cambiando a rstrip().
TFeld
¡Excelente! eso me salva strip()al final.
TFeld
0

C ++ 414

Gracias a @ceilingcat por algunas bonitas piezas de golf, ahora incluso más cortas

#import<bits/stdc++.h>
#define b t.push_back
#define r l.substr
using namespace std;main(int n,char**a){int i=0,j,m,p,c=atoi(a[1]),w=atoi(a[2]);vector<string>t;for(string l;getline(cin,l);)for(;p=l.find_last_of(" \n",w),p-string::npos&&p>w-4?b(r(0,p)),l=r(p+1):w/l.length()?b(l),l="":(b(r(0,w-1)+"-"),l=r(w-1)),l.length(););for(m=~-t.size()/c+1;i<m;i+=puts(""))for(j=0;j<c;b(""))cout<<left<<setw(w+4)<<t[i+j++*m];}

Pruébalo en línea!

Jerry Jeremiah
fuente