ทำเสื้อคลุมคำง่ายๆ


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 มาตรฐานและไม่อนุญาตช่องโหว่มาตรฐาน อนุญาตให้เว้นวรรคต่อท้าย

เนื่องจากนี่คือวิธีแก้ปัญหา shortes ในหน่วยไบต์จะเป็นผู้ชนะ

นี่คือตัวอย่างโปรแกรมใน Python ที่ใช้งานได้



3
n ความยาวของสายสูงสุดคืออะไร? หรือความยาวที่เราต้องไปให้ถึงก่อนที่จะถึงเส้นแบ่ง?
david

1
@ David หรือจำนวนบรรทัด?
Peter Taylor

1
28 bytes หลามมันเกี่ยวข้องหรือไม่
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

JavaScript (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

ลองออนไลน์!

ตัวแปร

เอาต์พุตที่จัดรูปแบบแล้วจะถูกเก็บไว้ใน (เป็นสีเขียวด้านล่าง)โอ

บรรทัดที่อัพเดตถูกกำหนดเป็นการเชื่อมต่อของ:ยู

  • บรรทัดปัจจุบัน (เป็นสีดำด้านล่าง)R
  • ช่องว่างถ้าไม่ว่างเปล่าหรือไม่มีอะไรอื่น (เป็นสีส้มด้านล่าง)R
  • คำใหม่ (สีน้ำเงินด้านล่าง)W

เราจำเป็นต้องแทรกตัวแบ่งบรรทัดเมื่อใดก็ตามที่มีการตั้งค่าอักขระ -th ของ (ดัชนี 0, สีแดงด้านล่าง)nยู

ตัวอย่าง

n=16และ = "LOREM IPSUM DOLOR"s

การเพิ่ม "LOREM": start

0001020304050607080910111213141516LOREM

การเพิ่ม "IPSUM": start

0001020304050607080910111213141516LOREMผมPSยูM

การเพิ่ม "DOLOR": start

0001020304050607080910111213141516LOREMผมPSยูMDOLOR

0001020304050607080910111213141516LOREMผมPSยูMDOLOR


อนุญาตให้เว้นวรรคต่อท้าย อาจจะr+w+' '?
l4m2

5

Perl 6 , 46 29 ไบต์

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

ลองออนไลน์!

โซลูชันที่ใช้ Regex ซึ่งรับอินพุต curried 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

เป็นกลุ่ม 15 ไบต์ / การกดแป้น

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

คำถามการจัดรูปแบบข้อความ? ฉันรู้แค่เครื่องมือสำหรับงาน! และมันก็มีชื่อของฉันในการกดปุ่มสองครั้งแรก: D

<C-r>ctrl-rวิธี

นี้อาจเคยสั้นดังนั้นเล็กน้อยใน Vแต่ฉันชอบตอบในวานิลลาเป็นกลุ่มสำหรับคำตอบที่จริงๆอวดวิธีกระชับเป็นกลุ่มสามารถสำหรับความท้าทายที่เหมาะสม และความแตกต่างนั้นเล็กมากเลยล่ะค่ะ

นี่อาจเป็นสิ่งต่อไปนี้สำหรับ 15 ไบต์เช่นกัน:

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

ลองออนไลน์!


1
คำอธิบาย: DJ:โปรแกรมนี้ทำโดยดีเจแมวตัวโปรดของเราที่มีเพชรล้อมรอบคอของเขา [... ]
Erik the Outgolfer

4

R , 36 27 ไบต์

R มีสิ่งนี้ในตัว ( strwrap) เราจะคืนค่าเวกเตอร์ของเส้นแยก

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

ลองออนไลน์!


1
ใช่ว่าควรได้รับอนุญาต อนุญาตให้ใช้อาเรย์ของแถวได้ดังนั้นฉันจึงไม่เห็นสาเหตุที่จะแตกต่างกัน
ATMunn



3

Java (JDK) , 46 44 ไบต์

โดยทั่วไปแล้วโซลูชัน regex บริสุทธิ์ใน Java นั้นสั้นที่สุดที่ฉันเขียน

ไชโยกับเควินที่ช่วยลดจำนวนไบต์ใน regex ยิ่งขึ้นไปอีก!

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

ลองออนไลน์!

การใช้ lamdba curried จะสร้าง regex เพื่อจับคู่โลภกับnตัวอักษรตามด้วยช่องว่างหรือจุดสิ้นสุดของสตริง จากนั้นจะแทนที่อักขระเหล่านั้นด้วยตัวเองตามด้วยบรรทัดใหม่


@KevinCruijssen [ $]จริง ๆ แล้วตรงกับช่องว่างหรือ$ถ้าฉันจำได้อย่างถูกต้องมากกว่าจุดสิ้นสุดของสตริง ดูเหมือนว่าจะใช้งานได้ แต่ดูเหมือนว่าจะสามารถลงไปที่ที่ว่างเดียวเพื่อให้ได้จำนวนไบต์ที่น้อยลง
ลุคสตีเวนส์

อ่าอาจเป็นเพียงช่องว่างเนื่องจากคุณเพิ่มบรรทัดใหม่และไม่จำเป็นต้องเพิ่มบรรทัดใหม่ที่ต่อท้ายในตอนท้าย
Kevin Cruijssen

1
คุณสามารถกอล์ฟ 2 ไบต์ลบวงเล็บใน regex และใช้แทน$0 $1
Kevin Cruijssen

@KevinCruijssen Nice one! มันเป็นเพียงความอัปยศที่replaceAllverbose ดังนั้น!
ลุคสตีเวนส์

2
สำหรับฉันมันผิดปรากฏขึ้นถ้าฉันปรับเปลี่ยนวลีภาษาละตินของการออกกำลังกายในแบบที่มันลงท้ายด้วย "... dictum varius abc erat" มีการขึ้นบรรทัดใหม่ที่ไม่จำเป็นหลังจากตัวอักษร c ...
RosLuP

2

Mathematica ขนาด 16 ไบต์

InsertLinebreaks

ฟังก์ชั่นในตัว รับสตริงและจำนวนเต็มเป็นอินพุตและส่งคืนสตริงเป็นเอาต์พุต

InsertLinebreaks["string", n]
 แทรกอักขระขึ้นบรรทัดใหม่เพื่อให้บรรทัดไม่เกินnตัว


2

Powershell, 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


ขอบคุณ Ternary ปลอมเป็นการแสดงออก สคริปต์นี้มีความหมายreturnในelseส่วนและคำสั่งในthenส่วน
mazzy

2

C (gcc) , 68 ไบต์

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

ลองออนไลน์!

ด้วยการติดตั้งcatcatช่วยให้ประหยัด 2 ไบต์ด้วยการย้ายchar*lพารามิเตอร์ไปที่พารามิเตอร์


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


1

เรติน่า 0.8.2 , 37 ไบต์

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

ลองออนไลน์! ใช้เวลาsและnในบรรทัดที่แยกจากกัน คำอธิบาย:

.+$
$*

แปลงnเป็นเอก

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

ตรงกับที่ไม่ใช่ช่องว่างแล้วมองไปข้างหน้าและนับว่าเป็นn $#1จากนั้นกลับไปใช้กลุ่มสมดุลเพื่อจับคู่nอักขระตามช่องว่าง

!`

แสดงผลลัพธ์ของรายการที่ตรงกัน


มีวิธีในเรตินาหรือไม่ที่จะใส่อินพุตแรกใน regex ที่เราใช้กับอินพุตที่สอง? ดังนั้นสิ่งนี้: .{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

Java 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

ฟังก์ชั่นมัด; อาร์กิวเมนต์ซ้ายเป็นข้อโต้แย้งที่ถูกต้องคือnn

CY'dfns'wrap

ลองออนไลน์!

⎕CYc op yในไลบรารี dfns

 แล้วก็

wrap[c]  ใช้ฟังก์ชันwrap [n]

[c]  รหัสของฟังก์ชันนั้น
[n]  หมายเหตุสำหรับฟังก์ชันนั้น


รุ่นแข็งแรงเล่นกอล์ฟของwrap59 ไบต์SBCS

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

ลองออนไลน์!

{} dfn; คืออาร์กิวเมนต์ที่เหลือ (ความกว้าง), คืออาร์กิวเมนต์ที่ถูกต้อง (สตริง)

≢⍵ tally (จำนวนอักขระ) ของสตริง

⍺≥: หากความกว้างมากกว่าหรือเท่ากับนั้น:

   ส่งคืนสตริง

 มิฉะนั้น:

  ' '=⍵ บูลีนมาส์กที่ช่องว่างเท่ากับสตริง

  b← เก็บในb(สำหรับb lanks)

  ()↑ รับจำนวนองค์ประกอบต่อไปนี้จากที่:

   ⍺+1 มากกว่าหนึ่งความกว้าง

  ฉัน ndices ที่จริง

  g← เก็บในg(สำหรับg aps)

  ⍺≥ บูลีนมาส์กที่ความกว้างมากกว่าหรือเท่ากับ

  g/⍨ กรองดัชนีช่องว่างโดยที่

  ⍺, ต่อท้ายที่ความกว้าง

  ⊃⌽ เลือกองค์ประกอบสุดท้ายของสิ่งนั้น (lit. เลือกแรกของสิ่งที่ตรงกันข้าม)

  t← เก็บในt(สำหรับt ake)

  b⊃⍨ ใช้สิ่งนั้นเพื่อเลือกองค์ประกอบจากหน้ากากของb lanks

  t+ เพิ่มที่ t

  ⍵↓⍨ ปล่อยอักขระจำนวนมากจากสตริง

  ⍺∇ recurse ในที่มีอาร์กิวเมนต์ซ้ายซ้ายเหมือนกัน

  ⎕TC, ผนวกกับรายการของT erminal ข้อมูลควบคุมตัวละคร (8: HT, 10: NL, 13: CR)

  2↓ ดร็อปอักขระสองตัวแรกจากนั้น (เหลือเพียงตัวนำ 13: CR)

  (... ), ต่อท้ายสิ่งต่อไปนี้:

   t↑⍵tอักขระตัว แรกของสตริง


0

ขอบคุณ @Erik the Outgolfer เวอร์ชัน golfed:

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

ลองออนไลน์!

# Python 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 จะไม่ส่งคืน)
Erik the Outgolfer

0

JavaScript + HTML + CSS, 117 64 ไบต์

-53 ไบต์ความอนุเคราะห์ของ @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
อย่างน้อยในเบราว์เซอร์ของฉันคุณสามารถลดมันได้ถึง(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; Chromium 70 คำนวณ50chเป็น400px
แขก 271314

คำตอบนี้ผิด elit. Sed eget erat lectus. Morbi mi mi, fringilla sed(บรรทัดที่ 2) มีอักขระมากกว่า 50 ตัว ฉันใช้ Chrome รุ่นใหม่ล่าสุด
mbomb007

ผมสามารถที่จะปรับแต่งข้อเสนอแนะเดิมของฉันในการทำงานใน Chrome โดยวางภายใน<p> <tt>
Neil



0

C # (. NET Core) 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");}}

ฟังก์ชั่นนี้ใช้ regex ซึ่งตรงกับช่องว่างที่ใกล้เคียงที่สุดที่อยู่ใกล้กับตัวที่ n หรือหลายของตัวอักษร nth และแยกสตริงตามมัน

ลองออนไลน์!

ลิงก์ TIO เป็นโปรแกรมเต็มรูปแบบและฟังก์ชั่นมีคำหลักคงที่เพื่อให้สามารถเรียกใช้ฟังก์ชั่นได้จาก main

ทดสอบ Regex


สิ่งนี้ไม่ได้ให้ผลลัพธ์ที่ถูกต้องสำหรับกรณีทดสอบ - บางบรรทัดมีความยาวมากกว่า 50 อักขระ คุณต้องการ "ก่อน" ไม่ "ใกล้" และการแยกที่จุดหนึ่งจะต้องขึ้นอยู่กับว่ามันถูกแยกไปก่อนหน้านี้ที่ใด
Ørjan Johansen

0

C # (Visual C # Interactive Compiler) , 78 ไบต์

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

ลองออนไลน์!

เครดิตไปที่ @LukeStevens สำหรับการมากับเวอร์ชัน Java ... Apparently .NET ทำให้คุณนำเข้าRegularExpressionsเนมสเปซเพื่อทำการแทนที่ :(

นี่คือเวอร์ชันดั้งเดิมของฉันที่แยกอักขระช่องว่างและใช้ LINQ เพื่อรวมเข้าด้วยกัน:

C # (Visual C # Interactive Compiler) , 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" ไม่ควรมีอักขระ \ n อยู่ในนั้นสำหรับฟังก์ชัน b () (อาจมี \ n ในสตริงอินพุตสำหรับ bs ())

ฟังก์ชั่น 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 ตกลงรหัสข้างต้นจะพิจารณา \ n ด้วย ... ข้อผิดพลาดอย่างหนึ่งที่ฉันพบกับรหัสคือบรรทัดสุดท้ายพิมพ์ไม่ถูกต้อง ... ทำไมคุณไม่เขียนคำตอบ C ของคุณเป็นอย่างอื่น? มันจะชนะเพราะของฉันสั้นกว่านี้ ... สำหรับพูดจริงฉันใช้บรรทัดแรก (หรือคำสั่ง ";") สำหรับการตรวจสอบของอินพุตเท่านั้นเพราะสำหรับฉันฉันจะต้องมีการตรวจสอบแม้ว่ามันจะน้อย ยาว; ฉันพยายามเขียนฟังก์ชันใน APL ไม่สำเร็จ ...
RosLuP

@ceilingcat ในคำตอบสุดท้ายเห็นคำถามที่ไม่ได้พูดว่าถ้าสตริงการป้อนข้อมูลมีหรือไม่ต้องมีมัน '\ n' ถ่านและเห็นตัวอย่างที่ไม่ได้มี '\ n' ฉันคิดว่าสตริงการป้อนไม่มีอักขระบรรทัดใหม่ในนั้น ...
RosLuP

เพียง 83 ... ใช่ฉันต้องดูว่าฉันได้รับ 3 ตัวอักษรโดยใช้นิยามฟังก์ชันเก่า ...
RosLuP

เพียง 81 .... .... .... ....
RosLuP

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.