Machen Sie einen einfachen Zeilenumbruch


22

(Hinweis: Dies ist meine allererste Code-Golf-Frage, aber soweit ich das beurteilen kann, hat niemand anderes genau das getan, also sollte ich gut sein.)

Ihre Aufgabe ist es, ein Programm oder eine Funktion zu erstellen, die eine Zeichenfolge sund eine Ganzzahl enthältn und den in mehrere Zeilen eingeschlossenen Text zurückgibt oder ausgibt. Jedes Wort muss vollständig in einer Zeile stehen. dh keine Wörter in der Mitte geteilt. Jede Zeile darf nicht länger als nZeichen sein, und Sie müssen so viele Wörter wie möglich in jede Zeile einfügen.

Beispiel:

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.

Ihre Ausgabe kann ein Array von Zeichenfolgen oder eine einzelne Zeichenfolge mit Zeilenumbrüchen sein. Sie können auch davon ausgehen, dass keine Wörter länger sind alsn , machen Sie sich also keine Sorgen um seltsame Fälle.

Es gelten Standard-E / A-Regeln, und Standard-Regelungslücken sind nicht zulässig. Nachgestellte Leerzeichen sind erlaubt.

Da dies , gewinnt die Shortes-Lösung in Bytes.

Hier ist ein Beispielprogramm in Python, das funktionieren würde.



3
n ist die maximale Zeilenlänge? oder die länge die wir vor dem linienbruch erreichen müssen?
David

1
@ David, oder die Anzahl der Zeilen?
Peter Taylor

1
28 Bytes Python ist es relevant?
David

3
nist die maximale Zeilenlänge, sorry dass das nicht klar war. Ich werde klären. Außerdem wurden die Regeln jetzt aktualisiert, sodass eine einfache Aufteilung nicht funktioniert.
ATMunn

Antworten:



5

PHP , 8 Bytes

Zugegeben, nicht die originellste Lösung, aber PHP hat eine native Funktion, die perfekt zu Ihren Anforderungen passt!

wordwrap:

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

Bricht einen String mit einem String-Umbruchzeichen in eine bestimmte Anzahl von Zeichen um.

Verwenden Sie wie folgt:

$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);

Oder versuchen Sie es online!


5

JavaScript (ES6),  75 73  72 Byte

Übernimmt die Eingabe als (string)(n).

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

Probieren Sie es online!

Variablen

Die formatierte Ausgabe wird in O (unten in grün) gespeichert .

Die aktualisierte Zeile u ist definiert als die Verkettung von:

  • die aktuelle Zeile r (in schwarz unten)
  • ein Leerzeichen, wenn r nicht leer ist oder nichts anderes (in orange unten)
  • das neue Wort w (in blau unten)

Wir müssen einen Zeilenumbruch einfügen, wenn das n te Zeichen von u gesetzt ist (0-indiziert, unten rot).

Beispiel

n=16 unds = "LOREM IPSUM DOLOR"

Hinzufügen von "LOREM":

0001020304050607080910111213141516LOREM

Hinzufügen von "IPSUM":

0001020304050607080910111213141516LOREMichPSUM

Hinzufügen von "DOLOR":

0001020304050607080910111213141516LOREMichPSUMDOLOR

0001020304050607080910111213141516LOREMichPSUMDOLOR


Nachgestellte Leerzeichen sind erlaubt. vielleicht r+w+' '?
14.

5

Perl 6 , 46 29 Bytes

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

Probieren Sie es online!

Regex-basierte Lösung, die Input wie Curry nimmt f(n)(s) und eine Liste von Zeilen zurückgibt. Jede Zeile mit Ausnahme der letzten hat ein Leerzeichen am Ende

Erläuterung:

{;*                         }   # 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

4

Vim, 15 Bytes / Tastenanschläge

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

Eine Frage zur Textformatierung? Ich kenne nur das Werkzeug für den Job! Und es hat sogar meinen Namen in den ersten beiden Tastenanschlägen: D

<C-r> meint ctrl-r .

Dies könnte jemals so etwas kürzer in V , aber ich ziehe in Vanille vim für Antworten zu beantworten , die wirklich zeigen , wie präzise vim für die richtige Herausforderung sein kann. Und der Unterschied ist sowieso so gering.

Dies kann auch für 15 Bytes der Fall sein:

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

Probieren Sie es online!


1
Erklärung:: DJ:Dieses Programm wurde von DJ gemacht, unserer Lieblingskatze mit einem Diamanten um den Hals. [...]
Erik der Outgolfer

4

R , 36 27 Bytes

R hat dies als eingebaute ( strwrap), wir geben einen Vektor von Trennlinien zurück.

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

Probieren Sie es online!


1
Ja, das sollte erlaubt sein. Zeilenreihen sind zulässig, daher verstehe ich nicht, warum dies anders wäre.
ATMunn

4

Haskell , 70 Bytes

s!n|length s<=n=[s]|(t,_:d)<-splitAt(until((<'!').(s!!))pred n)s=t:d!n


3

Java (JDK) , 46 44 Bytes

Grundsätzlich eine reine Regex-Lösung in Java, mit ziemlicher Sicherheit die kürzeste, die ich geschrieben habe.

Ein Hoch auf Kevin, der geholfen hat, die Bytes im Regex noch weiter zu reduzieren!

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

Probieren Sie es online!

Mit einem Curry-Lamdba wird ein regulärer Ausdruck erstellt, der gierig mit nZeichen übereinstimmt, gefolgt von einem Leerzeichen oder einem Ende der Zeichenfolge. Diese Zeichen werden dann durch sich selbst ersetzt, gefolgt von einer neuen Zeile.


@ KevinCruijssen entspricht [ $]eigentlich nur ein Leerzeichen oder $wenn ich mich richtig erinnere, eher als das Ende der Zeichenfolge. Es scheint jedoch zu funktionieren, so dass es so aussieht, als ob es für noch weniger Bytes auf einen einzigen Platz reduziert werden kann.
Luke Stevens

Ah, es kann in der Tat nur ein Leerzeichen sein, da Sie Zeilenumbrüche hinzufügen und am Ende keine zusätzlichen Zeilenumbrüche hinzufügen müssen.
Kevin Cruijssen

1
Sie können 2 weitere Bytes golfen, indem Sie die Klammern in der Regex entfernen und $0anstelle von verwenden $1.
Kevin Cruijssen

@ KevinCruijssen Schöne! Es ist nur eine Schande, replaceAlldie so wortreich ist!
Luke Stevens

2
Für mich ist es falsch, wenn ich den lateinischen Ausdruck der Übung so ändere, dass er mit "... dictum varius abc erat" endet. Es gibt eine unnötige neue Zeile nach dem Buchstaben c ...
RosLuP

2

Mathematica, 16 Bytes

InsertLinebreaks

Eingebaute Funktion. Nimmt eine Zeichenfolge und eine Ganzzahl als Eingabe und gibt eine Zeichenfolge als Ausgabe zurück.

InsertLinebreaks["string", n]
 Fügt Zeilenumbrüche ein, um keine Zeile länger als n Zeichen zu machen.


2

Power Shell, 40 83 Bytes

Testfall mit n=80hinzugefügt.

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

Testskript:

$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
}

Ausgabe:

True
True


Vielen Dank. Der gefälschte Dreiklang ist ein Ausdruck. Dieses Skript enthält ein implizites Element returnim elseTeil und eine Anweisung im thenTeil.
mazzy


2

Japt , 20 Bytes

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

Probieren Sie es online!

Vielen Dank an Bubbler und Shaggy für ihre Hilfe

Erläuterung:

¸                       #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

24 Bytes mit [X,Y].join(...).
Bubbler


1

Retina 0.8.2 , 37 Bytes

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

Probieren Sie es online! Nimmt sund nin separaten Zeilen. Erläuterung:

.+$
$*

In Unary konvertieren n.

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

Passen Sie Nicht-Leerzeichen an, schauen Sie dann nach vorne nund zählen Sie es als $#1. Gehen Sie dann zurück und verwenden Sie eine Bilanzgruppe, um nZeichen gefolgt von Leerzeichen zuzuordnen.

!`

Die Übereinstimmungen als Liste von Zeilen ausgeben.


Gibt es in Retina eine Möglichkeit, die erste Eingabe in eine Regex zu setzen, die wir mit der zweiten Eingabe verwenden? Also so etwas wie: .{1,50} und$0¶ , aber wo 50wird stattdessen als Eingabe empfangen?
Kevin Cruijssen

@KevinCruijssen In Retina 1 können Sie wahrscheinlich eine Eval-Stufe verwenden, um ein ähnliches Ergebnis zu erzielen, aber das ist langweilig, also habe ich mich nicht darum gekümmert.
Neil

1

Holzkohle , 19 Bytes

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

Probieren Sie es online! Link ist eine ausführliche Version des Codes. Übernimmt die Eingabe von nund sin separaten Zeilen. Erläuterung:

Nθ

Eingabe n.

Bewegen Sie den Cursor ein Feld nach links, um die Bewegung nach rechts ab der ersten Iteration der Schleife auszugleichen.

F⪪S «

Teilen Sie die Zeichenfolge auf Leerzeichen und ziehen Sie eine Schleife über die Wörter.

¿‹⁺Lιⅈθ

Berechnen Sie, ob das nächste Wort die rechte Kante erreicht.

M→

Wenn dies nicht der Fall ist, bewegen Sie sich ein Feld nach rechts.

⸿

Wenn dies der Fall ist, wird eine neue Zeile gestartet.

ι

Gib das Wort aus.



1

05AB1E , 18 Bytes

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

Probieren Sie es online aus.

Erläuterung:

õ                   # 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)

1

Java 8, 135 Bytes

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;}

Probieren Sie es online aus.

Erläuterung:

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


1

APL (Dyalog Unicode) , 14 Byte SBCS

Infix-Funktion; linkes Argument ist n, rechtes Argument ist n.

CY'dfns'wrap

Probieren Sie es online!

⎕CYc op y in der dfns-bibliothek

 dann

wrap[c]  benutze die wrap [n] Funktion

[c]  Code dieser Funktion
[n]  Notizen für diese Funktion


Golf-Version von wrap59 Bytes SBCS

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

Probieren Sie es online!

{} Dfn; ist linkes Argument (Breite), ist rechtes Argument (Zeichenkette)

≢⍵ Tally (Anzahl der Zeichen) der Zeichenfolge

⍺≥: Wenn die Breite größer oder gleich ist, dann:

   Gib den String zurück

 Andernfalls:

  ' '=⍵ Boolesche Maske, bei der Leerzeichen der Zeichenfolge entsprechen

  b← Speichern in b(für B Lanks)

  ()↑ Entnehmen Sie daraus folgende Anzahl von Elementen:

   ⍺+1 einer mehr als die Breite

  Ich erkenne, wo wahr

  g← store in g(für g aps)

  ⍺≥ Boolesche Maske, bei der die Breite größer oder gleich dieser ist

  g/⍨ filtern Sie die Lückenindizes danach

  ⍺, Hänge das an die Breite an

  ⊃⌽ wähle das letzte Element davon (wähle das erste der umgekehrten)

  t← Speichern in t(für t ake)

  b⊃⍨ Verwenden Sie dies, um ein Element aus der Maske von b Lanks auszuwählen

  t+ füge das hinzu t

  ⍵↓⍨ lösche so viele Zeichen aus der Zeichenkette

  ⍺∇ Verwenden Sie dazu dasselbe Argument für left left

  ⎕TC, append , daß zu der Liste der T erminal c ontrol Zeichen (8: HT, 10: NL, 13: CR)

  2↓ Löschen Sie die ersten beiden Zeichen (lassen Sie nur eine führende 13: CR übrig)

  (), Hängen Sie das an:

   t↑⍵ die ersten tZeichen der Zeichenfolge



0

JavaScript + HTML + CSS, 117 64 Byte

-53 Bytes mit freundlicher Genehmigung von @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)


1
Zumindest in meinem Browser kann man das auf (n,s)=>document.body.innerHTML+=`<p style=width:${n}ch><tt>${s}</tt></p>` 74 Bytes reduzieren . Wenn Sie alte Versionen von Firefox ausgraben möchten, können Sie weitere 8 Bytes mit speichern (n,s)=>document.body.innerHTML+=`<pre wrap width=${n}>${s}</pre>` .
Neil

@ Neil Nizza Verwendung von chEinheiten. Firefox 65 berechnet 50chals 500px; Chromium 70 berechnet 50chals400px
guest271314

Diese Antwort ist falsch. elit. Sed eget erat lectus. Morbi mi mi, fringilla sed(2. Zeile) besteht aus mehr als 50 Zeichen. Ich verwende das neueste Chrome.
mbomb007

Ich konnte meinen ursprünglichen Vorschlag, in Chrome zu arbeiten, optimieren, indem ich <p>die <tt>.
Neil



0

C # (.NET Core) , 162 Byte

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");}}

Diese Funktion verwendet einen regulären Ausdruck, der mit dem nächstgelegenen Leerzeichen in der Nähe des n-ten oder vielfachen des n-ten Zeichens übereinstimmt und die darauf basierende Zeichenfolge aufteilt.

Probieren Sie es online!

Die TIO-Verknüpfung ist ein vollständiges Programm, und die Funktion verfügt über ein statisches Schlüsselwort, sodass die Funktion von main aus aufgerufen werden kann.

Testen Sie Regex


Dies liefert nicht die richtige Ausgabe für den Testfall - einige Zeilen sind länger als 50 Zeichen. Sie möchten "vor" nicht "in der Nähe", und auch die Aufteilung an einem Punkt muss davon abhängen, wo sie zuvor aufgeteilt wurde.
Ørjan Johansen

0

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

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

Probieren Sie es online!

Dank geht an @LukeStevens für die Entwicklung der Java-Version ... Anscheinend lässt .NET Sie die importieren RegularExpressions Namespace , um ein Ersetzen durchzuführen :(

Hier ist meine ursprüngliche Version, die das Leerzeichen aufteilt und mithilfe von LINQ wieder zusammenfügt:

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

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

Probieren Sie es online!



0

APL (NARS), 48 Zeichen, 96 Byte

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

Prüfung:

  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.                                              

Ich weiß nicht in "{⊃⍵ {⍺≥⍺: ⊂⍵⋄ ...", ob es richtig ist ≥ oder ob es richtig ist ...
RosLuP

0

C 63 Bytes

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

Die Funktion dieser Übung b (a, n) würde, wie gesagt, die Zeile "a" unterbrechen, indem sie ihre Länge nicht ändert (wenn wir das Ergebnis als eine Zeichenkette sehen), da einige Leerzeichen in \ n oder eine neue Zeile in geändert werden Ort. Die Eingabezeichenfolge "a" sollte kein \ n Zeichen für die Funktion b () enthalten (sie könnte \ n in der Eingabezeichenfolge für bs () enthalten).

Die Funktion b (a, n) wäre nur deshalb in Ordnung, weil die Einschränkung dieser Übung, die jedes Wort einer "a" - Zeichenkette auferlegt, eine Länge <n hat. Wenn dies nicht zutrifft, kann diese Funktion
zu einer Endlosschleife gehen ... (sehr) falsch in meiner Sichtweise, so kopiere ich auch die Funktion besser, weil in diesem Fall -1 zurückkehren würde und nicht zu einer Endlosschleife gehen würde; es ist bs (a, n) unten) Ich schließe nicht aus, dass beide Funktionen fehlerhaft sind. .

#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;
    }
}

Ergebnis von b (), das an eine Funktion übergeben wurde, die die Zeilenlänge jeder Zeile hinzufügt

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]

@ceilingcat ok, der obige Code würde auch die \ n berücksichtigen ... ein Fehler, den ich mit dem Code fand, war, dass die letzte Zeile nicht richtig gedruckt wurde ... warum schreibst du deine C-Antwort nicht wie die andere? Es würde bei mir gewinnen, weil es kürzer ist ... zum Beispiel, wenn das stimmt, verwende ich die erste Zeile (oder Anweisung ";") für die Überprüfung der Eingabe nur, weil für mich die Eingabe überprüft werden muss, auch wenn das etwas mehr ist lange; Ich habe erfolglos versucht, die Funktion in APL zu schreiben ...
RosLuP

@ceilingcat in der letzten Antwort, gesehen, dass die Frage nicht sagt, ob die Eingabezeichenfolge '\ n' Zeichen enthält oder nicht enthalten muss, und gesehen, dass das Beispiel '\ n' nicht enthält. Ich nehme an, dass die Eingabezeichenfolge kein neues Zeilenzeichen enthält ...
RosLuP

Nur 83 ... Ja, ich muss sehen, ob ich mit der alten Funktionsdefinition 3 Zeichen
bekomme

Nur 81 .... .... ....
RosLuP

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.