Wyrównaj tekst do bloku

10

Zadanie

Twoim zadaniem jest napisanie całego programu, który dopasuje dane wejściowe do bloku o danym rozmiarze.

Wejście:

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.

Wynik:

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

Dane wejściowe

  • Musisz napisać cały program wykonywalny / interpretowalny.
  • Można przypuszczać, że dane wejściowe zawierają tylko drukowalne znaki ASCII i nie zawierają tabulatora \t.
  • Dane wejściowe mogą zawierać podział wiersza. Jeśli to nie tak, są one podane jako \n, \rlub \r\nw zależności od tego, czego się spodziewać. Są one jednak zjednoczone podczas całego wkładu.
  • Dane wejściowe można podać w STDIN lub jako argumenty wiersza poleceń. Możesz użyć obu z nich, jeśli odpowiada to twoim potrzebom (na przykład odczytać rozmiar bloku z argumentów poleceń i wprowadzić jako standardowe wejście). Nie możesz jednak zakodować żadnej części danych wejściowych do swojego programu.
  • Można przypuszczać, że rozmiar bloku podano jako prawidłową > 0liczbę dodatnią ( ).
  • Podział wiersza na wejściu jest traktowany tak samo jak spacja (a zatem jest separatorem słów)
  • Jeśli dane wejściowe zawierają wiele współbieżnych spacji, są one traktowane jako jedna.

Dane wyjściowe

  • Wyjście musi być sformatowane w blok o danym rozmiarze. Formatowanie odbywa się poprzez dodanie spacji między wyrazami.
  • Liczba spacji między słowami w linii musi być równa dla tej linii. Jeśli nie jest to możliwe, należy dodawać kolejne spacje po słowach zaczynających się od lewej.
  • Jeśli słowo jest dłuższe niż podany rozmiar bloku, pozostanie ono samo w jednym wierszu (i przekroczy rozmiar bloku).
  • Jeśli wynik powinien zawierać tylko jedno słowo, zostanie wyrównany do lewej.
  • Ostatni wiersz wyniku musi być wyrównany do lewej, z tylko jedną spacją między słowami. Ostatni wiersz wyniku musi kończyć się łamaniem linii końcowej.

Odpowiedź, z najmniejszą liczbą bajtów po pewnym czasie, wygrywa.
Jeśli potrzebujesz dodatkowych informacji, zostaw komentarz.

Przypadki testowe

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
Zereges
źródło
Związane z. (Wreszcie drugie wyzwanie dla mojego tagu typografii, który został już automatycznie usunięty;))
Martin Ender
@ MartinBüttner Nie wiedziałem, że taki tag istnieje.
Zereges,
@ Vɪʜᴀɴ Musisz napisać cały program wykonywalny / interpretowalny.
Dennis
@ppperry Interesujące, z jakiegoś powodu uniknęło moich umiejętności wyszukiwania
Zereges

Odpowiedzi:

2

Pyth, 60 57 54 51 50 52 bajtów

2015-10-22: Naprawienie błędu zajęło 2 bajty.

=HfTcjd.zdWHAcH]f|qTlH>jd<HhTQ1s.iGcJ|tlG1*d?H-QlsGJ

Wypróbuj online.

PurkkaKoodari
źródło
1

Ruby, 179 znaków

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

Zbyt długo...

Wersja częściowo niestrzeżona:

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
Klamka
źródło
0

CJam, 87 bajtów

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

To wciąż powinno być możliwe do gry w golfa. Wypróbuj online w interpretatorze CJam .

Dennis
źródło
0

Siatkówka , 133 bajty

\s+

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

<empty>Reprezentuje pustą linię spływu. Aby uruchomić kod, umieść każdą linię w osobnym pliku, zamień na <LF>znaki końca linii (0x0A) i <TB>tabulatora (0x09). Dodam wyjaśnienie, kiedy skończę grać w golfa.

Martin Ender
źródło