Justifica un texto agregando espacios


10

Dado este texto

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. Excepcional sint occasionecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

escribe el programa más corto que produce el mismo texto justificado con 80 caracteres. El texto anterior debe verse exactamente como:

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.

Reglas:

  • las palabras no deben cortarse
  • se deben agregar espacios adicionales
    • despues de un punto.
    • después de una coma
    • después de la palabra más corta (de izquierda a derecha)
    • el resultado no debe tener más de 2 espacios consecutivos
  • La última línea no está justificada.
  • las líneas no deben comenzar con coma o punto.
  • proporcionar la salida de su programa

Ganador: El programa más corto.

nota: la cadena de entrada se proporciona en STDIN como una línea (sin avance de línea o retorno de carro)

actualizar:

La cadena de entrada puede ser cualquier texto con una longitud de palabra razonable (es decir, no más de 20 ~ 25 caracteres) como:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, sempre congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis sempre. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Congüe pellenteque. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo en pede. Praesent blandit odio eu enim. Pellenteque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis en faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, en tempus sapien eros vitae ligula. Pellenteque rhoncus nunc et augue. Identificación de enteros felis. Curabitur aliquet pellentesque diam. Entero quis metus vitae elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla y Sapien. Tortor entero tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, y tristique ligula justo vitae magna. Aliquam convallis sollicitudin purus. Praesent aliquam, enim en fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem en sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla en justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, y ultricies lacus lorem varius purus. Curabitur eu amet.


3
¿Por qué pedirle a la gente que proporcione el resultado de su programa? ¿Le preocupa que las personas no puedan verificar sus resultados antes de publicar?
Peter Taylor

1
Estoy tentado a proporcionar un programa php que consiste en el texto de salida. ;-) En serio, ¿los espacios en la segunda línea del texto de salida parecen haber sido agregados a los espacios al azar? ¿Hay algún patrón que no esté viendo? Si no, ¿cómo podemos esperar que produzcamos exactamente esa salida para la entrada dada?
Gareth

@Gareth: Lo siento, mi mal. Cometí un error, es después de la coma, no después de incididunt. Pregunta editada.
Toto

@ Peter Taylor: Solo porque no puedo probar todos los idiomas.
Toto

1
@Ilmari Karonen: Sí, la cadena de entrada puede ser cualquier cosa.
Toto

Respuestas:


5

Perl, 94 caracteres

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

Corre con perl -nM5.01. (El nestá incluido en el recuento de caracteres).

El código anterior es el más corto que pude hacer que podría manejar cualquier bola curva que le arrojé (como palabras de una letra al comienzo de una línea, líneas de entrada de exactamente 80 caracteres de largo, etc.) exactamente de acuerdo con las especificaciones:

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?

(Con disculpas a Gareth por usar su comentario como entrada de prueba adicional).

La siguiente versión de 75 caracteres funciona lo suficientemente bien como para producir la salida de muestra de la entrada de muestra, pero puede fallar para otras entradas. Además, deja un espacio extra al final de cada línea de salida.

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

Ambas versiones se repetirán para siempre si encuentran datos que no pueden justificar correctamente. (En la versión más larga, reemplazar untilcon until$i>80||arreglaría eso a costa de siete caracteres adicionales).


Ah, debería haber comenzado con una solución perl ;-) Este lenguaje, por supuesto, es realmente bueno para tal tarea.
Howard

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

@ M42: Eso se debe a que el segundo texto de ejemplo no puede justificarse de acuerdo con las reglas. Si agrego el $i>80cheque, expande la línea 11 a pede  pellentesque  fermentum.  Maecenas  adipiscing  ante  non  diam  sodales, que tiene solo 78 caracteres de largo, y luego se da por vencido ya que cada palabra (excepto la última) es seguida por dos espacios.
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 exactamente la salida deseada (ver más abajo) si el texto dado se alimenta a 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.

Editar: Justo después de enviar mi primera solución, vi en los comentarios que se requiere que se pueda procesar cualquier cadena de entrada. La respuesta anterior tenía solo 95 caracteres, pero no cumplía este requisito:

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

Si no me equivoco, estás usando el mismo truco que pensé (codificando las ubicaciones de las palabras de doble espacio en la salida del ejemplo). Tenga en cuenta que M42 ha aclarado que los programas también deben hacer frente a otras entradas.
Ilmari Karonen

@Ilmari Karonen Sí, lo vi después de enviar. Vea mi edición y comentarios arriba. Volviendo al campo de golf ...
Howard
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.