Richten Sie einen Text durch Hinzufügen von Leerzeichen aus

10

Angesichts dieses Textes

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 Übung ullamco laboris nisi ut aliquip ex ea Commodo Konsequenz. 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.

Schreiben Sie das kürzeste Programm, das denselben Text mit 80 Zeichen erzeugt. Der obige Text muss genau so aussehen:

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.

Regeln:

  • Wörter dürfen nicht geschnitten werden
  • zusätzliche Leerzeichen müssen hinzugefügt werden
    • nach einem Punkt.
    • nach einem Komma
    • nach dem kürzesten Wort (von links nach rechts)
    • Das Ergebnis darf nicht mehr als 2 aufeinanderfolgende Leerzeichen enthalten
  • Die letzte Zeile ist nicht gerechtfertigt.
  • Zeilen dürfen nicht mit Komma oder Punkt beginnen.
  • Stellen Sie die Ausgabe Ihres Programms bereit

Gewinner: Das kürzeste Programm.

Hinweis: Die Eingabezeichenfolge wird in STDIN als eine Zeile bereitgestellt (kein Zeilenvorschub oder Wagenrücklauf).

aktualisieren:

Die Eingabezeichenfolge kann ein beliebiger Text mit einer vernünftigen Wortlänge sein (dh nicht mehr als 20 bis 25 Zeichen), wie z.

Lorem ipsum dolor sitzen amet, consectetur adipiscing elit. Sed non risus. Suspendisse Lectus Tortor, Dignissim sitzen amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices Durchm. Maecenas ligula massa, varius a, sempre congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, nicht fermentum diam nisl sit amet erat. Duis sempre. Duis arcu massa, scelerisque vitae, Folge, 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 im Faucibus orci luctus und im 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. Integer id felis. Curabitur aliquet pellentesque diam. Ganzzahliger Lebenslauf elit lobortis egestas. Lorem ipsum dolor sitzen amet, consectetuer adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. Integer Tortor Tellus, Aliquam Faucibus, Convallis ID, Congue EU, Quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus und tristique ligula justo vitae magna. Aliquam convallis sollicitudin purus. Praesent Aliquam, Enim bei 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 und Ultricies Lacus Lorem Varius Purus. Curabitur eu amet.

Toto
quelle
3
Warum sollten die Leute gebeten werden, die Ausgabe ihres Programms bereitzustellen? Sind Sie so besorgt darüber, dass Leute ihre Ergebnisse vor dem Posten nicht überprüfen können?
Peter Taylor
1
Ich bin versucht, ein PHP-Programm bereitzustellen, das aus dem Ausgabetext besteht. ;-) Im Ernst, die Leerzeichen in der zweiten Zeile des Ausgabetextes scheinen zufällig zu den Leerzeichen hinzugefügt worden zu sein? Gibt es ein Muster, das ich nicht sehe, und wenn nicht, wie kann erwartet werden, dass wir genau diese Ausgabe für die gegebene Eingabe erzeugen ?
Gareth
@ Gareth: Entschuldigung, mein schlechtes. Ich habe einen Fehler gemacht, ist nach dem Komma, nicht nach dem Zufall. Frage bearbeitet.
Toto
@ Peter Taylor: Nur weil ich nicht alle Sprachen testen kann.
Toto
1
@Ilmari Karonen: Ja, die Eingabezeichenfolge kann alles sein.
Toto

Antworten:

5

Perl, 94 Zeichen

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

Laufen Sie mit perl -nM5.01. (Das nist in der Anzahl der Zeichen enthalten.)

Der obige Code ist der kürzeste, den ich machen konnte, um alle Curveballs zu verarbeiten, die ich darauf geworfen habe (z. B. Ein-Buchstaben-Wörter am Anfang einer Zeile, Eingabezeilen mit einer Länge von genau 80 Zeichen usw.), genau gemäß der Spezifikation:

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?

(Mit Entschuldigung an Gareth, dass er seinen Kommentar als zusätzliche Testeingabe verwendet hat.)

Die folgende 75-Zeichen-Version funktioniert gut genug, um die Sample-Ausgabe aus der Sample-Eingabe zu erzeugen, kann jedoch bei anderen Eingaben fehlschlagen. Außerdem bleibt am Ende jeder Ausgabezeile ein zusätzliches Leerzeichen.

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

Beide Versionen werden für immer wiederholt, wenn sie auf Eingaben stoßen, die sie nicht richtig rechtfertigen können. (In der längeren Version würde das Ersetzen untildurch until$i>80||das Problem auf Kosten von sieben zusätzlichen Zeichen behoben.)

Ilmari Karonen
quelle
Ah, ich hätte mit einer Perl-Lösung beginnen sollen ;-) Diese Sprache ist natürlich wirklich gut für eine solche Aufgabe.
Howard
Ich habe Quantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.*?\.|.*?,|(.*? )??\S{ <-- HERE 32767}) \b/für den zweiten Text.
Toto
@ M42: Das liegt daran, dass der zweite Beispieltext nicht nach den Regeln gerechtfertigt werden kann. Wenn ich den $i>80Scheck hinzufüge , erweitert er die 11. Zeile auf pede  pellentesque  fermentum.  Maecenas  adipiscing  ante  non  diam  sodales, die nur 78 Zeichen lang ist, und gibt dann auf, da auf jedes Wort (außer dem letzten) zwei Leerzeichen folgen.
Ilmari Karonen
2

Ruby, 146 Zeichen

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

Es druckt genau die gewünschte Ausgabe (siehe unten), wenn der angegebene Text in STDIN eingegeben wird.

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.

Bearbeiten: Kurz nachdem ich meine erste Lösung eingereicht hatte, sah ich in den Kommentaren, dass es erforderlich ist, dass jede Eingabezeichenfolge verarbeitet werden kann. Die vorherige Antwort bestand nur aus 95 Zeichen, erfüllte diese Anforderung jedoch nicht:

r=gets.split;l=0;'49231227217b6'.chars{|s|r[l+=s.hex]+=' '};(r*' ').gsub(/(.{,80}) ?/){puts $1}
Howard
quelle
Wenn ich mich nicht irre, verwenden Sie den gleichen Cheat wie ich gedacht habe (Codierung der Positionen der Wörter mit doppeltem Abstand in der Beispielausgabe). Beachten Sie, dass M42 klargestellt hat, dass die Programme auch mit anderen Eingaben umgehen sollten.
Ilmari Karonen
@Ilmari Karonen Ja, das habe ich nach dem Absenden gesehen. Siehe meine Bearbeitung und Kommentare oben. Zurück zum Golfplatz ...
Howard