Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
Vollständig ausgerichtet bedeutet, dass es links und rechts ausgerichtet ist und durch Vergrößern des Abstands zwischen Wörtern erreicht wird, bis jede Zeile passt.
Verbunden:
- Richten Sie einen Text durch Hinzufügen von Leerzeichen aus
- Richten Sie den Text an einem Block aus
- In gewisser Weise kann dies als nächster Schritt in Textverarbeitung Nr. 1 betrachtet werden: Silbentrennung (die anscheinend noch nie veröffentlicht wurde).
Eingang
Sie können Eingaben in jedem beliebigen Format vornehmen. Sie erhalten:
- Eine Zielbreite (in Zeichen) im Bereich von 5 bis einschließlich 100;
- Ein Textblock, der möglicherweise getrennte Wörter enthält. Dies kann eine durch Leerzeichen getrennte Zeichenfolge, ein Array von Wörtern oder ein Array von Arrays von Wortfragmenten (oder jede andere von Ihnen gewünschte Datendarstellung) sein.
Eine typische Eingabe könnte sein:
Width: 25
Text: There's no bu-si-ne-ss lik-e s-h-o-w busine-ss, n-o bus-iness I know.
Wo die Bindestriche mögliche Trennungspunkte und die Leerzeichen Wortgrenzen bezeichnen. Eine mögliche alternative Darstellung des Textes:
[["There's"], ["no"], ["bu", "si", "ne", "ss"], ["lik", "e"], (etc.)]
Ausgabe
Der Eingabetext mit Leerzeichen zwischen Wörtern, Zeilenumbrüchen an der Spaltenbreite und Trennungspunkten, die ausgewählt wurden, um ihn vollständig an der Spaltenbreite auszurichten. Für Funktionen kann ein Array von Zeichenfolgen (eine für jede Zeile) zurückgegeben werden, anstatt die Zeilenumbruchtrennung zu verwenden.
Eine mögliche Ausgabe für die obige Eingabe könnte sein:
There's no business like
show business, no bus-
iness I know.
Beachten Sie, dass alle Bindestriche entfernt wurden, mit Ausnahme der in der letzten "Bus-Iness", die beibehalten wird, um anzuzeigen, dass das Wort in die nächste Zeile umgebrochen wird, und ausgewählt wurde, um sicherzustellen, dass die zweite Zeile so viel Text wie möglich enthält.
Regeln
Innerhalb jeder Zeile darf die Anzahl der Leerzeichen zwischen Wörtern nicht mehr als 1 betragen. Ansonsten liegt es an Ihnen, wo Sie die zusätzlichen Leerzeichen einfügen:
hello hi foo bar <-- not permitted (1,1,5) hello hi foo bar <-- not permitted (2,1,4) hello hi foo bar <-- OK (2,2,3) hello hi foo bar <-- OK (2,3,2) hello hi foo bar <-- OK (3,2,2)
Keine Zeile darf mit Leerzeichen beginnen oder enden (mit Ausnahme der letzten Zeile, die mit Leerzeichen enden darf).
Die letzte Zeile sollte mit einem Leerzeichen zwischen den einzelnen Wörtern ausgerichtet bleiben. Auf Wunsch kann ein beliebiges Leerzeichen / eine neue Zeile folgen, dies ist jedoch nicht erforderlich.
Wörter bestehen aus AZ, az, 0-9 und einfacher Interpunktion (
.,'()&
)Sie können davon ausgehen, dass kein Wortfragment länger als die Zielbreite ist und dass es immer möglich ist, Zeilen gemäß den Regeln zu füllen (dh, auf jeder Zeile befinden sich mindestens 2 Wortfragmente oder 1 Wortfragment, das die Zeile ausfüllt perfekt)
Sie müssen Silbentrennzeichen auswählen, die die Anzahl der Wortzeichen in früheren Zeilen maximieren (dh Wörter müssen gierig von Zeilen konsumiert werden), zum Beispiel:
This is an input stri-ng with hyph-en-at-ion poi-nts. This is an input stri- <-- not permitted ng with hyphenation points. This is an input string with hyph- <-- not permitted enation points. This is an input string with hyphen- <-- OK ation points.
Kürzester Code in Bytes gewinnt
Beispiele
Width: 20
Text: The q-uick brown fox ju-mp-s ove-r t-h-e lazy dog.
The quick brown fox
jumps over the lazy
dog.
Width: 32
Text: Given a width and a block of text cont-ain-ing pos-sible hyphen-ation points, for-mat it ful-ly-just-ified (in mono-space).
Given a width and a block of
text containing possible hyphen-
ation points, format it fully-
justified (in monospace).
Width: 80
Text: Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.
Programming Puzzles & Code Golf is a question and answer site for programming
puzzle enthusiasts and code golfers. It's built and run by you as part of the
Stack Exchange network of Q&A sites. With your help, we're working together to
build a library of programming puzzles and their solutions.
Width: 20
Text: Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.
Programming Puzzles
& Code Golf is a
question and answer
site for programming
puzzle enthusiasts
and code golfers.
It's built and run
by you as part of
the Stack Exchange
network of Q&A
sites. With your
help, we're working
together to build a
library of program-
ming puzzles and
their solutions.
Width: 5
Text: a b c d e f g h i j k l mm nn oo p-p qq rr ss t u vv ww x yy z
a b c
d e f
g h i
j k l
mm nn
oo pp
qq rr
ss t
u vv
ww x
yy z
Width: 10
Text: It's the bl-ack be-ast of Araghhhhh-hhh-h-hhh-h-h-h-hh!
It's the
black be-
ast of
Araghhhhh-
hhhhhhhhh-
hhh!
quelle
anybod-y
mit der Breite 7, können wir entwederanybody
oder ausgebenanybod-\ny
?Antworten:
JavaScript (ES6), 218 Byte
Übernimmt Argumente in currying syntax (
f(width)(text)
) und die Texteingabe erfolgt in dem in der Challenge beschriebenen Double-Array-Format. Strings werden über in dieses Format konvertiert.split` `.map(a=>a.split`-`))
. Außerdem sind die Zeilenumbrüche wörtliche Zeilenumbrüche in Vorlagenzeichenfolgen.Ungespielt und neu arrangiert
Die Idee dabei war, jeden Teil der gesamten Saite zu durchlaufen und jede Zeile einzeln aufzubauen. Sobald eine Zeile vollständig ist, wird der Wortabstand von links nach rechts vergrößert, bis alle zusätzlichen Leerzeichen platziert sind.
Testschnipsel
quelle
GNU sed
-r
, 621 BytesNimmt die Eingabe in zwei Zeilen vor: Die Breite wird zuerst als unäre Zahl und die Zeichenfolge als zweite.
Ich bin sicher, dass dies viel mehr Golf spielen könnte, aber ich habe bereits viel zu viel Zeit investiert.
Probieren Sie es online!
Erläuterung
Das Programm arbeitet in zwei Phasen: 1. Teilen und 2. Begründen. Nehmen wir für das Folgende an, unsere Eingabe ist:
Installieren
Zuerst lesen wir die Eingabe, indem wir die erste Zeile (die Breite als eine unäre Zahl) in den Haltebereich (
x
) verschieben, dann die nächste Zeile (N
) anhängen und dann eine Kopie der Breite aus dem Haltebereich (G
) in den Musterbereich. DaN
wir eine Führungslinie hinterlassen haben,\n
ersetzen wir diese durch eine!@
, die wir in Phase 1 als Cursor verwenden werden.Nun ist der Inhalt des Speicherbereichs
1111111111111
(und wird sich von nun an nicht mehr ändern) und der Musterbereich (im Format von sedsl
Befehl "Unmissverständlich drucken" ):Phase 1
In Phase 1
@
rückt der Hauptcursor jeweils um ein Zeichen vor, und für jedes Zeichen wird a1
am Ende des Musterraums vom "Zähler" entfernt. Mit anderen Worten@foo\n111$
,f@oo\n11$
,fo@o\n1$
etc.Der
!
Cursor bewegt sich hinter dem@
Cursor und markiert Stellen, die wir durchbrechen könnten, wenn der Zähler in der Mitte der Zeile den Wert 0 erreicht. Ein paar Runden würden so aussehen:Hier gibt es ein Muster, das wir erkennen: ein Leerzeichen, dem der
@
Cursor unmittelbar folgt . Da der Zähler größer als 0 ist, bewegen wir den Break-Marker weiter und den Hauptcursor weiter:Ist hier ein anderes Muster:
-@
und wir haben noch 7 im Kostenzähler, also rücken wir den Bruchcursor wieder vor und rücken weiter vor:Hier ist ein anderes Muster: Ein Bindestrich unmittelbar vor dem Unterbrechungscursor und ein anderer vor dem Hauptcursor. Wir entfernen den ersten Bindestrich, setzen den Umbruchcursor vor und addieren 1 zum Zähler, da wir ein Zeichen entfernt haben.
Wir bewegen den Hauptcursor weiter:
Ähnlich wie zuvor, aber diesmal steht der Hauptcursor vor einem Leerzeichen, anstatt einem Bindestrich zu folgen. Wir entfernen den Bindestrich, aber da wir auch den Hauptcursor vorrücken, erhöhen wir weder den Zähler noch verringern wir ihn.
Endlich hat unser Zähler Null erreicht. Da das Zeichen nach dem Hauptcursor ein Leerzeichen ist, fügen wir eine neue Zeile ein und setzen beide Cursor unmittelbar danach. Dann füllen wir den Zähler auf (
G
) und fangen von vorne an.Phase 1 setzt sich fort, indem die Cursor vorgerückt und verschiedene Muster abgeglichen werden, bis der
@
Cursor das Ende der Zeichenfolge erreicht.Am Ende von Phase 1 sieht unser Musterraum folgendermaßen aus:
Oder:
Phase 2
In Phase 2 verwenden wir
%
als Cursor und verwenden den Zähler auf ähnliche Weise, beginnend wie folgt:Zuerst zählen wir die Zeichen in der ersten Zeile, indem wir den Cursor bewegen und 1s vom Zähler entfernen.
Da der Zähler 0 ist, machen wir in dieser Zeile nichts anderes. Die zweite Zeile hat auch die gleiche Anzahl von Zeichen wie der Zähler. Gehen wir also zur dritten Zeile über:
Der Zähler ist größer als 0, also bewegen wir den Cursor zurück zum Zeilenanfang. Dann finden wir den ersten Durchlauf von Leerzeichen und fügen ein Leerzeichen hinzu, wodurch der Zähler dekrementiert wird.
Der Zähler ist größer als 0; Da sich der Cursor bereits in der letzten (einzigen) Zeile mit Leerzeichen befindet, verschieben wir ihn an den Zeilenanfang und wiederholen ihn:
Jetzt ist der Zähler 0, also bewegen wir den Cursor an den Anfang der nächsten Zeile. Wir wiederholen dies für jede Zeile mit Ausnahme der letzten. Das ist das Ende von Phase 2 und das Ende des Programms! Das Endergebnis ist:
quelle
gsed (GNU sed) 4.4
starte, bekomme ichgsed: -e expression #1, char 16: ":" lacks a label
. Können Sie genau angeben, wie Sie es aufrufen? (Ich benutzeprintf "%s\n%s" "$1" "$2" | gsed -r '<code here>';
)-r
Flagge nicht zu respektieren scheint, weshalb der TiO-Link oben auf die bash-Seite verweist.!
(obwohl ich es in!
der Liste der möglichen Sonderzeichen verpasst habe , I) Ich halte das nicht dagegen.JavaScript (ES6), 147 Byte
Übernimmt die Eingabe als
(width)(text)
.Probieren Sie es online!
Kommentiert
quelle
APL (Dyalog Unicode) ,
129 123 121 118 111 109 107 104 10095 Byte SBCSProbieren Sie es online!
quelle
Stax ,
5150 BytesFühren Sie es aus und debuggen Sie es
quelle
Python 2 , 343 Bytes
Probieren Sie es online!
quelle
print'\n'.join(L[:-1])
anstelle vonfor e in L[:-1]:print e