Обґрунтуйте текст, додавши пробіли


10

З огляду на цей текст

Lorem ipsum dolor sit amet, consectetur adipisicer elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Тим не менше, ми не вимагаємо напруги ullamco Laboris nisi ut aliquip ex ea comodo posleat. 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 officiala deserunt mollit anim id est Laborum.

написати найкоротшу програму, яка створює той самий текст, виправданий на 80 символів. Наведений вище текст повинен виглядати саме так:

Lorem ipsum dolor sit amet,  consectetur adipisicing 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.

Правила:

  • слова не можна різати
  • додаткові пробіли повинні бути додані
    • після крапки.
    • після коми
    • після найкоротшого слова (зліва направо)
    • в результаті не повинно бути більше 2 послідовних пробілів
  • останній рядок не виправданий.
  • рядки не повинні починатися комою чи крапкою.
  • забезпечити вихід вашої програми

переможець: Найкоротша програма.

Примітка: Вхідний рядок надається на STDIN як один рядок (відсутність передачі рядка або повернення каретки)

оновлення:

Вхідним рядком може бути будь-який текст із можливістю пояснення довжини слова (тобто не більше 20 ~ 25 знаків), наприклад:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, posleat in, pretium a, enim. Пеллентський кон'юнкт. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit. Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. Curabitur aliquet pellentesque diam. Integer quis metus vitae elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi vel erat non mauris convallis Vehicula. Nulla et sapien. Integer tortor Tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae magna. Aliquam convallis sollicitudin purus. Preesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Вівамус лео. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Енейська суспензія нула в justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.


3
Навіщо просити людей надати результати своєї програми? Ви турбуєтесь про те, що люди не зможуть перевірити їх результати перед публікацією?
Пітер Тейлор

1
Мені спокуса надати програму php, яка складається з вихідного тексту. ;-) Серйозно, однак, пробіли у другому рядку вихідного тексту, здається, були додані до пробілів випадково? Чи є якась модель, яку я не бачу, і якщо ні, то як ми можемо очікувати, що вони дадуть саме такий результат для даного вводу?
Гарет

@Gareth: Вибач, моя погана. Я помилився, це після коми, а не після інциденту. Питання відредаговано.
Toto

@ Peter Taylor: Просто тому, що я не в змозі перевірити всі мови.
Тото

1
@Ilmari Karonen: Так, рядок введення може бути будь-яким.
Тото

Відповіді:


5

Перл, 94 ч

for(/(.{0,80}\s)/g){$i=1;$i+=!s/^(.*?\.|.*?,|(.*? )??\S{$i}) \b/$1  /until/
|.{81}/;chop;say}

Бігайте з perl -nM5.01. (Значення nвключено до числа символів.)

Код, наведений вище, є найкоротшим, який я міг би зробити, і міг би обробляти будь-які криві кулі, які я накидав на нього (наприклад, однолітерні слова на початку рядка, вводити рядки довжиною рівно 80 символів тощо) точно відповідно до специфікації:

Lorem ipsum dolor sit amet,  consectetur adipisicing 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.

I'm  tempted to  provide a  php  program which consists of  the output text. ;-)
Seriously though,  the spaces on the second line of the output text seem to have
been added to  the spaces at  random? Is  there some pattern to  it that I'm not
seeing,  and if  not,  how can we be expected to produce exactly that output for
the given input?

(З вибаченнями перед Гарет за використання його коментаря як додаткового тестового введення.)

Наступна 75-char версія працює досить добре, щоб отримати вибірковий вихід із вибірки, але може не вдатися до інших вхідних даних. Крім того, він залишає додатковий символ пробілу в кінці кожного рядка виводу.

for(/(.{0,80}\s)/g){s/(.*?\.|.*?,|.*? ..) \b/$1  /until/.{81}/||s/
//;say}

Обидві версії будуть циклічно назавжди, якщо вони зустрінуть вхід, який вони не можуть правильно виправдати. (У більш тривалій версії заміщення untilна until$i>80||виправить це за ціною семи додаткових символів.)


Ах, я мав би почати з рішення perl ;-) Ця мова, звичайно, хороша для такого завдання.
Говард

Я дістався Quantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.*?\.|.*?,|(.*? )??\S{ <-- HERE 32767}) \b/для другого тексту.
Тото

@ M42: Це тому, що другий приклад тексту не може бути виправданий відповідно до правил. Якщо додати в $i>80чек, він розширює 11-й рядок до pede  pellentesque  fermentum.  Maecenas  adipiscing  ante  non  diam  sodales, який становить лише 78 знаків, а потім здається, оскільки за кожним словом (крім останнього) дотримується два пробіли.
Ільмарі Каронен

2

Рубін, 146 символів

$><<gets.gsub(/(.{,80})( |$)/){$2>""?(s=$1+$/;(['\.',?,]+(1..80).map{|l|"\\b\\w{#{l}}"}).any?{|x|s.sub! /#{x} (?=\w)/,'\& '}while s.size<81;s):$1}

Він друкує точно потрібний вихід (див. Нижче), якщо поданий текст подається в STDIN.

Lorem ipsum dolor sit amet,  consectetur adipisicing 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.

Редагувати: Після подання мого першого рішення я побачив у коментарях, що потрібно обробляти будь-який рядок введення. Попередня відповідь складала лише 95 символів, але не відповідала цій вимозі:

r=gets.split;l=0;'49231227217b6'.chars{|s|r[l+=s.hex]+=' '};(r*' ').gsub(/(.{,80}) ?/){puts $1}

Якщо я не помиляюся, ви використовуєте той самий чіт, який я думав (кодування розташування подвійних проміжків слів у прикладі виводу). Зауважте, що M42 уточнив, що програми повинні справлятися і з іншими вхідними даними.
Ільмарі Каронен

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