Вирівняйте текст до блоку


10

Завдання

Ваше завдання - написати всю програму, яка вирівняє даний вхід до блоку заданого розміру.

Вхід:

40
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

Вихід:

Lorem  ipsum dolor sit amet, consectetur
adipiscing  elit,  sed do eiusmod tempor
incididunt  ut  labore  et  dolore magna
aliqua.  Ut  enim  ad minim veniam, quis
nostrud   exercitation  ullamco  laboris
nisi ut aliquip ex ea commodo consequat.
Duis  aute  irure dolor in reprehenderit
in voluptate velit esse cillum dolore eu
fugiat  nulla  pariatur.  Excepteur sint
occaecat cupidatat non proident, sunt in
culpa  qui  officia deserunt mollit anim
id est laborum.
                <-- note the linebreak

Деталі введення

  • Ви повинні написати всю виконувану / інтерпретаційну програму.
  • Ви можете припустити, що вхід містить лише друковані символи ASCII і не містить вкладки \t.
  • Вхід може містити розриви рядків. Якщо це так, то вони наведені в якості \n, \rабо в \r\nзалежності від того, що ви очікуєте. Однак вони об'єднані протягом усього входу.
  • Вхід може бути заданий в STDIN або як аргументи командного рядка. Ви можете використовувати їх обоє, якщо це відповідає вашим потребам (наприклад, прочитайте розмір блоку з командних аргументів і введіть як stdin). Однак ви не можете жорстко кодувати будь-яку частину входу до вашої програми.
  • Ви можете припустити, що розмір блоку задається як дійсне позитивне ( > 0) число.
  • Розрив рядка на вході трактується так само, як пробіл (таким чином, це роздільник слів)
  • Якщо вхід містить кілька одночасних пробілів, вони розглядаються як одне ціле.

Вихідні дані

  • Вихід повинен бути відформатований у блок заданого розміру. Форматування виконується шляхом додавання пробілів між словами.
  • Кількість пробілів між словами на рядку має бути рівним для цього рядка. Якщо це неможливо, додаткові пробіли потрібно додати по черзі за словами, що починаються зліва.
  • Якщо слово більше, ніж заданий розмір блоку, воно буде стояти окремо на одному рядку (і перевищить розмір блоку).
  • Якщо висновок повинен містити лише одне слово, воно буде вирівняно зліва.
  • Останній рядок виводу повинен бути вирівняний ліворуч, лише один пробіл між словами. Останній рядок виходу повинен закінчуватися розривом кінцевої лінії.

Відповідь з найменшою кількістю байтів через деякий час виграє.
Якщо вам потрібна додаткова інформація, залиште коментар.

Тестові справи

Input:
10
Lorem ipsum dolor sit amet,
consectetur adipiscing elit, sed do eiusmod tempor

Output:
Lorem
ipsum
dolor  sit
amet,
consectetur
adipiscing
elit,  sed
do eiusmod
tempor

Input:
20
Lorem     ipsum

dolor  sit amet,

Output:
Lorem   ipsum  dolor
sit amet,

Input:
1
Lorem ipsum dolor sit amet

Output:
Lorem
ipsum
dolor
sit
amet

Пов'язані. (Нарешті, другий виклик для мого типографічного тегу, який уже автоматично видалено.;))
Мартін Ендер

@ MartinBüttner Я не знав, що такий тег існує.
Зереги

@ Vɪʜᴀɴ Ви повинні написати всю
Денніс


@ppperry Цікаво, що я чомусь уникнув моїх пошукових навичок
Zereges

Відповіді:



1

Рубі, 179 ч

n=gets.to_i
s=t=''
$<.read.split.map{|w|if(t+w).size>=n
0while t.size<n&&(1..n).any?{|i|t.sub!(/[^ ]#{' '*i}(?=[^ ])/){|x|x+' '}}
s+=t+?\n
t=w
else
t+=' '+w
t.strip!
end}
puts s,t

Шлях занадто довгий ...

Напівгольф версія:

n = gets.to_i
s = t = ''
$<.read.split.map{|w|
    if (t + w).size >= n
        0 while t.size < n && (1..n).any?{|i|t.sub!(/[^ ]#{' '*i}(?=[^ ])/){|x|x+' '}}
        s += t + ?\n
        t = w
    else
        t += ' ' + w
        t.strip!  # this is only necessary because of the very first word >:(
    end
}
puts s,t


0

Сітківка , 133 байт

\s+

+`((1)*1 )((?<-2>.)*\S|\S+) 
:$3<LF>$1
m+`^(?=.(.)+$[^<TB>]*^(?>(?<-1>1)+)1)((.*):(\S+ +)|(\S+ +)(.*):)
$3$4$5 :$6
+`:|<LF>1+| (?= .*$)
<empty>

<empty>Являє собою порожню косу лінію. Щоб запустити код, покладіть кожен рядок в окремий файл, замініть <LF>символами передачі рядків (0x0A) та <TB>вкладкою (0x09). Я додам пояснення, коли закінчу гольф.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.