Justifier un texte en ajoutant des espaces

10

Compte tenu de ce texte

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 conséquat. 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.

écrire le programme le plus court qui produit le même texte justifié à 80 caractères. Le texte ci-dessus doit ressembler exactement à:

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.

Règles:

  • les mots ne doivent pas être coupés
  • des espaces supplémentaires doivent être ajoutés
    • après un point.
    • après une virgule
    • après le mot le plus court (de gauche à droite)
    • le résultat ne doit pas avoir plus de 2 espaces consécutifs
  • la dernière ligne n'est pas justifiée.
  • les lignes ne doivent pas commencer par une virgule ou un point.
  • fournir la sortie de votre programme

gagnant: Le programme le plus court.

note: La chaîne d'entrée est fournie sur STDIN sur une seule ligne (pas de saut de ligne ni de retour chariot)

mise à jour:

La chaîne d'entrée peut être n'importe quel texte dont la longueur de mot est raisonnable (c'est-à-dire pas plus de 20 à 25 caractères), comme:

Lorem ipsum dolor sit amet, elect adipiscing consectetur. 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, conséquat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Mécènes 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, dans tempus sapien eros vitae ligula. Poncellaire rhoncus nunc et augue. Entier id felis. Curabitur aliquet pellentesque diam. Entier quis metus vitae elit lobortis egestas. Lorem ipsum dolor assis amet, élit adipiscing consectetuer. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. Entier tortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus et tristique ligula justo vitae magna. Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem chez 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, et ultricies lacus lorem varius purus. Curabitur eu amet.

Toto
la source
3
Pourquoi demander aux gens de fournir les résultats de leur programme? Êtes-vous si inquiet que les gens ne vérifient pas leurs résultats avant de poster?
Peter Taylor
1
Je suis tenté de fournir un programme php qui se compose du texte de sortie. ;-) Sérieusement cependant, les espaces sur la deuxième ligne du texte de sortie semblent avoir été ajoutés aux espaces au hasard? Y a-t-il un modèle que je ne vois pas, et sinon, comment peut-on s'attendre à produire exactement cette sortie pour l'entrée donnée?
Gareth
@Gareth: Désolé, mon mauvais. J'ai fait une erreur, c'est après la virgule, pas après incididunt. Question modifiée.
Toto
@Peter Taylor: Tout simplement parce que je ne suis pas en mesure de tester toutes les langues.
Toto
1
@Ilmari Karonen: Oui, la chaîne d'entrée peut être n'importe quoi.
Toto

Réponses:

5

Perl, 94 caractères

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

Courez avec perl -nM5.01. (Le nest inclus dans le nombre de caractères.)

Le code ci-dessus est le plus court que je puisse faire pour gérer toutes les boules de courbe que je lui ai lancées (telles que des mots d'une lettre au début d'une ligne, des lignes d'entrée de 80 caractères exactement, etc.) exactement selon les spécifications:

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?

(Toutes mes excuses à Gareth pour avoir utilisé son commentaire comme entrée de test supplémentaire.)

La version suivante de 75 caractères fonctionne suffisamment bien pour produire la sortie d'échantillon à partir de l'entrée d'échantillon, mais peut échouer pour d'autres entrées. En outre, il laisse un caractère d'espace supplémentaire à la fin de chaque ligne de sortie.

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

Les deux versions seront mises en boucle pour toujours si elles rencontrent une entrée qu'elles ne peuvent pas justifier correctement. (Dans la version plus longue, le remplacement untilpar until$i>80||corrigerait cela au prix de sept caractères supplémentaires.)

Ilmari Karonen
la source
Ah, j'aurais dû commencer avec une solution Perl ;-) Cette langue est bien sûr vraiment bonne pour une telle tâche.
Howard
J'ai eu Quantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.*?\.|.*?,|(.*? )??\S{ <-- HERE 32767}) \b/pour le deuxième texte.
Toto
@ M42: C'est parce que le deuxième exemple de texte ne peut pas être justifié selon les règles. Si j'ajoute le $i>80chèque, il étend la 11e ligne à pede  pellentesque  fermentum.  Maecenas  adipiscing  ante  non  diam  sodales, qui ne fait que 78 caractères, puis abandonne car chaque mot (sauf le dernier) est suivi de deux espaces.
Ilmari Karonen
2

Ruby, 146 caractères

$><<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}

Il imprime exactement la sortie souhaitée (voir ci-dessous) si le texte donné est introduit dans 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: Juste après avoir soumis ma première solution, j'ai vu dans les commentaires qu'il est nécessaire que toute chaîne d'entrée puisse être traitée. La réponse précédente ne contenait que 95 caractères mais ne remplissait pas cette condition:

r=gets.split;l=0;'49231227217b6'.chars{|s|r[l+=s.hex]+=' '};(r*' ').gsub(/(.{,80}) ?/){puts $1}
Howard
la source
Si je ne me trompe pas, vous utilisez la même triche que je pensais (en encodant les emplacements des mots à double interligne dans l'exemple de sortie). Notez que M42 a précisé que les programmes devraient également gérer d'autres entrées.
Ilmari Karonen
@Ilmari Karonen Oui, je l'ai vu après avoir soumis. Voir ma modification et mes commentaires ci-dessus. Pour en revenir au terrain de golf ...
Howard