Wyjustuj tekst, dodając spacje

10

Biorąc pod uwagę ten tekst

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore i dolore magna aliqua. Ut enim ad minim veniam, quis nostrud Exercitation ullamco laboris nisi ut aliquip ex ea commodo konsekat. Duis aute irure dolor in reprezenthenderit 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.

napisz najkrótszy program, który tworzy ten sam tekst, wyjustowany 80 znakami. Powyższy tekst musi wyglądać dokładnie tak:

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.

Zasady:

  • słowa nie wolno wycinać
  • należy dodać dodatkowe spacje
    • po kropce.
    • po przecinku
    • po najkrótszym słowie (od lewej do prawej)
    • wynik nie może mieć więcej niż 2 kolejne spacje
  • ostatnia linia nie jest uzasadniona.
  • linie nie mogą zaczynać się przecinkiem ani kropką.
  • podać dane wyjściowe swojego programu

zwycięzca: najkrótszy program.

Uwaga: Łańcuch wejściowy jest dostarczany na STDIN jako jeden wiersz (bez przesunięcia wiersza lub powrotu karetki)

aktualizacja:

Łańcuch wejściowy może być dowolnym tekstem o rozsądnej długości słowa (tj. Nie więcej niż 20 ~ 25 znaków), takim jak:

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing, gdzie indziej niesklasyfikowane, 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, konsekwencja w, pretium a, enim. Kongres Pellentesque. 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. Liczba całkowita 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 Vehicle. 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 i et tristique ligula justo vitae magna. Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, i ultricies lacus lorem varius purus. Curabitur eu amet.

Toto
źródło
3
Po co prosić ludzi o dostarczenie wyników ich programu? Czy martwisz się, że ludzie nie sprawdzą swoich wyników przed opublikowaniem?
Peter Taylor,
1
Kusi mnie, aby dostarczyć program php, który składa się z tekstu wyjściowego. ;-) Poważnie, jednak spacje w drugim wierszu tekstu wyjściowego wydają się być dodawane do spacji losowo? Czy jest w tym jakiś wzorzec, którego nie widzę, a jeśli nie, to w jaki sposób możemy oczekiwać, że wyprodukujemy dokładnie ten wynik dla danych wejściowych?
Gareth,
@Gareth: Przepraszam, mój zły. Popełniłem błąd, jest po przecinku, a nie po incididunt. Pytanie edytowane.
Toto
@Peter Taylor: Tylko dlatego, że nie jestem w stanie przetestować wszystkich języków.
Toto,
1
@Ilmari Karonen: Tak, ciąg wejściowy może być dowolny.
Toto,

Odpowiedzi:

5

Perl, 94 znaki

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

Uruchom z perl -nM5.01. (Jest nto uwzględnione w liczbie znaków.)

Powyższy kod jest najkrótszym, jaki udało mi się zrobić, który mógł obsłużyć dowolne rzucone przez niego kulki (takie jak słowa jednoliterowe na początku linii, linie wejściowe o długości dokładnie 80 znaków itp.) Dokładnie według specyfikacji:

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?

(Z przeprosinami dla Garetha za wykorzystanie jego komentarza jako dodatkowego wkładu testowego.)

Następująca 75-znakowa wersja działa wystarczająco dobrze, aby wygenerować przykładowy wynik z przykładowego wejścia, ale może się nie powieść w przypadku innych danych wejściowych. Ponadto pozostawia dodatkowy znak spacji na końcu każdej linii wyjściowej.

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

Obie wersje zapętlą się na zawsze, jeśli napotkają dane wejściowe, których nie mogą poprawnie uzasadnić. (W dłuższej wersji zastąpienie untilgo until$i>80||poprawiłoby to kosztem siedmiu dodatkowych znaków).

Ilmari Karonen
źródło
Ach, powinienem zacząć od perlowego rozwiązania ;-) Ten język jest oczywiście bardzo dobry do takiego zadania.
Howard,
Mam Quantifier in {,} bigger than 32766 in regex; marked by <-- HERE in m/^(.*?\.|.*?,|(.*? )??\S{ <-- HERE 32767}) \b/drugi tekst.
Toto
@ M42: Jest tak, ponieważ drugiego przykładowego tekstu nie można uzasadnić zgodnie z regułami. Jeśli dodam $i>80czek, to rozwija 11. linię pede  pellentesque  fermentum.  Maecenas  adipiscing  ante  non  diam  sodales, która ma tylko 78 znaków, a następnie poddaje się, ponieważ po każdym słowie (oprócz ostatniego) występują dwie spacje.
Ilmari Karonen,
2

Ruby, 146 znaków

$><<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}

Drukuje dokładnie pożądany wynik (patrz poniżej), jeśli podany tekst jest wprowadzany do 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.

Edycja: Zaraz po przesłaniu pierwszego rozwiązania zauważyłem w komentarzach, że wymagany jest dowolny ciąg wejściowy. Poprzednia odpowiedź składała się tylko z 95 znaków, ale nie spełniała tego wymagania:

r=gets.split;l=0;'49231227217b6'.chars{|s|r[l+=s.hex]+=' '};(r*' ').gsub(/(.{,80}) ?/){puts $1}
Howard
źródło
Jeśli się nie mylę, używasz tego samego oszustwa, o jakim myślałem (kodując lokalizacje podwójnie rozmieszczonych słów w przykładowym wyniku). Zauważ, że M42 wyjaśnił, że programy powinny również radzić sobie z innymi danymi wejściowymi.
Ilmari Karonen,
@Ilmari Karonen Tak, widziałem to po przesłaniu. Zobacz moją edycję i komentarze powyżej. Wracając na pole golfowe ...
Howard,