ปรับให้สมบูรณ์ & ยัติภังค์บล็อกข้อความ


26
Given  a width  and  a block  of
text containing possible hyphen-
ation points,  format it  fully-
justified (in monospace).

การจัดชิดขอบอย่างสมบูรณ์หมายถึงการจัดตำแหน่งชิดซ้ายและขวาและทำได้โดยการเพิ่มระยะห่างระหว่างคำจนกระทั่งแต่ละบรรทัดพอดี

ที่เกี่ยวข้อง:

อินพุต

คุณสามารถป้อนข้อมูลในรูปแบบที่คุณชอบ คุณจะได้รับ:

  • ความกว้างเป้าหมาย (เป็นตัวอักษร) ในช่วง 5-100 (รวม)
  • บล็อกข้อความที่มีคำที่ใส่ไฮเฟน นี่อาจเป็นสตริงที่คั่นด้วยช่องว่างอาร์เรย์ของคำหรืออาร์เรย์ของอาร์เรย์ของคำในแฟรกเมนต์ (หรือการแสดงข้อมูลอื่น ๆ ที่คุณต้องการ)

อินพุตทั่วไปอาจเป็น:

Width: 25
Text:  There's no bu-si-ne-ss lik-e s-h-o-w busine-ss, n-o bus-iness I know.

ในกรณีที่เครื่องหมายยัติภังค์แสดงถึงเครื่องหมายยัติภังค์ที่เป็นไปได้และช่องว่างแสดงถึงขอบเขตของคำ การเป็นตัวแทนทางเลือกที่เป็นไปได้ของข้อความ:

[["There's"], ["no"], ["bu", "si", "ne", "ss"], ["lik", "e"], (etc.)]

เอาท์พุต

ข้อความที่ป้อนด้วยช่องว่างที่เพิ่มระหว่างคำขึ้นบรรทัดใหม่ที่ความกว้างคอลัมน์และจุดการใส่ไฮเฟ็นเพื่อเลือกปรับให้เข้ากับความกว้างคอลัมน์ สำหรับฟังก์ชั่นอาร์เรย์ของสตริง (หนึ่งสำหรับแต่ละบรรทัด) สามารถส่งคืนแทนการใช้การแยกบรรทัดใหม่

เอาต์พุตที่เป็นไปได้สำหรับอินพุตด้านบนอาจเป็น:

There's no  business like
show  business,  no  bus-
iness I know.

โปรดทราบว่ายัติภังค์ทั้งหมดได้ถูกลบออกยกเว้นหนึ่งใน "bus-iness" สุดท้ายซึ่งถูกเก็บไว้เพื่อแสดงให้เห็นว่าคำที่ล้อมรอบบรรทัดถัดไปและได้รับเลือกเพื่อให้แน่ใจว่าบรรทัดที่สองมีข้อความมากที่สุด

กฎระเบียบ

  • ภายในแต่ละบรรทัดจำนวนช่องว่างระหว่างคำไม่สามารถเปลี่ยนแปลงได้มากกว่า 1 แต่ที่คุณแทรกช่องว่างเพิ่มเติมนั้นขึ้นอยู่กับคุณ:

    hello hi foo     bar    <-- not permitted (1,1,5)
    hello  hi foo    bar    <-- not permitted (2,1,4)
    hello  hi  foo   bar    <-- OK (2,2,3)
    hello  hi   foo  bar    <-- OK (2,3,2)
    hello   hi  foo  bar    <-- OK (3,2,2)
    
  • ไม่มีบรรทัดที่สามารถเริ่มต้นหรือลงท้ายด้วยช่องว่าง (ยกเว้นบรรทัดสุดท้ายซึ่งสามารถลงท้ายด้วยช่องว่าง)

  • บรรทัดสุดท้ายควรเว้นไว้โดยมีช่องว่างเดียวระหว่างแต่ละคำ มันสามารถตามมาด้วยช่องว่างโดยพลการ / ขึ้นบรรทัดใหม่หากต้องการ แต่ไม่จำเป็นต้องใช้

  • คำจะประกอบด้วย AZ, az, 0-9 และเครื่องหมายวรรคตอนง่าย ๆ ( .,'()&)

  • คุณสามารถสันนิษฐานได้ว่าจะไม่มีส่วนย่อยของคำใดยาวเกินความกว้างเป้าหมายและจะเป็นไปได้ที่จะเติมบรรทัดตามกฎ (เช่นจะมีอย่างน้อย 2 คำในแต่ละบรรทัดหรือ 1 ชิ้นส่วนที่เติมบรรทัด ได้อย่างสมบูรณ์แบบ)

  • คุณต้องเลือกจุดยัติภังค์ซึ่งเพิ่มจำนวนตัวอักษรของคำให้มากที่สุดในบรรทัดก่อนหน้า (เช่นคำที่ต้องใช้อย่างตะกละตะกลามโดยบรรทัด) ตัวอย่างเช่น:

    This is an input stri-ng with hyph-en-at-ion poi-nts.
    
    This     is     an     input    stri-      <-- not permitted
    ng with hyphenation points.
    
    This  is an  input string  with hyph-      <-- not permitted
    enation points.
    
    This is an input  string with hyphen-      <-- OK
    ation points.
    
  • รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ

ตัวอย่าง

Width: 20
Text:  The q-uick brown fox ju-mp-s ove-r t-h-e lazy dog.

The quick  brown fox
jumps over the  lazy
dog.

Width: 32
Text: Given a width and a block of text cont-ain-ing pos-sible hyphen-ation points, for-mat it ful-ly-just-ified (in mono-space).

Given  a width  and  a block  of
text containing possible hyphen-
ation points,  format it  fully-
justified (in monospace).

Width: 80
Text:  Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.

Programming Puzzles &  Code Golf  is a question and answer  site for programming
puzzle enthusiasts  and code golfers.  It's built and run  by you as part of the
Stack Exchange network  of Q&A sites. With your help,  we're working together to
build a library of programming puzzles and their solutions.

Width: 20
Text:  Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.

Programming  Puzzles
&  Code  Golf  is  a
question and  answer
site for programming
puzzle   enthusiasts
and  code   golfers.
It's  built  and run
by  you  as  part of
the  Stack  Exchange
network    of    Q&A
sites.   With   your
help,  we're working
together to  build a
library of  program-
ming   puzzles   and
their solutions.

Width: 5
Text:  a b c d e f g h i j k l mm nn oo p-p qq rr ss t u vv ww x yy z

a b c
d e f
g h i
j k l
mm nn
oo pp
qq rr
ss  t
u  vv
ww  x
yy z

Width: 10
Text:  It's the bl-ack be-ast of Araghhhhh-hhh-h-hhh-h-h-h-hh!

It's   the
black  be-
ast     of
Araghhhhh-
hhhhhhhhh-
hhh!

Yesss ในที่สุดก็ท้าทายการพิมพ์ตัวอักษร (ตามข้อความ) :-)
ETHproductions

1
@ ใช่ใช่สำหรับบิลด์อิน: ไม่มีข้อ จำกัด ของรหัสและรหัสที่สั้นที่สุดชนะ แน่นอนว่ามันอาจจะเป็นคำตอบที่น่าเบื่อ! สำหรับห้องสมุดคุณสามารถตราบเท่าที่ห้องสมุดมีให้ใช้งานฟรีและคุณทำเครื่องหมายคำตอบของคุณเป็น "language + library" นอกจากนี้เวอร์ชันของห้องสมุดจะต้องทำการแก้ไขปัญหานี้ล่วงหน้า
เดฟ

1
ในกรณีที่บรรทัดสามารถลงท้ายด้วยเครื่องหมายขีดคั่นหรืออักขระเดี่ยวเช่นที่anybod-yมีความกว้าง 7 เราอาจเลือกที่จะส่งออกอย่างใดอย่างหนึ่งanybodyหรือanybod-\ny?
darrylyeo

1
@JanathanAllan ใช่; ขอโทษฉันจะแก้ไขนั่น
เดฟ

3
@Darrylyeo คุณไม่ต้องส่งคำเต็มในกรณีนั้นเนื่องจากมันจะต้องมีตัวอักษรมากที่สุดเท่าที่จะทำได้ในแต่ละบรรทัด
เดฟ

คำตอบ:


7

JavaScript (ES6), 218 ไบต์

w=>s=>s.map((c,i)=>c.map((p,j)=>(k+p)[l="length"]-w-(b=!i|j>0)+(j<c[l]-1)<0?k+=b?p:" "+p:(Array(w-k[l]-b).fill(h=k.split` `).map((_,i)=>h[i%(h[l]-1)]+=" "),o.push(h.join` `+(b?"-":"")),k=p)),o=[],k="")&&o.join`
`+`
`+k

รับอาร์กิวเมนต์ในรูปแบบ currying ( f(width)(text)) และการป้อนข้อความอยู่ในรูปแบบสองแถวที่อธิบายไว้ในการท้าทาย .split` `.map(a=>a.split`-`))สตริงจะถูกแปลงเป็นรูปแบบที่ผ่าน นอกจากนี้การขึ้นบรรทัดใหม่จะขึ้นบรรทัดใหม่ตามตัวอักษรภายในสตริงแม่แบบ

ยกเลิกการตีกอล์ฟและจัดใหม่

width=>string=> {
    out=[];
    line="";
    string.map((word,i)=> {
        word.map((part,j)=> {

            noSpaceBefore = i==0 || j>0;
            if ((line+part).length - width - noSpaceBefore + (j<word.length-1) < 0) {
                line += noSpaceBefore ? part : " "+part;
            }
            else {
                words=line.split` `;
                Array(width - line.length - noSpaceBefore).fill()
                    .map((_,i) => words[i % (words.length-1)] += " ");
                out.push(words.join(" ") + (noSpaceBefore? "-" : ""));
                line=part;
            }
        });
    });
    return out.join("\n") + "\n"+line
}

ความคิดที่นี่คือการก้าวผ่านแต่ละส่วนของสตริงทั้งหมดและสร้างแต่ละบรรทัดทีละส่วน เมื่อบรรทัดเสร็จสมบูรณ์มันจะเพิ่มระยะห่างระหว่างคำจากซ้ายไปขวาจนกว่าจะเว้นวรรคทั้งหมด

ตัวอย่างการทดสอบ

f=
w=>s=>s.map((c,i)=>c.map((p,j)=>(k+p)[l="length"]-w-(b=!i|j>0)+(j<c[l]-1)<0?k+=b?p:" "+p:(Array(w-k[l]-b).fill(h=k.split` `).map((_,i)=>h[i%(h[l]-1)]+=" "),o.push(h.join` `+(b?"-":"")),k=p)),o=[],k="")&&o.join`
`+`
`+k
<style>*{font-family:Consolas,monospace;}</style>
<div oninput="O.innerHTML=f(+W.value)(S.value.split` `.map(a=>a.split`-`))">
Width: <input type="number" size="3" min="5" max="100" id="W">
Tests: <select id="T" style="width:20em" oninput="let x=T.value.indexOf(','),s=T.value;W.value=s.slice(0,x);S.value=s.slice(x+2)"><option></option><option>20, The q-uick brown fox ju-mp-s ove-r t-h-e lazy dog.</option><option>32, Given a width and a block of text cont-ain-ing pos-sible hyphen-ation points, for-mat it ful-ly-just-ified (in mono-space).</option><option>80, Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.</option><option>20, Pro-gram-ming Puz-zles & Code Golf is a ques-tion and ans-wer site for pro-gram-ming puz-zle enth-usi-asts and code golf-ers. It's built and run by you as part of the St-ack Exch-ange net-work of Q&A sites. With your help, we're work-ing to-g-et-her to build a lib-rary of pro-gram-ming puz-zles and their sol-ut-ions.</option><option>5, a b c d e f g h i j k l mm nn oo p-p qq rr ss t u vv ww x yy z</option><option>10, It's the bl-ack be-ast of Araghhhhh-hhh-h-hhh-h-h-h-hh</option></select><br>
Text: &nbsp;<textarea id="S" cols="55" rows="4"></textarea>
</div>
<pre id="O" style="border: 1px solid black;display:inline-block;"></pre>


8

GNU sed -r, 621 ไบต์

รับอินพุตเป็นสองบรรทัด: ความกว้างเป็นหมายเลข unary ก่อนและสตริงที่สอง

ฉันแน่ใจว่านี่อาจจะตีกอล์ฟได้มากกว่านี้ แต่ฉันทิ้งเวลาไปมากเกินไปแล้ว

x;N
G
s/\n/!@/
:
/@\n/bZ
s/-!(.*)@ /\1 !@/
s/!(.*[- ])(@.*1)$/\1!\2/
s/@(.)(.*)1$/\1@\2/
s/-!(.*-)(@.*)\n$/\1!\2\n1/
s/(\n!@) /\1/
s/-!(.* )(@.*)\n$/\1!\2\n1/
s/-!(.*-)(@.*1)$/\1!\21/
s/!(.*)-@([^ ]) /\1\2!@ /
t
s/ !@(.*)\n$/\n!@\1#/
s/!(.*-)@(.*)\n$/\1\n!@\2#/
s/!(.*)(@ | @)(.*)\n$/\1\n!@\3#/
s/-!(.*[^-])@([^ ]) (.*)\n$/\1\2\n!@\3#/
s/!(.+)@([^ ].*)\n$/\n!@\1\2#/
/#|!@.*\n$/{s/#|\n$//;G;b}
:Z
s/-?!|@.*//g
s/ \n/\n/g
s/^/%/
:B
G
/%.*\n.+\n/!bQ
:C
s/%([^\n])(.*)1$/\1%\2/
tC
s/([^\n]+)%\n/%\1\n/
:D
s/%([^ \n]* )(.*)1$/\1 %\2/
tD
s/(^|\n)([^\n]+)%(.*1)$/\1%\2\3/
tD
s/%([^\n]*)\n(.*)\n$/\1\n%\2/
tB
:Q
s/%(.*)\n1*$/\1/

ลองออนไลน์!

คำอธิบาย

โปรแกรมทำงานในสองขั้นตอน: 1. แยกและ 2 ปรับ สำหรับด้านล่างสมมติว่าอินพุตของเราคือ:

111111111111
I re-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.

ติดตั้ง

ก่อนอื่นเราอ่านอินพุตย้ายบรรทัดแรก (ความกว้างเป็นหมายเลขเอกนารี) ไปยังพื้นที่พัก ( x) จากนั้นต่อท้ายบรรทัดถัดไป ( N) จากนั้นคัดลอกความกว้างจากพื้นที่พัก ( G) ไปยังพื้นที่รูปแบบ ตั้งแต่Nปล่อยให้เราเป็นผู้นำ\nเราแทนที่ด้วย!@ซึ่งเราจะใช้เป็นเคอร์เซอร์ในระยะที่ 1

x;N
G
s/\n/!@/

ตอนนี้เนื้อหาของพื้นที่พักคือ1111111111111(และจะไม่เปลี่ยนแปลงต่อจากนี้ไป) และพื้นที่รูปแบบคือ (ในรูปแบบของlคำสั่ง"พิมพ์อย่างไม่น่าสงสัย" ของ sed ):

!@I re-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n111111111111$

ขั้นตอนที่ 1

ในระยะที่ 1 @เคอร์เซอร์หลักจะเลื่อนอักขระหนึ่งตัวต่อครั้งและสำหรับแต่ละอักขระ a 1จะถูกลบออกจาก "ตัวนับ" ที่ส่วนท้ายของพื้นที่รูปแบบ ในคำอื่น ๆ@foo\n111$, f@oo\n11$, fo@o\n1$ฯลฯ

!เส้นทางเคอร์เซอร์อยู่เบื้องหลัง@เคอร์เซอร์เครื่องหมายสถานที่ที่เราสามารถทำลายถ้านับถึง 0 ที่อยู่ตรงกลางของเส้น สองรอบจะมีลักษณะเช่นนี้:

!@I re-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n111111111111$
!I@ re-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n11111111111$
!I @re-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n1111111111$

ที่นี่มีรูปแบบที่เรารู้จัก: ช่องว่างตามด้วย@เคอร์เซอร์ทันที เนื่องจากตัวนับมีค่ามากกว่า 0 เราจึงเลื่อนเครื่องหมายแบ่งแล้วเลื่อนเคอร์เซอร์หลักไปเรื่อย ๆ :

I !@re-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n1111111111$
I !r@e-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n111111111$
I !re@-mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n11111111$
I !re-@mem-ber a time of cha-os, ru-ined dreams, this was-ted land.\n1111111$

นี่คือรูปแบบอื่น: -@และเรายังคงมี 7 ตัวนับอยู่ดังนั้นเราจึงเลื่อนเคอร์เซอร์หยุดอีกครั้งและก้าวต่อไป:

I re-!mem-@ber a time of cha-os, ru-ined dreams, this was-ted land.\n111$

นี่คือรูปแบบที่แตกต่าง: ยัติภังค์นำหน้าเคอร์เซอร์เบรกและอีกอันที่อยู่ก่อนหน้าเคอร์เซอร์หลัก เราลบเครื่องหมายขีดคั่นแรกเลื่อนเคอร์เซอร์เบรกและเนื่องจากเราลบอักขระให้เพิ่ม 1 ไปยังตัวนับ

I remem-!@ber a time of cha-os, ru-ined dreams, this was-ted land.\n1111$

เราเลื่อนเคอร์เซอร์หลักไปเรื่อย ๆ :

I remem-!ber@ a time of cha-os, ru-ined dreams, this was-ted land.\n1$

คล้ายกับก่อนหน้า แต่คราวนี้เคอร์เซอร์หลักจะนำหน้าช่องว่างแทนที่จะตามเครื่องหมายขีดกลาง เราลบเครื่องหมายขีดคั่น แต่เนื่องจากเรากำลังเลื่อนเคอร์เซอร์หลักไปด้วย

I remember !@a time of cha-os, ru-ined dreams, this was-ted land.\n1$
I remember !a@ time of cha-os, ru-ined dreams, this was-ted land.\n$

ในที่สุดเคาน์เตอร์ของเราถึงศูนย์ เนื่องจากอักขระที่อยู่หลังเคอร์เซอร์หลักคือช่องว่างเราใส่บรรทัดใหม่และใส่เคอร์เซอร์ทั้งสองทันทีหลังจากนั้น จากนั้นเราเติมตัวนับ ( G) และเริ่มอีกครั้ง

I remember a\n!@ time of cha-os, ru-ined dreams, this was-ted land.\n111111111111$

ขั้นตอนที่ 1 ดำเนินต่อไปเลื่อนเคอร์เซอร์และจับคู่รูปแบบต่าง ๆ จนกระทั่ง@เคอร์เซอร์ถึงจุดสิ้นสุดของสตริง

# Phase 1
:
  # End of string; branch to :Z (end of phase 1)
  /@\n/bZ

  # Match -!.*@_
  s/-!(.*)@ /\1 !@/

  # Match [-_]@ and >0
  s/!(.*[- ])(@.*1)$/\1!\2/

  # Advance cursor
  s/@(.)(.*)1$/\1@\2/

  # Match -!.*-@ and 0; add 1
  s/-!(.*-)(@.*)\n$/\1!\2\n1/

  # Match \n!@_
  s/(\n!@) /\1/

  # Match -!.*_@ and 0; add 1
  s/-!(.* )(@.*)\n$/\1!\2\n1/

  # Match -!.*-@ and >0; add 1
  s/-!(.*-)(@.*1)$/\1!\21/

  # Match -@[^_]_
  s/!(.*)-@([^ ]) /\1\2!@ /

  # If there were any matches, branch to `:`
  t

  # Match _!@ and 0
  s/ !@(.*)\n$/\n!@\1#/

  # Match -@ and 0
  s/!(.*-)@(.*)\n$/\1\n!@\2#/

  # Match @_|_@ and 0
  s/!(.*)(@ | @)(.*)\n$/\1\n!@\3#/

  # Match -!.*[^-]@[^_]_ and 0
  s/-!(.*[^-])@([^ ]) (.*)\n$/\1\2\n!@\3#/

  # Match !.+@[^_] and 0
  s/!(.+)@([^ ].*)\n$/\n!@\1\2#/

  # Match marked line (#) or !@ and 0
  /#|!@.*\n$/{
    # Remove mark; append width and branch to `:`
    s/#|\n$//
    G
    b
  }

:Z

# Cleanup
s/-?!|@.*//g
s/ \n/\n/g

ในตอนท้ายของเฟส 1 พื้นที่รูปแบบของเรามีลักษณะดังนี้:

I remember a\ntime of cha-\nos, ruined\ndreams, this\nwasted land.

หรือ:

I remember a
time of cha-
os, ruined
dreams, this
wasted land.

ระยะที่ 2

ในเฟส 2 เราใช้%เป็นเคอร์เซอร์และใช้ตัวนับในลักษณะที่คล้ายกันเริ่มต้นดังนี้:

%I remember a\ntime of cha-\nos, ruined\ndreams, this\nwasted land.\n111111111111$

อันดับแรกเรานับตัวอักษรในบรรทัดแรกโดยเลื่อนเคอร์เซอร์และลบ 1s ออกจากตัวนับหลังจากที่เรามี

I remember a%\ntime of cha-\nos, ruined\ndreams, this\nwasted land.\n$

เนื่องจากตัวนับเป็น 0 เราจะไม่ทำสิ่งใดในบรรทัดนี้ บรรทัดที่สองมีจำนวนอักขระเท่ากับตัวนับดังนั้นให้ข้ามไปที่บรรทัดที่สาม:

I remember a\ntime of cha-\nos, ruined%\ndreams, this\nwasted land.\n11$

ตัวนับมากกว่า 0 ดังนั้นเราจึงเลื่อนเคอร์เซอร์กลับไปที่จุดเริ่มต้นของบรรทัด จากนั้นเราจะพบช่องว่างแรกและเพิ่มช่องว่างลดจำนวนตัวนับ

I remember a\ntime of cha-\nos, % ruined\ndreams, this\nwasted land.\n1$

ตัวนับมากกว่า 0; เนื่องจากเคอร์เซอร์อยู่ในช่องว่างบนบรรทัดสุดท้าย (เท่านั้น) เราจึงย้ายกลับไปที่จุดเริ่มต้นของบรรทัดและทำอีกครั้ง:

I remember a\ntime of cha-\nos,  % ruined\ndreams, this\nwasted land.\n$

ตอนนี้ตัวนับคือ 0 ดังนั้นเราเลื่อนเคอร์เซอร์ไปที่จุดเริ่มต้นของบรรทัดถัดไป เราทำซ้ำในทุก ๆ บรรทัดยกเว้นครั้งสุดท้าย นั่นคือจุดสิ้นสุดของระยะที่ 2 และจุดสิ้นสุดของโปรแกรม! ผลลัพธ์สุดท้ายคือ:

I remember a
time of cha-
os,   ruined
dreams, this
wasted land.
# Phase 2
# Insert cursor
s/^/%/
:B
  # Append counter from hold space
  G
  # This is the last line; branch to :Q (end of phase 1)
  /%.*\n.+\n/!bQ

  :C
    # Count characters
    s/%([^\n])(.*)1$/\1%\2/
    tC

  # Move cursor to beginning of line
  s/([^\n]+)%\n/%\1\n/

  :D
    # Add one to each space on the line as long as counter is >0
    s/%([^ \n]* )(.*)1$/\1 %\2/
    tD

    # Counter is still >0; go back to beginning of line
    s/(^|\n)([^\n]+)%(.*1)$/\1%\2\3/
    tD

    # Counter is 0; move cursor to next line and branch to :B
    s/%([^\n]*)\n(.*)\n$/\1\n%\2/
    tB

:Q

# Remove cursor, any remaining 1s
s/%(.*)\n1*$/\1/

นี้เป็นที่น่าทึ่ง แต่เมื่อผมทำงานโดยใช้ฉันได้รับgsed (GNU sed) 4.4 gsed: -e expression #1, char 16: ":" lacks a labelคุณสามารถเพิ่มบันทึกย่อเกี่ยวกับวิธีที่คุณเรียกใช้หรือไม่ (ฉันใช้printf "%s\n%s" "$1" "$2" | gsed -r '<code here>';)
เดฟ

@Dave นั้นใช้ได้กับฉันใน GNU sed 4.2 นี่คือส่วนสำคัญ: gist.github.com/jrunning/91a7584d95fe10ef6b036d1c82bd385cโปรดทราบว่าหน้าเซดของ TiO ดูเหมือนจะไม่เคารพ-rธงซึ่งเป็นสาเหตุที่ลิงค์ TiO ด้านบนไปที่หน้าทุบตี
Jordan

อ่าฉันไม่ได้สังเกตลิงค์ของ TiO นั่นจะทำให้ฉัน มี +1! ในตัวอย่างสุดท้ายมีข้อผิดพลาดเล็ก ๆ 2 ประการ (หนึ่งใน "สัตว์เดรัจฉานดำ"): มันพิมพ์อักขระบรรทัดที่หนึ่งถึงสองบรรทัดสุดท้ายสั้นและพลาดสุดท้าย!(แต่เนื่องจากฉันพลาด!จากรายการของอักขระพิเศษที่เป็นไปได้ฉัน จะไม่ถือมันเอาไว้)
เดฟ

5

JavaScript (ES6), 147 ไบต์

(width)(text)จะเข้าเป็น

w=>F=(s,p=S=' ')=>(g=([c,...b],o='',h=c=='-')=>c?o[w-1]?c==S&&o+`
`+F(b):o[w+~h]?o+c+`
`+F(b):c>S?g(b,h?o:o+c):g(b,o+p)||g(b,o+p+c):o)(s)||F(s,p+S)

ลองออนไลน์!

แสดงความคิดเห็น

w =>                              // w = requested width
  F = (                           // F is a recursive function taking:
    s,                            //   s = either the input string (first iteration) or an
                                  //       array of remaining characters (next iterations)
    p =                           //   p = current space padding
    S = ' '                       //   S = space character
  ) => (                          //
    g = (                         // g is a recursive function taking:
      [c,                         //   c   = next character
          ...b],                  //   b[] = array of remaining characters
      o = '',                     //   o   = output for the current line
      h = c == '-'                //   h   = flag set if c is a hyphen
    ) =>                          //
      c ?                         // if c is defined:
        o[w - 1] ?                //   if the line is full:
          c == S &&               //     fail if c is not a space
          o + `\n` + F(b)         //     otherwise, append o + a linefeed and process the
                                  //     next line
        :                         //   else:
          o[w + ~h] ?             //     if this is the last character and c is a hyphen:
            o + c + `\n` + F(b)   //       append o + c + a linefeed and process the next
                                  //       line
          :                       //     else, we process the next character:
            c > S ?               //       if c is not a space:
              g(b, h ? o : o + c) //         append c if it's not a hyphen
            :                     //       else:
              g(b, o + p) ||      //         append either the current space padding
              g(b, o + p + c)     //         or the current padding and one extra space
      :                           // else:
        o                         //   success: return o
  )(s)                            // initial call to g() with s
  || F(s, p + S)                  // in case of failure, try again with a larger padding



1

Python 2 , 343 ไบต์

W,T=input()
T+=' '
L,l=[],len
while T:
 p,r=0,''
 for i in range(l(T)):
  s=T[:i].replace('-','')
  if'-'==T[i]:s+='-'
  if T[i]in' -'and W-l(s)>=0:p,r=i,s
 R=r.split()
 if R:
  d,k=W-l(''.join(R)),0
  for j in range(d):
   R[k]+=' '
   k+=1
   if k==l(R)-1:k=0
  L+=[''.join(R)]
  T=T[p+1:]
print'\n'.join(L[:-1])
print' '.join(L[-1].split())

ลองออนไลน์!

The  input  is a block of text
containing possibly hyphenated
words.  For  each space/hyphen
position  p  the code computes
l(p)  the  length  of the line
induced  by  slipping the text
to this space/hyphen. Then the
code choses the position p for
which  the  length l(p) is the
closest  to  the given width W
(and  l(p)<=W).  If l(p)<W the
code  adds spaces  fairly  in-
between  the  words to achieve
the length W.

แม้ว่าอินพุตอาจอยู่ในรูปแบบที่คุณชอบ แต่ก็ควรมาจาก STDIN หรือพารามิเตอร์ ดูค่าเริ่มต้นสำหรับ I / O โดยทั่วไปเราไม่อนุญาตให้ "อินพุต" มาจากตัวแปรที่กำหนดไว้ล่วงหน้า
mbomb007

คุณสามารถบันทึกไบต์โดยทำprint'\n'.join(L[:-1])แทนfor e in L[:-1]:print e
mbomb007

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