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

10

Учитывая этот текст

Lorem Ipsum Dolor Sit Amet, Concetetur Adipisicing Elit, Sed do EiusMod Tempor Incididunt U Labore et Dolore Magna Aliqua. Ut enim ad minim veniam, quis nostrud упражнение ullamco labouris nisi ut aliquip ex ea кассовый следствие. Duis aute irure dolor в репереендерите в завитке Velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat непроизведенный, иск в виновном виноватом моллите аниме, то есть лейборист.

написать самую короткую программу, которая выдает тот же текст, выровненный на 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, Concetetur Adipiscing Elit. Сед не рисус. 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 arcu massa, scelerisque vitae, посвящение в, pretium a, enim. Пелентеский конг. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent Egestas Лев в Педе. Prasesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis у faucibus orci luctus et ultrices posuere cubilia Curae; Аликум нибх. Mauris ac mauris sed pede pellentesque fermentum. Меценаты, принимающие анде, без диам соды, хендрерит. Ut Velit Mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Нулла Солликутин. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, в tempus sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Целое число Curabitur aliquet гранулированный диам. Integer quis metus vitae elit lobortis egestas. Lorem Ipsum Dolor Sit Amet, посвященный Aditiscing Elit. Morbi Vel Erat Non Mauris Convallis Vehicleula. Nulla et sapien. Целый теллор теллус, аликвам фоцибус, конваллис ид, конг еу, квам. Mauris ullamcorper Felis Vitae Erat. Proin feugiat, augu non elementum posuere, metus purus iaculis lectus и et tristique ligula justo vitae magna. Aliquam convallis sollicitudin purus. Престижная аликвама, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem в sapien. Вивамус Лев. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean Suscipit Nulla в 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. Курабитур ес амет.

Toto
источник
3
Зачем просить людей предоставить результаты своей программы? Вы беспокоитесь о том, что люди не могут проверить свои результаты перед публикацией?
Питер Тейлор
1
Я испытываю желание предоставить программу php, которая состоит из выходного текста. ;-) Если серьезно, пробелы во второй строке выходного текста, кажется, были добавлены в пробелы случайно? Есть ли какая-то закономерность, которую я не вижу, и если нет, то как можно ожидать , что мы получим именно этот вывод для данного ввода?
Гарет
@ Гарет: Извини, мой плохой. Я сделал ошибку, после запятой, а не после инцидента. Вопрос отредактирован.
Тото
@ Питер Тейлор: Просто потому, что я не могу тестировать все языки.
Тото
1
@Ilmari Karonen: Да, входная строка может быть любой.
Тото

Ответы:

5

Perl, 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-символьная версия работает достаточно хорошо для получения выборочного вывода из входного выборки, но может не работать для других входных данных. Кроме того, он оставляет дополнительный пробел в конце каждой строки вывода.

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/за второй текст.
Toto
@ M42: Это потому, что текст второго примера не может быть обоснован в соответствии с правилами. Если я добавлю в $i>80чеке, он расширит 11-ю строку до pede  pellentesque  fermentum.  Maecenas  adipiscing  ante  non  diam  sodales78 символов, а затем сдастся, так как за каждым словом (кроме последнего) следуют два пробела.
Илмари Каронен
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 Да, я видел это после отправки. Смотрите мое редактирование и комментарии выше. Возвращаясь к полю для гольфа ...
Говард