Metin bloğunu tamamen yasla ve hecele


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

Tamamen haklı anlamına gelir, sola ve sağa hizalanır ve her bir çizgi uyuncaya kadar sözcükler arasındaki boşluğu artırarak elde edilir.

İlgili:

Giriş

İstediğiniz formatta giriş alabilirsiniz. Size verilecek:

  • Hedef genişliği (karakter olarak), 5-100 (dahil) aralığında;
  • Muhtemelen tirelenmiş sözcükleri içeren bir metin bloğu. Bu, boşlukla ayrılmış bir dize, bir kelime dizisi veya bir kelime parçası dizisi dizisi (veya istediğiniz diğer veri gösterimleri) olabilir.

Tipik bir giriş olabilir:

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

Tire'lerin olası tireleme noktalarını, boşluklar ise kelime sınırlarını belirtir. Metnin olası bir alternatif gösterimi:

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

Çıktı

Kelimeler arasına boşluk bırakılmış giriş metni, sütun genişliğinde yeni satırlar ve bunu sütun genişliğine tam olarak yaslamak için seçilen tireleme noktaları. İşlevler için, yeni satır ayırma yerine bir dizi dizgi (her satır için bir tane) döndürülebilir.

Yukarıdaki giriş için olası bir çıkış olabilir:

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

Kelimenin bir sonraki satıra sarıldığını ve ikinci satırın mümkün olduğunca fazla metin içermesini sağlamak için seçildiğini göstermek için tutulan son "bus-iness" in dışındaki tüm tire işaretlerinin kaldırıldığını unutmayın.

kurallar

  • Her satırda, kelimeler arasındaki boşluk sayısı 1'den fazla değişemez, ancak fazladan boşluk bıraktığınız yer size bağlıdır:

    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)
    
  • Hiçbir çizgi boşluklarla başlayamaz veya bitemez (boşluklarla biten son satır hariç).

  • Son satır, her bir sözcük arasında tek boşluk bırakılarak, haklı bırakılmalıdır. İstenirse isteğe bağlı beyaz boşluk / yeni satır izlenebilir, ancak bu gerekli değildir.

  • Kelimeler AZ, az, 0-9 ve basit noktalama işaretlerinden oluşacaktır ( .,'()&)

  • Hiçbir kelime parçasının hedef genişliğinden daha uzun olmayacağını ve çizgileri kurallara uygun olarak doldurmanın her zaman mümkün olacağını varsayabilirsiniz (yani, her satırda en az 2 kelime parçası veya satırı dolduracak 1 kelime parçası olacak) mükemmel bir şekilde)

  • Örneğin, daha önceki satırlardaki kelime karakterlerinin sayısını maksimize eden tireleme noktalarını seçmelisiniz (örneğin, kelimeler satırlarca açikça tüketilmelidir), örneğin:

    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.
    
  • Bayt cinsinden en kısa kod kazanır

Örnekler

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, nihayet başka bir (metin tabanlı) tipografi mücadelesi :-)
ETHproductions

1
@ Yerleşiklere evet adem: kod kısıtlaması yoktur ve en kısa kod kazanır. Tabii ki sıkıcı bir cevap verebilir! Kütüphanelere gelince, kütüphane özgürce erişilebilir olduğunda ve cevabınızı "dil + kütüphane" olarak işaretleyebilirsiniz. Ayrıca kütüphane versiyonunun bu zorluğa önceden girmesi gerekiyor.
Dave,

1
Durumunda bir çizgi örneğin tire veya tek karakteri, biriyle sona erebilir yani anybod-y, genişliği 7 ile çıkışa ya seçebilir anybodyveya anybod-\ny?
darrylyeo

1
@ JonathanAllan evet; üzgünüm, bunu düzelteceğim
Dave

3
@ darrylyeo hayır, bu durumda kelimenin tam anlamıyla çıkmanız gerekmiyor, çünkü açgözlülükle her satırda mümkün olduğunca fazla kelime karakterine sahip olması gerekir.
Dave,

Yanıtlar:


7

JavaScript (ES6), 218 bayt

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

Körleme sözdiziminde ( f(width)(text)) argümanlar alır ve metin girişi mücadelede açıklanan çift dizi biçimindedir. Dizeler, bu formata dönüştürülür .split` `.map(a=>a.split`-`)). Ayrıca, yeni satırlar, şablon dizelerin içindeki değişmez yeni satırlardır.

Golfsüz ve yeniden düzenlenmiş

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
}

Buradaki fikir, dizgenin her bir bölümüne adım atmak ve her bir çizgiyi birer birer bölüm oluşturmaktı. Bir satır tamamlandığında, tüm boşluklar yerleştirilene kadar boşluk kelimesini soldan sağa artırır.

Test Parçacığı

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 bayt

Girdiyi iki satır halinde alır: İlk önce tekli sayı olarak genişlik ve ikinci dize.

Bunun çok daha fazla golf oynayabileceğinden eminim ama zaten çok fazla zaman harcadım.

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/

Çevrimiçi deneyin!

açıklama

Program iki aşamada çalışır: 1. Bölünmüş ve 2. Haklı. Aşağıda, girdilerimizin olduğunu varsayalım:

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

Kurmak

İlk önce girişi okuruz, ilk satırı (bir unary sayı olarak genişlik) tutma alanına ( x) taşır, sonra bir sonraki satırı ( N) ekler ve sonra genişliğin bir kopyasını tutma alanından ( G) desen alanına ekleriz. NBizi bir liderle bıraktığımızdan beri , \nbunu !@1. Aşama'da imleç olarak kullanacağımızla değiştiriyoruz .

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

Şimdi, tutma alanının içeriği ( 1111111111111bundan böyle değişmeyecek) ve kalıp alanı (sed'in "açıkça yazdır" lkomutu biçiminde ):

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

Faz 1

Faz 1'de, ana @imleç bir kerede bir karakter ilerler ve her karakter için a 1, desen uzayının sonundaki "sayaçtan" ​​çıkarılır. Başka bir deyişle, @foo\n111$, f@oo\n11$, fo@o\n1$, vb

!Arkasında imleç rotaları @sayaç hattının ortasında 0 ulaşırsa yerleri işaretleme imleç, biz kırılabilir. Birkaç turda şöyle görünürdü:

!@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$

Burada tanıdığımız bir örüntü var: hemen @imleci takip eden bir boşluk . Sayaç 0'dan büyük olduğundan, kesme işaretçisini ilerletiriz, sonra ana imleci ilerletmeye devam ederiz:

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$

İşte başka bir örnek: -@ve hala sayaçta 7 var, bu yüzden mola imlecini tekrar ilerletip ilerlemeye devam ediyoruz:

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

İşte farklı bir desen: Kesme imlecinin hemen önündeki bir tire ve ana imlecin önündeki diğeri. İlk kısa çizgiyi kaldırırız, kesme imlecini ilerletiriz ve bir karakteri kaldırdığımızdan, sayaca 1 ekleyin.

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

Ana imleci ilerletmeye devam ediyoruz:

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

Daha öncekine benzer, ancak bu kez ana imleç kısa çizgiyi takip etmek yerine boşluktan önce gelir. Kısa çizgiyi kaldırdık, ancak ana imleci de ilerlettiğimiz için sayacı azaltıyoruz.

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$

Sonunda sayacımız sıfıra ulaştı. Ana imleçten sonraki karakter boşluk olduğundan, yeni bir satır ekleriz ve hemen her iki imleci koyarız. Sonra sayacı ( G) doldurur ve tekrar başlar.

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

Faz 1, @imleç dizinin sonuna ulaşana kadar imleçleri ilerletip çeşitli desenleri eşleştirerek devam eder .

# 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

Faz 1'in sonunda, kalıp uzayımız şuna benzer:

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

Veya:

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

Faz 2

2. aşamada %, imleç olarak kullanıyoruz ve sayacı benzer şekilde kullanıyoruz.

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

İlk önce, imleci ilerleterek ve sayaçtan 1leri kaldırarak ilk satırdaki karakterleri sayıyoruz;

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

Sayaç 0 olduğundan, bu satırda başka hiçbir şey yapmıyoruz. İkinci satır aynı zamanda sayaçla aynı sayıda karaktere sahiptir, o yüzden üçüncü satıra geçelim:

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

Sayaç 0'dan büyük olduğundan, imleci tekrar satırın başına getiririz. Ardından ilk boşluk akışını buluruz ve sayacı azaltarak bir boşluk ekleriz.

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

Sayaç 0'dan büyüktür; imleç satırdaki son (yalnızca) boşluk satırında olduğundan, onu satırın başına geri götürür ve tekrar yaparız:

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

Şimdi sayaç 0'dır, bu yüzden imleci bir sonraki satırın başına taşırız. Son hariç her satır için bunu tekrarlıyoruz. Bu, faz 2'nin sonu ve programın sonu! Nihai sonuç:

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/

Bu inanılmaz, ama ben çalıştırdığınızda kullanarak gsed (GNU sed) 4.4alıyorum gsed: -e expression #1, char 16: ":" lacks a label. Tam olarak nasıl çağırdığına dair bir not ekleyebilir misin? ( printf "%s\n%s" "$1" "$2" | gsed -r '<code here>';
Dave

@Dave Bu benim için çalışıyor GNU sed 4.2. İşte bir özet : gist.github.com/jrunning/91a7584d95fe10ef6b036d1c82bd385c TiO'nun üst sayfasının -rbayrağa saygı göstermediğine dikkat edin , bu yüzden yukarıdaki TiO bağlantısı bash sayfasına gider.
Ürdün

Ah, TiO bağlantısını fark etmemiştim. Bu benim için yapacağım; +1’in var! Son örnekte 2 küçük hata var ("siyah canavar" olan): ikinci satırdan sonuncuya bir karakter kısa basıyor ve finali kaçırıyor !( !özel karakterler listesinden kaçırdığımdan beri) buna karşı koymayacağım).
Dave,

5

JavaScript (ES6), 147 bayt

Girişi olarak alır (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)

Çevrimiçi deneyin!

Yorumlananlar

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

4

APL (Dyalog Unicode) , 129 123 121 118 111 111 109 107 104 100 95 bayt SBCS

{⊃⌽m←⍺≥-⌿c⍪+\⊢c' -'∘.≠⍵:⊂⍵/⍨⊢⌿c⋄(⊂∊ll[(⍺-≢l)⍴⍸' '=l],←⊃0l←⍵/⍨n×⊣⌿c⊖⍨1n),⍺∇⍵/⍨~n←⌽∨\⌽m>×⌿c}

Çevrimiçi deneyin!



1

Python 2,343 bayt

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

Çevrimiçi deneyin!

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.

Giriş istediğiniz herhangi bir biçimde olsa da, yine de STDIN veya parametrelerden gelmelidir. G / Ç için varsayılanlara bakın . Genellikle "giriş" in önceden atanmış değişkenlerden olmasına izin vermiyoruz.
mbomb007

Bunun print'\n'.join(L[:-1])yerine yaparak bir bayt kaydedebilirsinizfor e in L[:-1]:print e
mbomb007

@ mbomb007 tamam evet I / O'ya saygı duymak için gerekli değişiklikleri yapacağım
mdahmoune
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.