Alinhar o texto a um bloco


10

Tarefa

Sua tarefa é escrever um programa inteiro, que alinhará a entrada fornecida a um bloco de tamanho especificado.

Entrada:

40
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Resultado:

Lorem  ipsum dolor sit amet, consectetur
adipiscing  elit,  sed do eiusmod tempor
incididunt  ut  labore  et  dolore magna
aliqua.  Ut  enim  ad minim veniam, quis
nostrud   exercitation  ullamco  laboris
nisi ut aliquip ex ea commodo consequat.
Duis  aute  irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu
fugiat  nulla  pariatur.  Excepteur sint
occaecat cupidatat non proident, sunt in
culpa  qui  officia deserunt mollit anim
id est laborum.
                <-- note the linebreak

Detalhes da entrada

  • Você precisa escrever um programa executável / interpretável inteiro.
  • Você pode supor que a entrada contenha apenas caracteres ASCII imprimíveis e não contenha tabulação \t.
  • A entrada pode conter quebras de linha. Se ele faz isso, eles são dadas como \n, \rou \r\ndependendo do que você espera. No entanto, eles estão unidos em toda a entrada.
  • A entrada pode ser fornecida em STDIN ou como argumentos de linha de comando. Você pode usar os dois se atender às suas necessidades (por exemplo, leia o tamanho do bloco no comando args e insira como stdin). No entanto, você não pode codificar qualquer parte da entrada do seu programa.
  • Você pode supor que o tamanho do bloco seja dado como > 0número positivo ( ) válido .
  • A quebra de linha na entrada é tratada da mesma maneira que um espaço (sendo assim um separador de palavras)
  • Se a entrada contiver vários espaços simultâneos, eles serão tratados como um.

Detalhes da saída

  • A saída deve ser formatada em um bloco de determinado tamanho. A formatação é feita adicionando espaços entre as palavras.
  • O número de espaços entre as palavras em uma linha deve ser igual para essa linha. Se não for possível, espaços adicionais devem ser adicionados um a um após as palavras que começam da esquerda.
  • Se a palavra for maior que o tamanho do bloco, ela permanecerá sozinha em uma única linha (e excederá o tamanho do bloco).
  • Se a saída contiver apenas uma palavra, ela será alinhada à esquerda.
  • A última linha da saída deve ser alinhada à esquerda, com apenas um espaço entre as palavras. A última linha da saída deve terminar com a quebra de linha à direita.

A resposta, com o menor número de bytes após algum tempo, vence.
Se você precisar de informações adicionais, deixe um comentário.

Casos de teste

Input:
10
Lorem ipsum dolor sit amet,
consectetur adipiscing elit, sed do eiusmod tempor

Output:
Lorem
ipsum
dolor  sit
amet,
consectetur
adipiscing
elit,  sed
do eiusmod
tempor

Input:
20
Lorem     ipsum

dolor  sit amet,

Output:
Lorem   ipsum  dolor
sit amet,

Input:
1
Lorem ipsum dolor sit amet

Output:
Lorem
ipsum
dolor
sit
amet

Relacionado. (Finalmente, um segundo desafio para minha tag de tipografia que já foi excluída automaticamente.;))
Martin Ender

@ MartinBüttner Eu não sabia que essa tag existe.
Zereges

@ Vɪʜᴀɴ É necessário escrever um programa executável / interpretável inteiro.
Dennis19 /


Interessante @ppperry, por algum motivo, ele evitou minhas habilidades de busca
Zereges

Respostas:



1

Ruby, 179 caracteres

n=gets.to_i
s=t=''
$<.read.split.map{|w|if(t+w).size>=n
0while t.size<n&&(1..n).any?{|i|t.sub!(/[^ ]#{' '*i}(?=[^ ])/){|x|x+' '}}
s+=t+?\n
t=w
else
t+=' '+w
t.strip!
end}
puts s,t

Muito tempo ...

Versão semi-sem golfe:

n = gets.to_i
s = t = ''
$<.read.split.map{|w|
    if (t + w).size >= n
        0 while t.size < n && (1..n).any?{|i|t.sub!(/[^ ]#{' '*i}(?=[^ ])/){|x|x+' '}}
        s += t + ?\n
        t = w
    else
        t += ' ' + w
        t.strip!  # this is only necessary because of the very first word >:(
    end
}
puts s,t

0

CJam, 87 bytes

l~:LS*qNSerS%{(2$1$a+_S*,L>{;a\}{\;@;\}?}h;S*a]1>{I1>{LIs,-I,(md1b\aI,(*.+Sf*I.\}I?N}fI

Isso ainda deve ser jogável. Experimente on-line no intérprete CJam .


0

Retina , 133 bytes

\s+

+`((1)*1 )((?<-2>.)*\S|\S+) 
:$3<LF>$1
m+`^(?=.(.)+$[^<TB>]*^(?>(?<-1>1)+)1)((.*):(\S+ +)|(\S+ +)(.*):)
$3$4$5 :$6
+`:|<LF>1+| (?= .*$)
<empty>

O <empty>representa uma linha de fuga vazia. Para executar o código, coloque cada linha em um arquivo separado, substitua <LF>por caracteres de avanço de linha (0x0A) e <TB>por uma guia (0x09). Vou adicionar uma explicação quando terminar o golfe.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.