Hintergrund
In der Typografie sind Flüsse visuelle Lücken in einem Textblock, die durch zufällige Ausrichtung von Räumen entstehen. Diese sind besonders ärgerlich, da Ihr Gehirn sie in der peripheren Sicht leichter zu erfassen scheint, was Ihre Augen ständig ablenkt.
Nehmen Sie als Beispiel den folgenden Textblock, wobei die Zeilen so unterbrochen sind, dass die Zeilenbreite 82 Zeichen nicht überschreitet :
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eismod tempor
incididunt ut labore et dolore maga 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. Lorem ipsum dolor sit amet,
consectetur adipisicing elit, sed do eismod tempor incididunt ut labore et dolore
maga 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.
Im unteren rechten Teil gibt es einen Fluss, der sich über sechs Linien erstreckt, die ich im folgenden Block hervorgehoben habe:
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eismod tempor
incididunt ut labore et dolore maga 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. Lorem█ipsum dolor sit amet,
consectetur adipisicing elit, sed do eismod tempor█incididunt ut labore et dolore
maga 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.
Wir können dies abschwächen, indem wir eine etwas andere Spaltenbreite wählen. Wenn wir beispielsweise denselben Text mit Zeilen von nicht mehr als 78 Zeichen gestalten , gibt es keinen Fluss, der länger als zwei Zeilen ist:
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eismod tempor
incididunt ut labore et dolore maga 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. Lorem ipsum dolor
sit amet, consectetur adipisicing elit, sed do eismod tempor incididunt ut
labore et dolore maga 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.
Beachten Sie, dass wir für diese Frage nur Schriften mit einem einheitlichen Abstand betrachten, sodass Flüsse einfach vertikale Spalten von Räumen sind. Die Länge eines Flusses ist die Anzahl der Zeilen, die er überspannt.
Nebenbei: Wenn Sie an der Flusserkennung in proportionalen Schriftarten interessiert sind, gibt es einige interessante Beiträge im Netzwerk.
Die Herausforderung
Sie erhalten eine Zeichenfolge mit druckbaren ASCII-Zeichen (Codepunkt 0x20 bis 0x7E) - dh eine einzelne Zeile. Drucken Sie diesen Text mit einer Zeilenbreite zwischen 70 und 90 Zeichen (einschließlich) aus, sodass die maximale Länge eines Flusses im Text minimiert wird. Wenn es mehrere Textbreiten mit derselben (minimalen) maximalen Flusslänge gibt, wählen Sie die schmalere Breite. Das obige Beispiel mit 78 Zeichen ist die richtige Ausgabe für diesen Text.
Um Zeilen umzubrechen, sollten Sie Leerzeichen (0x20) durch Zeilenumbrüche ersetzen, sodass die resultierenden Zeilen so viele Zeichen wie möglich enthalten, jedoch nicht mehr als die ausgewählte Textbreite. Beachten Sie, dass der resultierende Zeilenumbruch selbst nicht Teil dieser Anzahl ist. Beispielsweise Lorem[...]tempor
enthält der letzte Block oben 78 Zeichen, was auch der Breite des Texts entspricht.
Sie können davon ausgehen, dass die Eingabe keine aufeinander folgenden Leerzeichen und keine führenden oder nachfolgenden Leerzeichen enthält. Sie können auch davon ausgehen, dass kein Wort (aufeinanderfolgende Teilzeichenfolge von Nicht-Leerzeichen) mehr als 70 Zeichen enthält.
Sie können ein Programm oder eine Funktion schreiben, Eingaben über STDIN, ein Befehlszeilenargument oder ein Funktionsargument vornehmen und das Ergebnis in STDOUT ausgeben.
Dies ist Codegolf, daher gewinnt die kürzeste Antwort (in Bytes).
quelle
Antworten:
CJam,
116 106 99 84 7772 BytesNimmt die einzeilige Eingabe und druckt die korrekte Ausgabe an STDOUT.
UPDATE : Viele Verbesserungen und überflüssige Schleifen wurden entfernt, indem alle Berechnungen in der Sortierschleife selbst durchgeführt wurden. Außerdem wurde ein Fehler in der Flusslängenberechnung behoben.
Erklärung bald (nachdem ich noch weiter Golf gespielt habe)
Probieren Sie es hier aus
quelle
ea~
stattX
jedes Mal vornehmen können . Spart zwei Bytes.Ruby
162 160 158 152 160157 ( Demo )Die nicht golfene Version:
quelle
%r{...}
ermöglicht mir die Verwendung der String-Interpolation. Ich habe es nur versucht21.times
, aber es hat weitere Auswirkungen auf die Zukunft, und ich habe es nicht geschafft, eine kürzere Lösung zu finden.APL (105)
Erläuterung:
(K⊂⍨' '=K←' ',⍵)
: Fügen Sie ein Leerzeichen vor⍵
und teilen Sie es⍵
auf. Jedes Wort behält den Raum bei, mit dem es beginnt.∘{
...}¨70+⍳21
: mit diesem Wert für jede Zahl im Bereich[71, 91]
: (Aufgrund der Art und Weise, wie die Wörter aufgeteilt werden, endet jede 'Zeile' am Anfang mit einem zusätzlichen Leerzeichen, das später entfernt wird. Der Bereich wird um verschoben ein, um den zusätzlichen Platz zu kompensieren.)×⍴⍺:
: Wenn noch Worte übrig sind,z←⍵>+\≢¨⍺
: Ermitteln Sie die Länge für jedes Wort und berechnen Sie eine laufende Summe der Länge pro Wort. Markieren Sie1
alle Wörter, die zum Ausfüllen der nächsten Zeile verwendet werden können, und speichern Sie diese inz
.(⊂z/⍺),⍵∇⍨⍺⍨~z
: nimm diese Wörter und verarbeite dann, was von der Liste übrig ist.⋄⍺
: wenn nicht, kehre zurück⍺
(was jetzt leer ist).G←
: Speichern Sie die Liste der Zeilenlisten inG
(eine für jede mögliche Zeilenlänge).V←{
...}¨G
: Berechnen Sie für jede Möglichkeit die Länge des längsten Flusses und speichern Sie ihn inV
:+\↑≢¨¨⍵
: Ermitteln Sie die Länge jedes Wortes (erneut) und bilden Sie eine Matrix aus den Längen. Berechnen Sie die laufende Summe für jede Zeile in den Zeilen der Matrix. (Daher wird das zusätzliche Leerzeichen am Anfang jeder Zeile ignoriert.)2≠⌿
: Prüfen Sie für jede Spalte der Matrix, ob die aktuelle Länge der Linie an diesem Punkt nicht mit der Linie danach übereinstimmt. Wenn ja, gibt es dort keinen Fluss.⊂⍨¨↓⍉
: Teilen Sie jede Spalte der Matrix für sich (auf dem1
s). Dies gibt eine Liste von Listen, wobei für jeden Fluss eine Liste vorhanden ist[1, 0, 0, ...]
, abhängig von der Länge des Flusses. Wenn es keinen Fluss gibt, wird die Liste sein[1]
.⌈/≢¨
: Ermitteln Sie die Länge jedes Flusses und den maximalen Wert davon.⊃G/⍨V=⌊/V
: vonG
, wählen Sie das erste Element aus, für das die Länge des längsten Flusses für alle Elemente dem Minimum entspricht.{1↓∊⍵,3⊃⎕TC}¨
: Füge für jede Zeile alle Wörter zusammen, entferne das erste Element (das zusätzliche Leerzeichen am Anfang) und füge eine neue Zeile am Ende hinzu.∊
: füge alle Zeilen zusammen.quelle
Bash + Coreutils,
236157 BytesMit einem anderen Ansatz bearbeitet - viel kürzer als zuvor:
Liest die Eingabezeichenfolge von der Befehlszeile.
Bei 3 verschachtelten Sortierungen schaudert es mich zu überlegen, wie komplex die O-Zeit dafür ist, aber das Beispiel ist auf meinem Computer in weniger als 10 Sekunden abgeschlossen.
quelle
Python, 314 Bytes
Vielen Dank an SP3000, grc und FryAmTheEggman:
quelle
JavaScript (ES6) 194
202Iterative Lösung, möglicherweise kürzer, wenn sie rekursiv gemacht wird
Erklärt
Test in der FireFox / FireBug-Konsole.
Ausgabe
quelle
Python 3, 329 Bytes
Ungolfed-Version:
quelle