Texto de layout nas colunas

8

Escreva um programa ou função que, com algum texto, várias colunas e a largura da coluna, formate o texto em colunas. Isso é texto simples .

Regras

Entrada

  • O texto será uma sequência de caracteres ASCII imprimível e poderá conter novas linhas e espaços (mas não tabulações).
  • O número de colunas será um número inteiro positivo.
  • A largura da coluna é um número inteiro maior ou igual a 2 que especifica quantos caracteres por coluna.

Para esse desafio, uma palavra consistirá em caracteres que não sejam espaços em branco. A entrada consiste em uma sequência e dois números inteiros, que podem ser obtidos em qualquer ordem.

Resultado

Saída é o texto formatado em colunas balanceadas com quantas palavras em cada linha couberem.

  • Se uma palavra for muito longa para caber em uma coluna, coloque-a na próxima linha se houver outra palavra na linha atual e a linha possa ser preenchida com a largura da coluna com três espaços ou menos.
  • Caso contrário, hifenize a palavra para que ela preencha o restante da linha. Hifenize onde quer que a linha termine; não se preocupe em hifenizar entre sílabas.
  • As colunas devem ser separadas por uma margem de quatro caracteres de espaço.
  • As colunas devem ser balanceadas para que todas tenham um número igual de linhas, se possível.
  • As colunas mais à esquerda devem ter uma linha extra, se necessário.
  • Quaisquer quebras de linha e vários espaços devem ser preservados. Os espaços à direita são opcionais após a última coluna.

Exemplos

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.

Colunas: 3, largura: 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.  

Colunas: 1, largura: 20

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

Texto: Tiny columns.colunas: 4, largura: 2

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

Texto: Two spaces.<space>colunas: 5, largura: 2

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

Texto: <newline>A phrasecolunas: 2, largura: 5

         rase
A ph-

Texto: A short sentence.colunas: 10, largura: 5

A sh-    ort      sent-    ence.

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

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

Isso é ; aplicam-se regras padrão.

intrepidcoder
fonte
4
@Mego Os desafios estão relacionados, no entanto, este requer hifenizar certas palavras e equilibrar colunas, por isso acho que é diferente o suficiente.
Intrepidcoder
Is s:'tiny', c:4, w:2= t- i- n- you t- i- ny??
TFeld
@TFeld Meus exemplos estavam errados, deveria estar t- i- ny. Está tudo certo agora ou preciso corrigi-lo novamente?
Intrepidcoder
Não tenho certeza, deve tiny sser t- i- n- y_ sout- i- ny s
TFeld

Respostas:

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
fonte
Obrigado, corrigido alterando para rstrip().
TFeld
Ótimo! isso me salva strip()no final.
TFeld
0

C ++ 414

Graças a @ceilingcat por algumas peças muito boas de golfe - agora ainda mais curtas

#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];}

Experimente online!

Jerry Jeremiah
fonte