Layouttext in Spalten

8

Schreiben Sie ein Programm oder eine Funktion, die bei gegebenem Text, mehreren Spalten und der Spaltenbreite den Text in Spalten formatiert. Dies ist Klartext- .

Regeln

Eingang

  • Der Text ist eine Zeichenfolge aus druckbarem ASCII und kann Zeilenumbrüche und Leerzeichen (jedoch keine Tabulatoren) enthalten.
  • Die Anzahl der Spalten ist eine positive Ganzzahl.
  • Die Spaltenbreite ist eine Ganzzahl größer oder gleich 2, die angibt, wie viele Zeichen pro Spalte vorhanden sind.

Für diese Herausforderung besteht ein Wort aus Nicht-Leerzeichen. Die Eingabe besteht aus einer Zeichenfolge und zwei Ganzzahlen, die in beliebiger Reihenfolge verwendet werden können.

Ausgabe

Die Ausgabe ist der Text, der in ausgeglichenen Spalten mit so vielen Wörtern in jeder Zeile formatiert ist, wie passen.

  • Wenn ein Wort zu lang ist, um in eine Spalte zu passen, setzen Sie das Wort in die nächste Zeile, wenn sich in der aktuellen Zeile ein anderes Wort befindet und die Zeile mit maximal drei Leerzeichen auf die Spaltenbreite aufgefüllt werden kann.
  • Andernfalls trennen Sie das Wort so, dass es den Rest der Zeile ausfüllt. Bindestrich überall dort, wo die Linie endet; Mach dir keine Sorgen über das Trennen zwischen Silben.
  • Spalten sollten durch einen Rand von vier Leerzeichen getrennt werden.
  • Die Spalten sollten so ausgeglichen sein, dass sie nach Möglichkeit alle die gleiche Anzahl von Zeilen haben.
  • Die Spalten ganz links sollten bei Bedarf eine zusätzliche Zeile enthalten.
  • Zeilenumbrüche und mehrere Leerzeichen sollten beibehalten werden. Nachgestellte Leerzeichen sind nach der letzten Spalte optional.

Beispiele

Text:

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.

Spalten: 3, Breite: 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.      

Text:

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

Spalten: 1, Breite: 20

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

Text: Tiny columns.Spalten: 4, Breite: 2

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

Text: Two spaces.<space>Spalten: 5, Breite: 2

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

Text: <newline>A phraseSpalten: 2, Breite: 5

         rase
A ph-

Text: A short sentence.Spalten: 10, Breite: 5

A sh-    ort      sent-    ence.

Text: It's "no word" 1234567890 -+-+-+-+ (*&!)Spalten: 3, Breite: 6

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

Das ist ; Es gelten Standardregeln.

unerschrockener Codierer
quelle
4
@Mego Die Herausforderungen hängen zusammen, aber dieses erfordert das Trennen bestimmter Wörter und das Ausbalancieren von Spalten, daher denke ich, dass es anders genug ist.
intrepidcoder
Ist s:'tiny', c:4, w:2= t- i- n- yoder t- i- ny??
TFeld
@TFeld Meine Beispiele waren falsch, es sollte sein t- i- ny. Ist jetzt alles in Ordnung oder muss ich es erneut reparieren?
intrepidcoder
Nicht sicher, sollte tiny ssein t- i- n- y_ sodert- i- ny s
TFeld

Antworten:

1

Python 2, 346 338 Bytes

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

Eingabe als 'string',C,W

TFeld
quelle
Danke, behoben durch Wechsel zu rstrip().
TFeld
Großartig! das erspart mir das strip()am ende.
TFeld
0

C ++ 414

Vielen Dank an @ceilingcat für einige sehr schöne Golfstücke - jetzt noch kürzer

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

Probieren Sie es online aus!

Jerry Jeremiah
quelle