Giustifica un testo aggiungendo spazi


10

Dato questo testo

Lorem ipsum dolor sit amet, contectetur adipisicing elit, sed do eiusmod time incididunt ut labore et dolore magna aliqua. Questo è il minimo per veniam, quis nostrud esercizio ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in vellutata voluttà esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

scrivere il programma più breve che produce lo stesso testo giustificato a 80 caratteri. Il testo sopra deve apparire esattamente come:

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.

Regole:

  • le parole non devono essere tagliate
  • spazi aggiuntivi devono essere aggiunti
    • dopo un punto.
    • dopo una virgola
    • dopo la parola più breve (da sinistra a destra)
    • il risultato non deve avere più di 2 spazi consecutivi
  • l'ultima riga non è giustificata.
  • le righe non devono iniziare con virgola o punto.
  • fornire l'output del tuo programma

vincitore: il programma più breve.

nota: la stringa di input viene fornita su STDIN come una riga (nessun avanzamento riga o ritorno a capo)

aggiornare:

La stringa di input può essere qualsiasi testo con lunghezza della parola ragionevole (cioè non più di 20 ~ 25 caratteri) come:

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, conseguat in, pretium a, enim. Convento Pellentesque. Ut in risus volutpat libero pharetra tempor. Cras vestibolo bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibolo ante ipsum primis in 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, in tempus sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Numero intero id felis. Curabitur aliquet pellentesque diam. Numero intero quis metus vitae elit lobortis egestas. Lorem ipsum dolor sit amet, conservatore che adotta l'elite. Morbi vel erat non mauris convallis Vehicula. Nulla et sapien. Intero 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 a sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Suscipit enea 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.


3
Perché chiedere alle persone di fornire l'output del loro programma? Sei preoccupato che le persone non riescano a controllare i loro risultati prima di pubblicare?
Peter Taylor,

1
Sono tentato di fornire un programma php che consiste nel testo di output. ;-) Scherzi a parte, gli spazi sulla seconda riga del testo di output sembrano essere stati aggiunti agli spazi a caso? C'è qualche modello che non vedo e, in caso contrario, come possiamo aspettarci di produrre esattamente quell'output per l'input dato?
Gareth,

@Gareth: scusa, mia cattiva. Ho fatto un errore, è dopo la virgola, non dopo un incidente. Domanda modificata.
Toto

@Peter Taylor: Solo perché non sono in grado di testare tutte le lingue.
Tot

1
@Ilmari Karonen: Sì, la stringa di input può essere qualsiasi cosa.
Toto

Risposte:


5

Perl, 94 caratteri

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

Corri con perl -nM5.01. (Il valore nè incluso nel conteggio dei personaggi.)

Il codice sopra è il più breve che potrei fare in grado di gestire qualsiasi curva che ho lanciato (come parole di una lettera all'inizio di una riga, linee di input lunghe esattamente 80 caratteri, ecc.) Esattamente secondo le specifiche:

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 scuse a Gareth per aver usato il suo commento come input di test aggiuntivo.)

La seguente versione da 75 caratteri funziona abbastanza bene per produrre l'output di esempio dall'input di esempio, ma può non riuscire per altri input. Inoltre, lascia un carattere di spazio aggiuntivo alla fine di ciascuna riga di output.

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

Entrambe le versioni eseguiranno il ciclo per sempre se incontrano input che non possono giustificare correttamente. (Nella versione più lunga, la sostituzione untilcon until$i>80||lo risolverebbe al costo di sette caratteri extra.)


Ah, avrei dovuto iniziare con una soluzione perl ;-) Questo linguaggio è ovviamente ottimo per un compito del genere.
Howard,

Ho ottenuto Quantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.*?\.|.*?,|(.*? )??\S{ <-- HERE 32767}) \b/il secondo testo.
Tot

@ M42: Questo perché il secondo testo di esempio non può essere giustificato secondo le regole. Se aggiungo il $i>80segno di spunta, espande l'undicesima riga a pede  pellentesque  fermentum.  Maecenas  adipiscing  ante  non  diam  sodales, che è lunga solo 78 caratteri, e quindi si arrende poiché ogni parola (tranne l'ultima) è seguita da due spazi.
Ilmari Karonen,

2

Rubino, 146 caratteri

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

Stampa esattamente l'output desiderato (vedi sotto) se il testo dato viene inserito in 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.

Modifica: subito dopo aver inviato la mia prima soluzione ho visto nei commenti che è necessario che qualsiasi stringa di input possa essere elaborata. La risposta precedente era di soli 95 caratteri ma non soddisfaceva questo requisito:

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

Se non sbaglio, stai usando lo stesso cheat a cui ho pensato (codificando le posizioni delle parole a doppia spaziatura nell'output di esempio). Si noti che M42 ha chiarito che i programmi dovrebbero far fronte anche ad altri input.
Ilmari Karonen,

@Ilmari Karonen Sì, l'ho visto dopo l'invio. Vedi la mia modifica e i commenti sopra. Tornando al campo da golf ...
Howard,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.