Zrób proste opakowanie słowa

22

(Uwaga: to moje pierwsze pytanie w golfa z kodem, ale o ile wiem, nikt inny tego nie zrobił, więc powinienem być dobry.)

Twoim zadaniem jest stworzenie programu lub funkcji, która pobierze ciąg znaków si liczbę całkowitą n, i zwróci lub wyprowadzi tekst zawinięty w wiele wierszy. Każde słowo musi być w całości na linii; tzn. brak słów podzielonych na środku. Każda linia nie może być dłuższa niż nznaki, a każda linia musi zawierać jak najwięcej słów.

Przykład:

s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget erat lectus. Morbi mi mi, fringilla sed suscipit ullamcorper, tristique at mauris. Morbi non commodo nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed at iaculis mauris. Praesent a sem augue. Nulla lectus sapien, auctor nec pharetra eu, tincidunt ac diam. Sed ligula arcu, aliquam quis velit aliquam, dictum varius erat." 
n = 50

output:
Lorem ipsum dolor sit amet, consectetur adipiscing
elit. Sed eget erat lectus. Morbi mi mi, fringilla
sed suscipit ullamcorper, tristique at mauris.
Morbi non commodo nibh. Pellentesque habitant
morbi tristique senectus et netus et malesuada
fames ac turpis egestas. Sed at iaculis mauris.
Praesent a sem augue. Nulla lectus sapien, auctor
nec pharetra eu, tincidunt ac diam. Sed ligula
arcu, aliquam quis velit aliquam, dictum varius
erat.

Twój wynik może być tablicą ciągów lub pojedynczym ciągiem z podziałem wierszy. Możesz również założyć, że żadne słowa nie będą dłuższe niż n, więc nie martw się o radzenie sobie z dziwnymi przypadkami.

Obowiązują standardowe zasady we / wy, a standardowe luki są zabronione. Końcowe spacje są dozwolone.

Ponieważ jest to , wygrywa krótkie rozwiązanie w bajtach.

Oto przykładowy program w Pythonie, który działałby.

ATMunn
źródło
3
n jest maksymalną długością linii? czy długość, którą musimy osiągnąć przed przełamaniem linii?
David
1
@david, czy liczba linii?
Peter Taylor,
1
28 bajtów Python, czy to istotne?
David
3
nto maksymalna długość linii, przepraszam, że to nie było jasne. Wyjaśnię. Ponadto zasady zostały zaktualizowane, więc prosty podział nie działa.
ATMunn

Odpowiedzi:

7

Python 2 , 26 bajtów

from textwrap import*
fill

Wypróbuj online!

Meh ... wbudowane są nudne ... zamiast tego, tutaj masz ładne 87-bajtowe rozwiązanie:

s,n=input()
x=''
for i in s.split():c=n<len(x+i);exec'print x'*c;x=x*-~-c+i+' '
print x

Wypróbuj online!

Generuje końcowe spacje.

Erik the Outgolfer
źródło
5

PHP , 8 bajtów

Co prawda nie jest to najbardziej oryginalne rozwiązanie, ale PHP ma natywną funkcję, która idealnie pasuje do twoich wymagań!

wordwrap:

string wordwrap ( string $str [, int $width = 75 [, string $break = "\n" [, bool $cut = FALSE ]]] )

Zawija ciąg znaków na określoną liczbę znaków przy użyciu znaku przerwania łańcucha.

Użyj tak:

$str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget erat lectus. Morbi mi mi, fringilla sed suscipit ullamcorper, tristique at mauris. Morbi non commodo nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed at iaculis mauris. Praesent a sem augue. Nulla lectus sapien, auctor nec pharetra eu, tincidunt ac diam. Sed ligula arcu, aliquam quis velit aliquam, dictum varius erat.";
echo wordwrap($str, 50);

Lub wypróbuj online!

Davіd
źródło
5

JavaScript (ES6),  75 73  72 bajty

Pobiera dane wejściowe jako (string)(n).

s=>n=>s.split` `.map(w=>r=(u=r?r+' '+w:w)[n]?(o+=r+`
`,w):u,o=r='')&&o+r

Wypróbuj online!

Zmienne

Sformatowane dane wyjściowe są przechowywane w o (na zielono poniżej).

Zaktualizowana linia u jest zdefiniowana jako konkatenacja:

  • bieżąca linia r (czarna poniżej)
  • spacja, jeśli r nie jest puste lub nic innego (na pomarańczowo poniżej)
  • nowe słowo w (na niebiesko poniżej)

Musimy wstawić podział linii za każdym razem, gdy ustawiony jest n ty znak u (indeksowane 0, na czerwono poniżej).

Przykład

n=16 , as = "lorem ipsum ból"

Dodanie „LOREM”:

0001020304050607080910111213141516LOREM

Dodanie „IPSUM”:

0001020304050607080910111213141516LOREMIPSUM

Dodanie „DOLOR”:

0001020304050607080910111213141516LOREMIPSUMDOLOR

0001020304050607080910111213141516LOREMIPSUMDOLOR

Arnauld
źródło
Końcowe spacje są dozwolone. może r+w+' '?
l4m2
5

Perl 6 , 46 29 bajtów

{;*.comb(/.**{1..$_}[\s|$]/)}

Wypróbuj online!

Rozwiązanie oparte na regeksie, które pobiera dane wejściowe curry, polub f(n)(s)i zwraca listę linii. Każda linia oprócz ostatniej ma końcowe białe znaki

Wyjaśnienie:

{;*                         }   # Anonymous code block that returns a Whatever lambda
   .comb(/                /)    # Split the string by
          .**{1..$_}            # Up to n characters
                    [\s|$]      # Terminated by a whitespace char or the end of the string
Jo King
źródło
4

Vim, 15 bajtów / naciśnięć klawiszy

DJ:se tw=<C-r>"
gq_

Pytanie o formatowanie tekstu? Znam tylko narzędzie do pracy! I ma nawet moje imię w pierwszych dwóch naciśnięciach klawiszy: D

<C-r>środki ctrl-r.

To może kiedykolwiek tak nieznacznie krótszy w V , ale wolę odpowiadając w wanilia vim za odpowiedzi, które naprawdę pokazać się jak zwięzły vim może być na prawej wyzwanie. Różnica jest tak niewielka.

Może to być również następujące dla 15 bajtów:

:se tw=<C-r><C-w>
ddgq_

Wypróbuj online!

DJMcMayhem
źródło
1
Objaśnienie:: DJ:Ten program został stworzony przez DJ'a, naszego ulubionego kota z brylantem na szyi. [...]
Erik the Outgolfer,
4

R , 36 27 bajtów

R ma to jako funkcję wbudowaną ( strwrap), zwracamy wektor linii podziału.

function(s,n)strwrap(s,n+1)

Wypróbuj online!

J.Doe
źródło
1
Tak, powinno być dozwolone. Tablice linii są dozwolone, więc nie rozumiem, dlaczego miałoby być inaczej.
ATMunn
4

Haskell , 70 bajtów

s!n|length s<=n=[s]|(t,_:d)<-splitAt(until((<'!').(s!!))pred n)s=t:d!n
Lynn
źródło
3

Python 2 , 74 bajty

s,n=input()
while s:i=n;exec"i-=' '<(s+' '*n)[i];"*n;print s[:i];s=s[i+1:]

Wypróbuj online!

Lynn
źródło
3

Java (JDK) , 46 44 bajtów

Zasadniczo czyste wyrażenie regularne w Javie, prawie na pewno najkrótsze, jakie napisałem.

Pozdrawiam Kevina za to, że pomógł jeszcze bardziej ograniczyć bajty wyrażenia regularnego!

n->s->s.replaceAll(".{1,"+n+"}( |$)","$0\n")

Wypróbuj online!

Za pomocą curry lamdba tworzy wyrażenie regularne, które zachłannie dopasowuje do nznaków, po których następuje spacja lub koniec łańcucha. Następnie zamienia te postacie na siebie, po których następuje nowa linia.

Luke Stevens
źródło
@KevinCruijssen [ $]faktycznie po prostu dopasowuje spację lub, $jeśli dobrze pamiętam, zamiast końca łańcucha. Wydaje się jednak, że działa, więc wygląda na to, że można po prostu zagrać w golfa w jednym miejscu na jeszcze mniej bajtów.
Luke Stevens,
Ach, to rzeczywiście może być tylko spacja, ponieważ dodajesz znaki nowej linii i nie musisz dodawać dodatkowej nowej linii na końcu.
Kevin Cruijssen,
1
Możesz zagrać w golfa jeszcze o 2 bajty, usuwając nawias w wyrażeniu regularnym, i użyj $0zamiast $1.
Kevin Cruijssen,
@KevinCruijssen Nice one! To tylko wstyd, który replaceAlljest tak gadatliwy!
Luke Stevens,
2
Dla mnie jest to niewłaściwe, pojawi się, jeśli zmodyfikuję łacińskie zdanie ćwiczenia w taki sposób, aby kończyło się ono na „... dictum varius abc erat”. Po litera c pojawia się niepotrzebna nowa linia ...
RosLuP,
2

Mathematica, 16 bajtów

InsertLinebreaks

Wbudowana funkcja. Pobiera ciąg znaków i liczbę całkowitą jako dane wejściowe i zwraca ciąg znaków jako dane wyjściowe.

InsertLinebreaks["string", n]
 wstawia znaki nowej linii, aby linia nie była dłuższa niż n znaków.

LegionMammal978
źródło
2

PowerShell, 40 83 bajtów

Walizka testowa z n=80dodanym.

param($s,$n)$s-split' '|%{if(($o+$_|% le*)-lt$n){$o+=' '*!!$o+$_}else{$o;$o=$_}}
$o

Skrypt testowy:

$f = {

param($s,$n)$s-split' '|%{if(($o+$_|% le*)-lt$n){$o+=' '*!!$o+$_}else{$o;$o=$_}}
$o

}

@(
,(50, "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget erat lectus. Morbi mi mi, fringilla sed suscipit ullamcorper, tristique at mauris. Morbi non commodo nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed at iaculis mauris. Praesent a sem augue. Nulla lectus sapien, auctor nec pharetra eu, tincidunt ac diam. Sed ligula arcu, aliquam quis velit aliquam, dictum varius erat.",
"Lorem ipsum dolor sit amet, consectetur adipiscing",
"elit. Sed eget erat lectus. Morbi mi mi, fringilla",
"sed suscipit ullamcorper, tristique at mauris.",
"Morbi non commodo nibh. Pellentesque habitant",
"morbi tristique senectus et netus et malesuada",
"fames ac turpis egestas. Sed at iaculis mauris.",
"Praesent a sem augue. Nulla lectus sapien, auctor",
"nec pharetra eu, tincidunt ac diam. Sed ligula",
"arcu, aliquam quis velit aliquam, dictum varius",
"erat.")
,(80, "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget erat lectus. Morbi mi mi, fringilla sed suscipit ullamcorper, tristique at mauris. Morbi non commodo nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed at iaculis mauris. Praesent a sem augue. Nulla lectus sapien, auctor nec pharetra eu, tincidunt ac diam. Sed ligula arcu, aliquam quis velit aliquam, dictum varius erat.",
"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget erat lectus.",
"Morbi mi mi, fringilla sed suscipit ullamcorper, tristique at mauris. Morbi non",
"commodo nibh. Pellentesque habitant morbi tristique senectus et netus et",
"malesuada fames ac turpis egestas. Sed at iaculis mauris. Praesent a sem augue.",
"Nulla lectus sapien, auctor nec pharetra eu, tincidunt ac diam. Sed ligula arcu,",
"aliquam quis velit aliquam, dictum varius erat.")
) | %{
    $n,$s,$expected = $_
    $result = &$f $s $n
    "$result"-eq"$expected"
    # $result   # uncomment this line to dispaly a result
}

Wydajność:

True
True
mazzy
źródło
Dzięki. Fałszywe trójskładnikowe jest wyrazem. Skrypt ten zawiera ukryte returnw elseczęści oraz oświadczenie w thenczęści.
mazzy
2

C (gcc) , 68 bajtów

i;b(s,n,l)char*s,*l;{for(i=n;*++s;i--||(i=l-s+n,*l=10))l=*s-32?l:s;}

Wypróbuj online!

Dzięki pułapowi cat zaoszczędź 2 bajty, przenosząc globalnie char*ldo parametru.

tsh
źródło
2

Japt , 20 bajtów

¸rÈ+Yi[X·ÌY]¸Ê>V?R:S

Wypróbuj online!

Dzięki Bubblerowi i Kudłatemu za pomoc

Wyjaśnienie:

¸                       #Split into words
 r                      #For each word, add them to the output in this way:
     i                  # Choose a character using this process:
       X·Ì              #  Get the last line of the output
          Y             #  And the current word
      [    ]¸           #  Join them with a space
             Ê>V?       #  If the resulting line is greater than the allowed length:
                ?R      #   Choose "/n" (newline)
                  :S    #  Otherwise choose " " (space)
     i                  # Add the chosen character to the output
  È+Y                   # Add the current word to the output
Kamil Drakari
źródło
24 bajty z [X,Y].join(...).
Bubbler,
1
20 bajtów
Kudłaty
1

Retina 0.8.2 , 37 bajtów

.+$
$*
!`(?=\S.*¶(1)+)(?<-1>.)+(?=\s)

Wypróbuj online! Trwa si nna osobnych liniach. Wyjaśnienie:

.+$
$*

Konwertuj nna unary.

(?=\S.*¶(1)+)(?<-1>.)+(?=\s)

Dopasuj spacje, a następnie spójrz ni policz je jako $#1. Następnie wróć i użyj grupy równoważącej, aby dopasować do nznaków, a następnie spacji.

!`

Wypisuj dopasowania jako listę linii.

Neil
źródło
Czy w Retinie jest sposób na umieszczenie pierwszego wejścia w wyrażeniu regularnym, którego używamy z drugim wejściem? Więc coś takiego: .{1,50} i$0¶ , ale gdzie 50zamiast tego jest odbierany jako dane wejściowe?
Kevin Cruijssen,
@KevinCruijssen W Retina 1 możesz prawdopodobnie użyć etapu Eval, aby uzyskać podobny wynik, ale to nudne, więc nie zawracałem sobie głowy.
Neil,
1

Węgiel drzewny , 19 bajtów

Nθ←F⪪S «¿‹⁺LιⅈθM→⸿ι

Wypróbuj online! Link jest do pełnej wersji kodu. Pobiera dane wejściowe ni soddzielne linie. Wyjaśnienie:

Nθ

Wejście n.

Przesuń kursor w lewo o jeden kwadrat, aby zrównoważyć prawy ruch od pierwszej iteracji pętli.

F⪪S «

Podziel ciąg znaków na spacje i zapętlaj słowa.

¿‹⁺Lιⅈθ

Oblicz, czy następne słowo osiągnie prawą krawędź.

M→

Jeśli nie, to przesuń jeden kwadrat w prawo.

⸿

Jeśli to rozpocznie nową linię.

ι

Wypisz słowo.

Neil
źródło
1

Czerwony , 125, 117, 114 112 bajtów

func[s n][d: 0 parse s[any[to" "p:" "opt[[to" "| to end]q:(if(-1 - d + index? q)> n[p/1: #"^/"d: index? p])]]]s]

Wypróbuj online!

Galen Iwanow
źródło
1

05AB1E , 18 bajtów

õs#vDy«g²›i,}yðJ}?

Wypróbuj online.

Wyjaśnienie:

õ                   # Push an empty string "" to the stack
 s                  # Swap to take the (implicit) string input
  #                 # Split it by spaces
   v            }   # For-each `y` over the words:
    D               #  Duplicate the top of the stack
                    #  (which is the empty string in the very first iteration)
     y«             #  Append the current word `y`
       g            #  Get its length
        ²›i }       #  If its lengthy is larger than the second input:
           ,        #   Pop and output the current duplicated value with trailing newline
             yð     #  Push the word `y` and a space " "
               J    #  Join the entire stack together
                 ?  # After the loop, output the last part as well (without newline)
Kevin Cruijssen
źródło
1

Java 8, 135 bajtów

n->s->{String r="",S[]=s.split(" "),t=r;for(int i=0;i<S.length;)if((t+S[i]).length()>n){r+=t+"\n";t="";}else t+=S[i++]+" ";return r+t;}

Wypróbuj online.

Wyjaśnienie:

n->s->{                      // Method with integer & String parameters and String return
  String r="",               //  Result-String, starting empty
         S[]=s.split(" "),   //  Input-String split by spaces
         t=r;                //  Temp-String, starting empty as well
  for(int i=0;i<S.length;)   //  Loop `i` in the range [0, amount_of_words):
    if((t+S[i]).length()>n){ //   If `t` and the word are larger than the integer input:
      r+=t+"\n";             //    Add `t` and a newline to the result
      t="";}                 //    And reset `t` to an empty String
     else                    //   Else:
       t+=S[i++]+" ";        //    Append the word and a space to `t`
                             //    (and then increase `i` by 1 with `i++` for the next word
                             //     of the next iteration)
  return r+t;}               //  Return the result-String appended with `t` as result
Kevin Cruijssen
źródło
1

JavaScript, 40 bytes

s=>n=>eval(`s.match(/.{1,${n}}( |$)/g)`)

Try it online!

tsh
źródło
Fail at the end
l4m2
@l4m2 fixed....
tsh
1

APL (Dyalog Unicode), 14 bytesSBCS

Infix function; left argument is n, right argument is n.

CY'dfns'wrap

Try it online!

⎕CYcopy in the dfns library

 then

wrap[c] use the wrap[n] function

[c] code of that function
[n] notes for that function


Golfed version of wrap, 59 bytesSBCS

{⍺≥≢⍵:⍵⋄(t↑⍵),2↓⎕TC,⍺∇⍵↓⍨t+b⊃⍨t←⊃⌽⍺,g/⍨⍺≥g←⍸(⍺+1)↑b' '=⍵}

Try it online!

{} dfn; is left argument (width), is right argument (string)

≢⍵ tally (number of characters) of string

⍺≥: Jeśli szerokość jest większa lub równa, to:

   zwraca ciąg

 Inaczej:

  ' '=⍵ Maska boolowska, w której puste są równe ciągowi znaków

  b← Przechowywać w b(na b lanks)

  ()↑ Weź z tego następującą liczbę elementów:

   ⍺+1 jeden więcej niż szerokość

  I ndices gdzie prawda

  g← Przechowywać w g(na g APS)

  ⍺≥ Maska boolowska, której szerokość jest większa lub równa

  g/⍨ przefiltruj przez to indeksy luk

  ⍺, dodaj to do szerokości

  ⊃⌽ wybierz ostatni element (podświetlony wybierz pierwszy z odwróconego)

  t← Przechowywać w t(dla t ake)

  b⊃⍨ używać, aby podnieść element z maską b lanks

  t+ dodaj to do t

  ⍵↓⍨ upuść tyle znaków z ciągu

  ⍺∇ powróćcie do tego z tym samym lewym argumentem

  ⎕TC, append that to the list of terminal control characters (8:HT, 10:NL, 13:CR)

  2↓ drop the first two character from that (leaving just a leading 13:CR)

  (), append that to the following:

   t↑⍵ the first t characters of the string

Adám
źródło
0

Thanks to @Erik the Outgolfer, a golfed version :

Python 3, 94 bytes

def f(t,n):
 while t:i=n+(t[min(len(t)-1,n)]==" "or-t[n-1::-1].find(' '));print(t[:i]);t=t[i:]

Try it online!

# Python 3, 130 bytes

def f(t,n):
 l=[]
 while len(t):
  i=(n-t[:n][::-1].find(' '),n+1)[t[min(len(t)-1,n)]==" "]
  l.append(t[:i])
  t=t[i::]
 return l

Try it online!

Not so golfed version...

david
źródło
1
Some golfs. (prints to STDOUT, doesn't return).
Erik the Outgolfer
0

JavaScript + HTML + CSS, 117 64 bytes

-53 bytes courtesy of @Neil

n=50
s="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget erat lectus. Morbi mi mi, fringilla sed suscipit ullamcorper, tristique at mauris. Morbi non commodo nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed at iaculis mauris. Praesent a sem augue. Nulla lectus sapien, auctor nec pharetra eu, tincidunt ac diam. Sed ligula arcu, aliquam quis velit aliquam, dictum varius erat."
f=(n,s)=>document.body.innerHTML+=`<tt><p style=width:${n}ch>${s}`
f(n,s)

guest271314
źródło
1
At least in my browser you can cut this down to (n,s)=>document.body.innerHTML+=`<p style=width:${n}ch><tt>${s}</tt></p>` for 74 bytes. If you're willing to dig out old versions of Firefox you can save another 8 bytes with (n,s)=>document.body.innerHTML+=`<pre wrap width=${n}>${s}</pre>` .
Neil
@Neil Nice use of ch units. Firefox 65 computes 50ch as 500px; Chromium 70 computes 50ch as 400px
guest271314
This answer is wrong. elit. Sed eget erat lectus. Morbi mi mi, fringilla sed (2nd line) is more than 50 characters. I'm using the newest Chrome.
mbomb007
I was able to tweak my original suggestion to work in Chrome by putting the <p> inside the <tt>.
Neil
0

Jelly, 12 bytes

ḲŒṖK€€ḣ€ƑƇṪY

Try it online!

Unfortunately, this is too slow to work for the provided test case in under a minute over TIO.

Erik the Outgolfer
źródło
0

C# (.NET Core), 162 bytes

string[]t(string n,int a){var g="";for(int i=0;i++<Math.Floor((double)n.Length/a);)g+=$"^.{{{i*a-1}}}|";return Regex.Split(n,$@"(?n)(?<=({g.Trim('|')})\S*)\s");}}

This function uses a regex which matches the closest whitespace that is near the nth or multiple of nth character and splits the string based on it.

Try it online!

The TIO link is a full program, and the function has a static keyword so the function can be called from main.

Test Regex

Embodiment of Ignorance
źródło
This doesn't give the right output for the test case - some lines are longer than 50 characters. You want "before" not "near", and also the splitting at one point must depend on where it was split earlier.
Ørjan Johansen
0

C# (Visual C# Interactive Compiler), 78 bytes

s=>n=>System.Text.RegularExpressions.Regex.Replace(s,".{1,"+n+"}( |$)","$0\n")

Try it online!

Credit goes to @LukeStevens for coming up with the Java version... Apparently .NET makes you import the RegularExpressions namespace in order to do a replace :(

Here is my original version that splits on the space character and uses LINQ to join them back together:

C# (Visual C# Interactive Compiler), 91 bytes

s=>n=>s.Split(' ').Aggregate((a,w)=>a+(a.Length-a.LastIndexOf('\n')+w.Length>n?'\n':' ')+w)

Try it online!

dana
źródło
0

Dart, 112 bytes

f(s,n){var l=[''];s.split(' ').forEach((w){if((l.last+w).length<=n)l.last+=w+' ';else l.add(w+' ');});return l;}

Try it online!

Elcan
źródło
0

APL(NARS), 48 chars, 96 bytes

{⊃⍵{⍺≥≢⍵:⊂⍵⋄k←1+⍺-' '⍳⍨⌽r←⍺↑⍵⋄(⊂k↑r),⍺∇k↓⍵}⍨⍺+1}

test:

  f←{⊃⍵{⍺≥≢⍵:⊂⍵⋄k←1+⍺-' '⍳⍨⌽r←⍺↑⍵⋄(⊂k↑r),⍺∇k↓⍵}⍨⍺+1}
  s←"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed eget erat lectus. Morbi mi mi, fringilla sed suscipit ullamcorper, tristique at mauris. Morbi non commodo nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed at iaculis mauris. Praesent a sem augue. Nulla lectus sapien, auctor nec pharetra eu, tincidunt ac diam. Sed ligula arcu, aliquam quis velit aliquam, dictum varius erat."
  50 f s
Lorem ipsum dolor sit amet, consectetur adipiscing 
elit. Sed eget erat lectus. Morbi mi mi, fringilla 
sed suscipit ullamcorper, tristique at mauris.     
Morbi non commodo nibh. Pellentesque habitant      
morbi tristique senectus et netus et malesuada     
fames ac turpis egestas. Sed at iaculis mauris.    
Praesent a sem augue. Nulla lectus sapien, auctor  
nec pharetra eu, tincidunt ac diam. Sed ligula     
arcu, aliquam quis velit aliquam, dictum varius    
erat.                                              
RosLuP
źródło
I don't know in "{⊃⍵{⍺≥≢⍵:⊂⍵⋄..." If it is right ≥ or it is right there >...
RosLuP
0

C, 63 bytes

b(a,n)char*a;{while(strlen(a)>n){for(a+=n;*a-32;--a);*a++=10;}}

The function of this exercise b(a,n) would break the line "a" as exercise said, in the way not change its length (if we see the result as one string) because change some spaces in \n or new line in place. The input string "a" should have no \n character too in it for b() function (it could have \n in input string for bs())

b(a,n) function would be ok only because the restriction of this exercise, that impose each word of "a" string has length < n if this is not true, that function can go
to one infinite loop...(very wrong in my way of see so i copy too the function more good because in that case would return -1 and not would go to one infinite loop; it is bs(a,n) below)I not exclude both functions are bugged...

#define R(x,y) if(x)return y
#define U unsigned
U bs(char*a,U n)
{U c,q,r=1,i,j;
 R(!a||n<1||n++>0xFFFF,-1);
 for(j=c=i=0;;++i,++c)
    {R(i==-1,-1);q=a[i];
     if(q==10)goto l;
     if(c>=n){R(i-j>n,-1);a[i=j]=10;l:c=-1;++r;}
     R(!q,r);
     if(q==32)j=i;
    }
}

result of b() passed on one function that add line lenght each line

Lorem ipsum dolor sit amet, consectetur adipiscing [50]
elit. Sed eget erat lectus. Morbi mi mi, fringilla [50]
sed suscipit ullamcorper, tristique at mauris. [46]
Morbi non commodo nibh. Pellentesque habitant [45]
morbi tristique senectus et netus et malesuada [46]
fames ac turpis egestas. Sed at iaculis mauris. [47]
Praesent a sem augue. Nulla lectus sapien, auctor [49]
nec pharetra eu, tincidunt ac diam. Sed ligula [46]
arcu, aliquam quis velit aliquam, dictum varius [47]
erat. [5]
RosLuP
źródło
@ceilingcat ok, above code would make in consideration the \n too... one bug I found with the code was that the last line was not correctly print... why do you not write your C answer as other? It would win on mine because it is more short... for say the true I use the first line(or statement ";") for the check of input only because for me input has to be checked even if that is a little more long; I unsuccessful try to write the function in APL...
RosLuP
@ceilingcat in the last answer, seen that question not say if the input string have or not have to have in it '\n' char and seen that example not has '\n' I suppose input string has no new line character in it...
RosLuP
Only 83 ... Yes I have to see if I gain 3 chars using old function definition...
RosLuP
Just 81 .... .... ....
RosLuP
1
60 bytes
ceilingcat