Justifique um texto adicionando espaços


10

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:

Lorem ipsum dolor sit amet,  consectetur adipisicing 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.

Regras:

  • 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)

atualizar:

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.


3
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?
Peter Taylor

11
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

@ Gareth: Desculpe, meu mal. Eu cometi um erro, é depois da vírgula, não depois da incidida. Pergunta editada.
Toto

@ Peter Taylor: Só porque eu não sou capaz de testar todos os idiomas.
Toto

11
@Ilmari Karonen: Sim, a string de entrada pode ser qualquer coisa.
Toto

Respostas:


5

Perl, 94 caracteres

for(/(.{0,80}\s)/g){$i=1;$i+=!s/^(.*?\.|.*?,|(.*? )??\S{$i}) \b/$1  /until/
|.{81}/;chop;say}

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:

Lorem ipsum dolor sit amet,  consectetur adipisicing 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.

I'm  tempted to  provide a  php  program which consists of  the output text. ;-)
Seriously though,  the spaces on the second line of the output text seem to have
been added to  the spaces at  random? Is  there some pattern to  it that I'm not
seeing,  and if  not,  how can we be expected to produce exactly that output for
the given input?

(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.

for(/(.{0,80}\s)/g){s/(.*?\.|.*?,|.*? ..) \b/$1  /until/.{81}/||s/
//;say}

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.
Howard

Eu peguei Quantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.*?\.|.*?,|(.*? )??\S{ <-- HERE 32767}) \b/o segundo texto.
Toto

@ 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.
Ilmari Karonen

2

Ruby, 146 caracteres

$><<gets.gsub(/(.{,80})( |$)/){$2>""?(s=$1+$/;(['\.',?,]+(1..80).map{|l|"\\b\\w{#{l}}"}).any?{|x|s.sub! /#{x} (?=\w)/,'\& '}while s.size<81;s):$1}

Imprime exatamente a saída desejada (veja abaixo) se o texto fornecido for alimentado em STDIN.

Lorem ipsum dolor sit amet,  consectetur adipisicing 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.

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:

r=gets.split;l=0;'49231227217b6'.chars{|s|r[l+=s.hex]+=' '};(r*' ').gsub(/(.{,80}) ?/){puts $1}

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

@Ilmari Karonen Sim, vi isso depois de enviar. Veja minha edição e comentários acima. Voltando ao campo de golfe ...
Howard
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.