간단한 단어 래퍼 만들기


22

(참고 : 이것은 처음으로 코드 골프 질문이지만, 내가 알 수있는 한, 아무도 정확히 이것을하지 않았으므로 좋을 것입니다.)

당신의 임무는 문자열 s과 정수 를 취하고 n그 텍스트를 여러 줄로 감싸서 반환하거나 출력 하는 프로그램이나 함수를 만드는 것 입니다. 각 단어는 한 줄에 있어야합니다. 즉, 단어가 중간에 쪼개지지 않습니다. 각 줄은 더 이상 n문자를 초과 할 수 없으며 각 줄에 가능한 한 많은 단어를 입력해야합니다.

예:

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.

출력은 문자열 배열이거나 줄 바꿈이있는 단일 문자열 일 수 있습니다. 또한을 초과하는 단어는 없다고 가정 할 수 n있으므로 이상한 경우를 처리 할 필요가 없습니다.

표준 I / O 규칙이 적용되며 표준 허점이 금지됩니다. 후행 공백이 허용됩니다.

이것은 이므로 바이트 단위의 shorts 솔루션이 우선합니다.

다음 은 작동하는 Python의 예제 프로그램입니다.



3
n은 최대 라인 길이입니까? 또는 줄 바꿈 전에 도달 해야하는 길이?
david

1
@david 또는 줄 수?
피터 테일러

1
28 바이트 파이썬 이 관련이 있습니까?
david

3
n최대 행 길이입니다. 명확하지 않습니다. 나는 명확히 할 것이다. 또한 규칙이 업데이트되어 간단한 분할이 작동하지 않습니다.
ATMunn

답변:



5

PHP , 8 바이트

가장 독창적 인 솔루션은 아니지만 PHP는 요구 사항을 완벽하게 충족시키는 기본 기능을 가지고 있습니다!

wordwrap:

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

문자열 구분 문자를 사용하여 문자열을 지정된 수의 문자로 줄 바꿈합니다.

다음과 같이 사용하십시오.

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

또는 온라인으로 사용해보십시오!


5

자바 스크립트 (ES6),  75 73  72 바이트

로 입력을 (string)(n)받습니다.

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

온라인으로 사용해보십시오!

변수

포맷 된 출력은 영형 저장됩니다 (아래 녹색).

업데이트 된 줄 는 다음을 연결하여 정의됩니다.

  • 현재 줄 아르 자형 (아래 검은 색)
  • 공간이 경우 아르 자형 비어, 또는 아무것도 그렇지 않으면 (오렌지에서 아래)되지 않는다
  • 새로운 단어 (아래 파란색)

u 번째 문자 가 설정 될 때마다 (0 색인, 아래 빨간색) 줄 바꿈을 삽입해야합니다 .

=16 이고에스 = "LOREM IPSUM DOLOR"

"LOREM"추가 :

0001020304050607080910111213141516영형아르 자형이자형

"IPSUM"추가 :

0001020304050607080910111213141516영형아르 자형이자형나는에스

"DOLOR"추가 :

0001020304050607080910111213141516영형아르 자형이자형나는에스영형영형아르 자형

0001020304050607080910111213141516영형아르 자형이자형나는에스영형영형아르 자형


후행 공백이 허용됩니다. 아마도 r+w+' '?
l4m2

5

펄 6 , 46 29 바이트

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

온라인으로 사용해보십시오!

정규식 기반 솔루션은 커리 입력을 가져 와서 f(n)(s)행 목록을 반환합니다. 마지막 줄을 제외한 각 줄에는 후행 공백이 있습니다.

설명:

{;*                         }   # 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 바이트 / 키 스트로크

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

텍스트 형식 질문? 나는 그 일을위한 도구 만 알고있다! 그리고 처음 두 번의 키 입력으로도 내 이름이 있습니다.

<C-r>의미 ctrl-r합니다.

이 수 사상 V에서 약간 짧은 ,하지만 난 정말 간결 정력이 바로 도전 할 수있는 방법을 보여 답변 바닐라 정력에 응답 선호합니다. 어쨌든 그 차이는 매우 작습니다.

이것은 15 바이트에서도 다음과 같을 수 있습니다.

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

온라인으로 사용해보십시오!


1
설명 : DJ::이 프로그램은 목에 다이아몬드가 달린 고양이가 가장 좋아하는 DJ 인 DJ가 제작했습니다. [...]
Outgolfer Erik

4

R , 36 27 바이트

R은 이것을 내장 ( strwrap)으로 가지고 있으며, 분할 선의 벡터를 반환합니다.

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

온라인으로 사용해보십시오!


1
그렇습니다. 줄 배열이 허용되므로 이것이 왜 다른지 알 수 없습니다.
ATMunn

4

하스켈 , 70 바이트

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


3

자바 (JDK) , 46 44 바이트

기본적으로 Java의 순수한 정규식 솔루션으로, 필자가 작성한 가장 짧은 것입니다.

정규식에서 바이트를 더 줄 이도록 도와 준 Kevin에게 건배!

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

온라인으로 사용해보십시오!

커 리드 lamdba를 사용하여 n공백이나 문자열 끝이 뒤에 오는 문자 까지 탐욕스럽게 일치시키는 정규식을 만듭니다 . 그런 다음 해당 문자를 줄 바꿈 문자로 바꿉니다.


@KevinCruijssen은 [ $]실제로 공백과 일치하거나 $문자열의 끝이 아니라 정확하게 기억한다면. 그래도 작동하는 것처럼 보이므로 더 적은 바이트로 단일 공간으로 골프를 치는 것처럼 보입니다.
Luke Stevens

아, 줄 바꿈을 추가하고 끝에 추가 줄 바꿈을 추가 할 필요가 없으므로 실제로 공간 일 수 있습니다.
Kevin Cruijssen

1
정규식에서 괄호를 제거하여 2 바이트 더 골프를 치고 $0대신 사용할 수 있습니다 $1.
Kevin Cruijssen

@KevinCruijssen 멋진 사람! replaceAll너무 장황한 것은 부끄러운 일입니다 !
Luke Stevens

2
나에게 그것은 "... dictum varius abc erat"로 끝나는 방식으로 운동의 라틴어 문구를 수정하면 나타납니다. c 문자 다음에 불필요한 줄 바꿈이 있습니다.
RosLuP

2

매스 매 티카, 16 바이트

InsertLinebreaks

내장 기능. 문자열과 정수를 입력으로 받아서 문자열을 출력으로 반환합니다.

InsertLinebreaks["string", n]
 줄 바꿈 문자를 삽입하여 n 자 보다 긴 줄을 만들지 않습니다 .


2

파워 쉘, 40 83 바이트

테스트 케이스가 n=80추가되었습니다.

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

테스트 스크립트 :

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

산출:

True
True


감사. 가짜 삼항은 표현입니다. 이 스크립트에는 파트에 내재 return된 내용과 else파트에 명령문 이 포함되어 있습니다 then.
mazzy


2

Japt , 20 바이트

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

온라인으로 사용해보십시오!

도움을 주신 Bubbler와 Shaggy에게 감사합니다

설명:

¸                       #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 바이트[X,Y].join(...).
Bubbler December


1

레티 나 0.8.2 , 37 바이트

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

온라인으로 사용해보십시오! 소요 sn별도의 라인. 설명:

.+$
$*

n단항으로 변환 합니다.

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

공백이 아닌 문자를 찾은 다음 계속 살펴보고로 n계산하십시오 $#1. 그런 다음 돌아가서 균형 그룹을 사용하여 n문자와 공백을 찾습니다.

!`

일치 항목을 줄 목록으로 출력하십시오.


Retina에서 첫 번째 입력을 두 번째 입력과 함께 사용하는 정규식에 넣는 방법이 있습니까? 그래서 다음과 같은 것이 있습니다 : .{1,50} $0¶ , 50대신 입력으로 수신되는 곳 은 어디 입니까?
Kevin Cruijssen

@KevinCruijssen Retina 1에서는 아마도 Eval 단계를 사용하여 비슷한 결과를 얻을 수 있지만 지루하기 때문에 귀찮게하지 않았습니다.
Neil

1

, 19 바이트

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

온라인으로 사용해보십시오! 링크는 자세한 버전의 코드입니다. 별도의 줄을 입력 n하고 입력 s합니다. 설명:

Nθ

입력 n.

루프의 첫 번째 반복에서 오른쪽 이동의 균형을 맞추려면 커서를 한 칸 왼쪽으로 이동하십시오.

F⪪S «

문자열을 공백으로 나누고 단어를 반복합니다.

¿‹⁺Lιⅈθ

다음 단어가 오른쪽 가장자리에 도달하는지 계산하십시오.

M→

그렇지 않으면 오른쪽으로 한 칸 이동합니다.

⸿

그렇다면 새 줄을 시작합니다.

ι

단어를 출력하십시오.



1

05AB1E , 18 바이트

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

온라인으로 사용해보십시오.

설명:

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

자바 8, 135 바이트

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

온라인으로 사용해보십시오.

설명:

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 바이트 SBCS

삽입 기능; 왼쪽 인수는 n이고 오른쪽 인수는 n입니다.

CY'dfns'wrap

온라인으로 사용해보십시오!

⎕CY(C)의 연산 에서 dfns 라이브러리

 그때

wrap[c]  랩 [n] 기능 사용

[c]  해당 기능의 코드
[n]  해당 기능에 대한 참고 사항


wrap59 바이트 SBCS 의 골프 버전

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

온라인으로 사용해보십시오!

{} dfn; 왼쪽 인수 (너비), 오른쪽 인수 (문자열)

≢⍵ 문자열의 집계 (문자 수)

⍺≥: 너비가 너비보다 크거나 같은 경우 :

   문자열을 반환

 그렇지 않으면:

  ' '=⍵ 공백이 문자열과 같은 부울 마스크

  b← 에 보관하십시오 b( b 공백)

  ()↑ 그로부터 다음과 같은 요소를 취하십시오.

   ⍺+1 폭보다 하나 더

  나는 진실한 곳을 찾는다

  g← 저장 g( g aps 용)

  ⍺≥ 너비가 너비보다 크거나 같은 부울 마스크

  g/⍨ 갭 인덱스를 필터링

  ⍺, 너비에 추가

  ⊃⌽ 그 마지막 요소를 선택하십시오 (반전 된 첫 번째 요소를 선택하십시오)

  t← 에 저장하십시오 t( t ake)

  b⊃⍨ 마스크로부터의 엘리먼트를 선택하는 것을 사용하여 B 형 lanks

  t+ 그것을 추가하십시오 t

  ⍵↓⍨ 문자열에서 많은 문자를 삭제

  ⍺∇ 같은 왼쪽 왼쪽 인수로 그에 재귀

  ⎕TC, APPEND 목록에 해당 t erminal C 자 조작부 (8 : HT 10 : NL, 13 : CR)

  2↓ 그것에서 처음 두 문자를 삭제하십시오 (단지 13 : CR을 남겨두고)

  (),  다음을 추가하십시오.

   t↑⍵t문자열  의 첫 문자


0

골프 버전 인 @Erik the Outgolfer 덕분에 :

파이썬 3 , 94 바이트

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:]

온라인으로 사용해보십시오!

# 파이썬 3 , 130 바이트

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

온라인으로 사용해보십시오!

그렇게 골프 버전이 아닙니다 ...


1
일부 골프. (STDOUT으로 인쇄하고 반환되지 않음).
Outgolfer Erik

0

자바 스크립트 + HTML + CSS, 117 64 바이트

@Neil이 제공 한 -53 바이트

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
적어도 내 브라우저에서 이것을 (n,s)=>document.body.innerHTML+=`<p style=width:${n}ch><tt>${s}</tt></p>` 74 바이트 로 줄일 수 있습니다 . 이전 버전의 Firefox를 파내려면를 사용하여 다른 8 바이트를 저장할 수 있습니다 (n,s)=>document.body.innerHTML+=`<pre wrap width=${n}>${s}</pre>` .
Neil

@Neil ch단위를 잘 사용 합니다. Firefox 65는 다음 50ch과 같이 계산 합니다 500px. 크롬 70 계산해 50ch같은400px
guest271314

이 답변은 잘못되었습니다. elit. Sed eget erat lectus. Morbi mi mi, fringilla sed(2 행)은 50자를 초과합니다. 최신 Chrome을 사용하고 있습니다.
mbomb007

<p>내부에 삽입하여 Chrome에서 작동하도록 원래 제안을 조정할 수있었습니다 <tt>.
Neil



0

C # (. NET 코어) 162 바이트

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

이 함수는 n 번째 또는 n 번째 문자의 배수에 가장 가까운 공백과 일치하는 정규식을 사용하고이를 기반으로 문자열을 분할합니다.

온라인으로 사용해보십시오!

TIO 링크는 전체 프로그램이며이 함수에는 정적 키워드가 있으므로 main에서 함수를 호출 할 수 있습니다.

정규식 테스트


이것은 테스트 케이스에 대한 올바른 출력을 제공하지 않습니다. 일부 행은 50자를 초과합니다. "근처"가 아닌 "이전"을 원하며 한 지점에서의 분할도 이전에 분할 된 위치에 따라 달라집니다.
Ørjan Johansen '12

0

C # (Visual C # 대화식 컴파일러) , 78 바이트

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

온라인으로 사용해보십시오!

Java 버전을 제공하는 데 대한 크레딧은 @LukeStevens로갑니다 ... 분명히 .NET을 사용하면 RegularExpressions 대체를 위해 네임 스페이스

다음은 공백 문자로 분할되고 LINQ를 사용하여 다시 결합하는 원래 버전입니다.

C # (Visual C # 대화식 컴파일러) , 91 바이트

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

온라인으로 사용해보십시오!



0

APL (NARS), 48 자, 96 바이트

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

테스트:

  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

0

C, 63 바이트

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

이 연습 b (a, n)의 함수는 연습이 말한대로 "a"줄을 끊습니다. \ n의 일부 공백을 바꾸거나 장소. 입력 문자열 "a"에는 b () 함수에 대해 \ n 문자가 없어야합니다 (bss ()에 대한 입력 문자열에 \ n이있을 수 있음)

b (a, n) 함수는이 연습의 제한 때문에 "a"문자열의 각 단어에 길이 <n이있는 경우에만 유효합니다. 이것이 사실이 아닌 경우 해당 함수는
하나의 무한 루프 로 갈 수 있습니다. 내 방식으로 잘못되었으므로 너무 좋은 함수를 복사하면이 경우 -1을 반환하고 하나의 무한 루프로 이동하지 않기 때문에 아래의 bs (a, n)입니다. 두 함수가 모두 버그가 있음을 제외하지 않습니다. .

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

각 줄에 줄 길이를 추가하는 하나의 함수에 전달 된 b ()의 결과

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, 위의 코드는 \ n도 고려할 것입니다 ... 코드에서 찾은 버그 중 하나는 마지막 줄이 올바르게 인쇄되지 않았다는 것입니다. 왜 C 응답을 다른 것으로 쓰지 않습니까? 그것은 더 짧기 때문에 내 것에서 이길 것입니다 ... 예를 들어 사실 나는 입력을 확인하기 위해 첫 번째 줄 (또는 문장 ";")을 사용합니다. 긴; 나는 APL에서 함수를 작성하는 데 실패했습니다 ...
RosLuP

마지막 대답의 @ceilingcat, 입력 문자열에 '\ n'문자가 있거나 없어야하는 경우 질문에 '\ n'문자가없고 '\ n'이없는 예제를 보았습니다. 입력 문자열에 줄 바꾸기 문자가 없다고 가정 ...
RosLuP

단지 83 ... 예 나는 이전 함수 정의를 사용하여 3 개의 문자를 얻는 지 확인해야합니다 ...
RosLuP

그냥 81 .... .... ....
RosLuP

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.