Richten Sie den Text an einem Block aus


10

Aufgabe

Ihre Aufgabe ist es, ein ganzes Programm zu schreiben, das die angegebenen Eingaben an einem Block mit der angegebenen Größe ausrichtet.

Eingang:

40
Lorem ipsum dolor sit amet, consectetur adipiscing 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.

Ausgabe:

Lorem  ipsum dolor sit amet, consectetur
adipiscing  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.
                <-- note the linebreak

Eingabedetails

  • Sie müssen das gesamte ausführbare / interpretierbare Programm schreiben.
  • Sie können annehmen, dass die Eingabe nur druckbare ASCII-Zeichen und keine Registerkarte enthält \t.
  • Die Eingabe kann Zeilenumbrüche enthalten. Wenn es so ist, sie als gegeben sind \n, \roder \r\nje nachdem , was Sie erwarten. Sie sind jedoch während der gesamten Eingabe vereint.
  • Die Eingabe kann in STDIN oder als Befehlszeilenargumente erfolgen. Sie können beide verwenden, wenn es Ihren Anforderungen entspricht (z. B. Blockgröße aus Befehlsargumenten lesen und als stdin eingeben). Sie dürfen jedoch keinen Teil der Eingabe in Ihr Programm fest codieren.
  • Sie können annehmen, dass die Blockgröße als gültige positive ( > 0) Zahl angegeben wird.
  • Zeilenumbrüche in der Eingabe werden wie Leerzeichen behandelt (also als Worttrennzeichen).
  • Wenn die Eingabe mehrere gleichzeitige Leerzeichen enthält, werden sie als eines behandelt.

Ausgabedetails

  • Die Ausgabe muss in einen Block mit einer bestimmten Größe formatiert werden. Die Formatierung erfolgt durch Hinzufügen von Leerzeichen zwischen Wörtern.
  • Die Anzahl der Leerzeichen zwischen Wörtern in einer Zeile muss für diese Zeile gleich sein. Wenn dies nicht möglich ist, müssen nach den Wörtern von links nacheinander zusätzliche Leerzeichen hinzugefügt werden.
  • Wenn das Wort länger als die angegebene Blockgröße ist, steht es allein in einer einzelnen Zeile (und überschreitet die Blockgröße).
  • Wenn die Ausgabe nur ein Wort enthalten soll, wird sie nach links ausgerichtet.
  • Die letzte Zeile der Ausgabe muss nach links ausgerichtet sein und nur ein Leerzeichen zwischen den Wörtern enthalten. Die letzte Zeile der Ausgabe muss mit einem Zeilenumbruch enden.

Die Antwort mit der kürzesten Anzahl von Bytes nach einiger Zeit gewinnt.
Wenn Sie zusätzliche Informationen benötigen, hinterlassen Sie einen Kommentar.

Testfälle

Input:
10
Lorem ipsum dolor sit amet,
consectetur adipiscing elit, sed do eiusmod tempor

Output:
Lorem
ipsum
dolor  sit
amet,
consectetur
adipiscing
elit,  sed
do eiusmod
tempor

Input:
20
Lorem     ipsum

dolor  sit amet,

Output:
Lorem   ipsum  dolor
sit amet,

Input:
1
Lorem ipsum dolor sit amet

Output:
Lorem
ipsum
dolor
sit
amet

Verbunden. (Endlich eine zweite Herausforderung für mein Typografie- Tag, das bereits automatisch gelöscht wurde .;))
Martin Ender

@ MartinBüttner Ich wusste nicht, dass ein solches Tag existiert.
Zereges

@ Vɪʜᴀɴ Sie müssen das gesamte ausführbare / interpretierbare Programm schreiben.
Dennis


@ppperry Interessant, aus irgendeinem Grund hat es meine
Suchfähigkeiten

Antworten:



1

Ruby, 179 Zeichen

n=gets.to_i
s=t=''
$<.read.split.map{|w|if(t+w).size>=n
0while t.size<n&&(1..n).any?{|i|t.sub!(/[^ ]#{' '*i}(?=[^ ])/){|x|x+' '}}
s+=t+?\n
t=w
else
t+=' '+w
t.strip!
end}
puts s,t

Viel zu lang...

Halb ungolfed Version:

n = gets.to_i
s = t = ''
$<.read.split.map{|w|
    if (t + w).size >= n
        0 while t.size < n && (1..n).any?{|i|t.sub!(/[^ ]#{' '*i}(?=[^ ])/){|x|x+' '}}
        s += t + ?\n
        t = w
    else
        t += ' ' + w
        t.strip!  # this is only necessary because of the very first word >:(
    end
}
puts s,t

0

CJam, 87 Bytes

l~:LS*qNSerS%{(2$1$a+_S*,L>{;a\}{\;@;\}?}h;S*a]1>{I1>{LIs,-I,(md1b\aI,(*.+Sf*I.\}I?N}fI

Dies sollte noch golfbar sein. Probieren Sie es online im CJam-Interpreter aus .


0

Netzhaut , 133 Bytes

\s+

+`((1)*1 )((?<-2>.)*\S|\S+) 
:$3<LF>$1
m+`^(?=.(.)+$[^<TB>]*^(?>(?<-1>1)+)1)((.*):(\S+ +)|(\S+ +)(.*):)
$3$4$5 :$6
+`:|<LF>1+| (?= .*$)
<empty>

Das steht <empty>für eine leere nachfolgende Linie. Um den Code auszuführen, <LF>fügen Sie jede Zeile in eine separate Datei ein, ersetzen Sie sie durch Zeilenvorschubzeichen (0x0A) und <TB>durch eine Registerkarte (0x09). Ich werde eine Erklärung hinzufügen, wenn ich mit dem Golfen fertig bin.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.