Justifique um texto adicionando espaços
Dado este texto
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed the eiusmod tempor incididunt ut labore et dolore magna aliqua. Por fim, ad minimamente veniam, quis exercitar nostrud ullamco laboris nisi ut aliquip ex e comodo consequente. Dre 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.
escreva o programa mais curto que produz o mesmo texto justificado com 80 caracteres. O texto acima deve ter exatamente a seguinte aparência:
palavras não devem ser cortadas
espaços extras devem ser adicionados
depois de um ponto.
depois de uma vírgula
após a palavra mais curta (da esquerda para a direita)
o resultado não deve ter mais de 2 espaços consecutivos
a última linha não se justifica.
as linhas não devem começar com vírgula ou ponto.
forneça a saída do seu programa
vencedor: o programa mais curto.
Nota: A sequência de entrada é fornecida no STDIN como uma linha (sem avanço de linha ou retorno de carro)
A string de entrada pode ser qualquer texto com comprimento de palavra razoável (ou seja, não mais que 20 ~ 25 caracteres), como:
Lorem ipsum dolor sente-se no meio, consectetur elip adipiscing. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing ne, ultricies sed, dolor. Cras elementum ultrices diam. Mecenas ligula massa, varius a, sempre congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim is eleifend mi, non fermentum diam nisl sit amet erat. Duis sempre. Duis arcu massa, scelerisque vitae, conseqüentemente, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Louvado egestas leo in pede. Louvado blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus oruct luctus and ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Mecânicas adipiscing ante non diam sodales hendrerit. Ut velit mauris, egestas sed, gravida nec, orn ut ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, em tempus sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Número inteiro id felis. Curabitur aliquet pellentesque diam. Inteiro quis metus vitae elit lobortis egestas. Lorem ipsum dolor sente-se entre os elites consectetuer adipiscing. Morbi vel erat non mauris convallis vehicle. Nulla et sapien. Tellus tortor inteiro, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus e tristique ligula justo vitae magna. Aliquam convallis sollicitudin purus. Álbum de louvor, enim e fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, e ultricies lacus lorem varius purus. Curabitur eu amet.
Por que pedir às pessoas que forneçam o resultado de seu programa? Você está preocupado com as pessoas que não conseguem verificar seus resultados antes de postar?
Estou tentado a fornecer um programa php que consiste no texto de saída. ;-) Falando sério, os espaços na segunda linha do texto de saída parecem ter sido adicionados aos espaços aleatoriamente? Existe algum padrão que eu não estou vendo e, se não, como podemos produzir exatamente essa saída para a entrada fornecida?
@ Gareth: Desculpe, meu mal. Eu cometi um erro, é depois da vírgula, não depois da incidida. Pergunta editada.
@ Peter Taylor: Só porque eu não sou capaz de testar todos os idiomas.
@Ilmari Karonen: Sim, a string de entrada pode ser qualquer coisa.
Perl, 94 caracteres
Corra com perl -nM5.01. (O valor nestá incluído na contagem de caracteres.)
O código acima é o mais curto que eu poderia fazer, capaz de lidar com qualquer bola curva que eu lancei nele (como palavras de uma letra no início de uma linha, linhas de entrada com exatamente 80 caracteres, etc.) exatamente de acordo com a especificação:
(Pedimos desculpas a Gareth por usar seu comentário como entrada de teste adicional.)
A seguinte versão de 75 caracteres funciona bem o suficiente para produzir a saída de amostra da entrada de amostra, mas pode falhar em outras entradas. Além disso, deixa um caractere de espaço extra no final de cada linha de saída.
Ambas as versões serão executadas para sempre se encontrarem entradas que não podem justificar corretamente. (Na versão mais longa, a substituição untilpor until$i>80||fixaria isso ao custo de sete caracteres extras.)
Ah, eu deveria ter começado com uma solução perl ;-) Essa linguagem é obviamente muito boa para essa tarefa.
Eu peguei Quantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.*?\.|.*?,|(.*? )??\S{ <-- HERE 32767}) \b/o segundo texto.
@ M42: Isso ocorre porque o segundo exemplo de texto não pode ser justificado de acordo com as regras. Se eu adicionar a $i>80verificação, ela expande a 11ª linha para pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales, que tem apenas 78 caracteres e desiste, pois cada palavra (exceto a última) é seguida por dois espaços.
Ruby, 146 caracteres
Imprime exatamente a saída desejada (veja abaixo) se o texto fornecido for alimentado em STDIN.
Edit: Logo após enviar minha primeira solução, vi nos comentários que é necessário que qualquer string de entrada possa ser processada. A resposta anterior tinha apenas 95 caracteres, mas não cumpria este requisito:
Se não me engano, você está usando o mesmo truque que eu pensava (codificando os locais das palavras em espaço duplo na saída de exemplo). Observe que o M42 esclareceu que os programas também devem lidar com outras entradas.
@Ilmari Karonen Sim, vi isso depois de enviar. Veja minha edição e comentários acima. Voltando ao campo de golfe ...