Форматирование капли капитала

21

Вступление

Напишите программу или функцию, которая добавляет капля в абзац. Программа будет вводить текст для форматирования, ширину столбца и количество строк для удаления заглавной буквы. Столицы выглядят так:

Lines:        2     3      4 
Drop capital: A|    A.|    A..|
              ~'    ..|    ...|    etc.
                    ~~'    ...|
                           ~~~'

Это вызов.

вход

  • Введите строку печатных символов ASCII (без табуляции или перевода строки) и 2 целых числа больше единицы.
  • Одно целое число - это количество столбцов, которые должны иметь выходные данные.
  • Другой - это количество строк, соединенных пропущенным капиталом.
  • Текстовая строка содержит слова, разделенные пробелами.
  • Предположим, что ни одно из слов не будет длиннее ширины столбца. То есть,column width > longest word + drop capital height
  • Все строки будут содержать хотя бы одно слово.
  • Для этой задачи слово состоит из любого символа, кроме пробела.
  • Ввод может быть в любом удобном формате, следуя правилам выше.

Выход

  • Выровненный по левому краю блок текста, содержащий прописную букву с указанным количеством строк.
  • Строка должна содержать как можно больше слов, не превышая ширину столбца.
  • Между буквой и остальной частью каждой строки есть пробел.
  • Разрешается использовать один пробел или символ новой строки.

Примеры

Lines: 2 Columns: 10 Text: The quick brown fox jumped over the lazy dog.

T| he
~' quick
brown fox
jumped
over the
lazy dog.

Lines: 3 Columns: 10 Text: (Same as above)

T.| he
..| quick
~~' brown
fox jumped
over the
lazy dog.

Lines: 4 Columns: 10 Text: (Same as above)

T..| he
...| quick
...| brown
~~~' fox
jumped
over the
lazy dog.

Lines: 2 Columns: 80 Text: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor.

L| orem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus.
~' Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec
consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget libero
egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem
lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non tortor.

Lines: 3 Columns: 80 Text: (Same as above)

L.| orem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam lectus.
..| Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra nec
~~' consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam eget
libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta
lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies a non
tortor.

Lines: 4 Columns: 80 Text: (Same as above)

L..| orem ipsum dolor sit amet, consectetur adipiscing elit. Donec a diam
...| lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam viverra
...| nec consectetur ante hendrerit. Donec et mollis dolor. Praesent et diam
~~~' eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim,
ut porta lorem lacinia consectetur. Donec ut libero sed arcu vehicula ultricies
a non tortor.

Это и применяются стандартные лазейки.

intrepidcoder
источник
3
Yay, другой типографский вызов! Нам нужно больше из них.
ETHproductions
2
Что происходит, когда слово длиннее ширины столбца, т.е. The quick brown fox jumped over the unenthusiastic dogдля любого из первых трех примеров?
MickyT
@MickyT Предположим, что ни одно из слов не будет длиннее ширины столбца. То есть,column width > longest word + drop capital height
Intrepidcoder
Что если заглавные строки больше, чем строки текста? То есть. L:4,C:100,T:'Stuff'
TFeld
Кроме того, может Lines = 1?
TFeld

Ответы:

1

Python 2, 202 байта

def f(l,c,t):
 l-=1;s=['.'*l+'|']*l+['~'*l+"'"]
 s[0]=t[0]+s[0][1:];t=t[1:].split();j=0
 while t:
  w=t.pop(0)
  if len(s[j]+w)>=c:j+=1
  if j>=len(s):s.append(w)
  else:s[j]+=' '+w
 return '\n'.join(s)

Позвонить как f(Lines, Columns, Text)

f(4,100,'Stuff') дает

S..| tuff
...|
...|
~~~'
TFeld
источник
1

C #, 244 байта

string F(int d,int c,string t){var w=t.Substring(1).Split(' ');t=""+t[0];for(int i=0,x=c,y=0;i<w.Length;x+=w[i++].Length+1)t+=(1>(x=x+w[i].Length>c?0:x)?"\n"+(y++<d?(y<d?"| ":"' ").PadLeft(x=d+1,y<d?'.':'~'):""):" ")+w[i];return t.Remove(1,2);}

Отступы, новые строки и комментарии для ясности:

string F(int d,int c,string t){
    var w=t.Substring(1).Split(' ');
    t=""+t[0];
    for(int i=0,x=c,y=0;i<w.Length;x+=w[i++].Length+1)
        t+=(1>(x=x+w[i].Length>c?0:x)?"\n"+(y++<d?(y<d?"| ":"' ").PadLeft(x=d+1,y<d?'.':'~'):""):" ")+w[i];
    return t.Remove(1,2);
}
Hand-E-Food
источник