Tata Letak Teks dalam Kolom

8

Tulis program atau fungsi yang memberikan beberapa teks, sejumlah kolom, dan lebar kolom, memformat teks menjadi kolom. Ini teks biasa .

Aturan

Memasukkan

  • Teks akan menjadi string ASCII yang dapat dicetak dan mungkin berisi baris baru dan spasi (tetapi tidak tab).
  • Jumlah kolom akan menjadi bilangan bulat positif.
  • Lebar kolom adalah bilangan bulat yang lebih besar atau sama dengan 2 yang menentukan jumlah karakter per kolom.

Untuk tantangan ini, sebuah kata akan terdiri dari karakter non-spasi putih. Input terdiri dari satu string dan dua bilangan bulat, yang dapat diambil dalam urutan apa pun.

Keluaran

Output adalah teks yang diformat menjadi kolom seimbang dengan jumlah kata pada setiap baris yang sesuai.

  • Jika sebuah kata terlalu panjang untuk dimasukkan ke dalam kolom, letakkan kata tersebut di baris berikutnya jika ada kata lain di baris saat ini dan garis tersebut bisa diisi dengan lebar kolom dengan tiga spasi atau kurang.
  • Jika tidak, beri tanda penghubung pada kata sehingga mengisi seluruh baris. Tanda hubung di mana pun garis berakhir; jangan khawatir tentang tanda hubung di antara suku kata.
  • Kolom harus dipisahkan dengan margin empat karakter spasi.
  • Kolom harus seimbang sehingga semuanya memiliki jumlah garis yang sama jika memungkinkan.
  • Kolom paling kiri harus memiliki garis tambahan jika perlu.
  • Setiap jeda baris dan beberapa ruang harus dipertahankan. Ruang tambahan adalah opsional setelah kolom terakhir.

Contohnya

Teks:

The number of columns will be a positive integer.  Columns should be separated by a margin of four space characters.

The columns should be balanced.  The column width is greater than two.

Kolom: 3, lebar: 10

The number    separated     ns should 
of columns    by a marg-    be balanc-
will be a     in of four    ed.  The  
positive      space cha-    column wi-
integer.      racters.      dth is gr-
Columns                     eater than
should be     The colum-    two.      

Teks:

This line is hyphenated.
This line, on the other hand, is not.  

Kolom: 1, lebar: 20

This line is hyphen-
ated.               
This line, on the
other hand, is not.

Teks: Tiny columns.kolom: 4, lebar: 2

T-    c-    u-    s.
i-    o-    m-      
ny    l-    n-

Teks: Two spaces.<space>kolom: 5, lebar: 2

T-          p-    c-    s.
wo    s-    a-    e-

Teks: <newline>A phrasekolom: 2, lebar: 5

         rase
A ph-

Teks: A short sentence.kolom: 10, lebar: 5

A sh-    ort      sent-    ence.

Teks: It's "no word" 1234567890 -+-+-+-+ (*&!)kolom: 3, lebar: 6

It's      12345-    +-+
"no       67890     (*&!)
word"     -+-+--

Ini adalah ; aturan standar berlaku.

intrepidcoder
sumber
4
@Mego Tantangannya terkait, namun, ini membutuhkan tanda penghubung kata tertentu dan kolom penyeimbang, jadi saya pikir itu cukup berbeda.
intrepidcoder
Apakah s:'tiny', c:4, w:2= t- i- n- yatau t- i- ny??
TFeld
@TFeld Contoh saya salah, seharusnya begitu t- i- ny. Apakah semuanya sekarang, atau apakah saya harus memperbaikinya lagi?
intrepidcoder
Tidak yakin, harus tiny smenjadi t- i- n- y_ sataut- i- ny s
TFeld

Jawaban:

1

Python 2, 346 338 byte

i,C,W=input()
r=[]
for l in [x or' 'for x in i.split('\n')]:
 while l:
  if' '==l[0]:l=l[1:]
  w=l[:W];x=W;s=w.rfind(' ')+1
  if max(W-3,0)<s:w=w[:s];x-=W-s
  elif x<len(l)and' 'not in l[x:x+1]:w=w[:-1]+'-';x-=1
  r+=[w];l=l[x:]
r=[s.ljust(W)for s in r+['']*(C-1)]
print'\n'.join('    '.join(s)for s in zip(*zip(*[iter(r)]*((len(r))/C))))

Masukkan sebagai 'string',C,W

TFeld
sumber
Terima kasih, diperbaiki dengan mengubah ke rstrip().
TFeld
Bagus! itu menyelamatkan saya strip()pada akhirnya.
TFeld
0

C ++ 414

Berkat @ceilingcat untuk beberapa permainan golf yang sangat bagus - sekarang bahkan lebih pendek

#import<bits/stdc++.h>
#define b t.push_back
#define r l.substr
using namespace std;main(int n,char**a){int i=0,j,m,p,c=atoi(a[1]),w=atoi(a[2]);vector<string>t;for(string l;getline(cin,l);)for(;p=l.find_last_of(" \n",w),p-string::npos&&p>w-4?b(r(0,p)),l=r(p+1):w/l.length()?b(l),l="":(b(r(0,w-1)+"-"),l=r(w-1)),l.length(););for(m=~-t.size()/c+1;i<m;i+=puts(""))for(j=0;j<c;b(""))cout<<left<<setw(w+4)<<t[i+j++*m];}

Cobalah online!

Jerry Jeremiah
sumber