Usuń dzielenie wyrazów


15

Czas na nowe wyzwanie ! Jest to powszechny problem podczas wklejania kopii między różnymi formatami dokumentów: dzieleniem wyrazów. Chociaż zmniejsza nierówność układu wyrównanego do lewej lub wyrównuje odstępy w uzasadnionym układzie, jest to kompletny problem, gdy plik PDF nie jest poprawnie skonstruowany i zachowuje łączniki w układzie, co utrudnia edytowanie lub ponowne wczytywanie tekstu.

Na szczęście, jeśli mamy wierzyć niezliczonym poradnikom, nic nie stanowi problemu, jeśli postrzegasz to jako wyzwanie. Uważam, że te poradniki bez wyjątku odnoszą się do PPCG, gdzie każdy problem zostanie rozwiązany, jeśli zostanie przedstawiony jako wyzwanie. Twoim zadaniem jest usunięcie obrażającego dzielenia wyrazów i łamania linii z tekstu, aby był gotowy do wklejenia w dowolnym edytorze tekstu.

Opis problemu

Napisz program lub funkcję, która w razie potrzeby usunie dzielenie wyrazów i łamanie linii. Dane wejściowe będą ciągiem znaków stdin(lub najbliższą alternatywą) lub jako wejście funkcji. Wyjście (na stdoutlub najbliższym wyjściem alternatywnym lub funkcja) będzie „poprawione” text. Ten tekst powinien być możliwy do bezpośredniego skopiowania. Oznacza to, że wyjściowe lub końcowe wyjście jest OK, ale dodatkowe wyjście w połowie poprawionego tekstu (np. Początkowe spacje w każdym wierszu) nie jest .

Najbardziej podstawowy przypadek jest następujący (uwaga: brak spacji końcowych)

Lorem ipsum dolor sit amet, con-
sectetur adipiscing elit. Morbi
lacinia nisi sed mauris rhoncus.

Obrażający łącznik i łamanie wierszy powinny zostać usunięte, aby uzyskać

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Morbi lacinia nisi sed mauris rhoncus.

Należy jednak przestrzegać kilku wyjątków.

  • Podwójne znaki nowej linii oznaczają podział akapitu i powinny zostać zachowane.
  • Właściwe rzeczowniki i nazwy nigdy nie są dzielone na dwie linie, chyba że zawierają już myślnik (np. Równania Naviera-Stokesa). Przerwanie linii powinno zostać usunięte, ale myślnik zachowany. Przypadki te można zidentyfikować, wpisując tylko wielką literę.
  • Czasami myślnik wskazuje grupę słów (np. XIX i XX wiek). Kiedy dzieje się to w dwóch liniach, jest to oznaczone wiodącym odstępem w następnym wierszu.

Przykład: (poglądy wyrażone w tym przykładzie są fikcyjne i niekoniecznie odzwierciedlają pogląd autora; przeciwnicy metody Runge-Kutta-Fehlberg są równie mile widziani, aby wziąć udział w tym wyzwaniu)

Differential equations can
be solved with the Runge-Kutta-
Fehlberg method.

Developed in the nineteenth-
 or twentieth century, this
method is completely FANTAS-
TIC.

stanie się

Differential equations can be solved with the Runge-Kutta-Fehlberg method. 

Developed in the nineteenth- or twentieth century, this method is completely FANTASTIC. 

Podziały wiersza mogą być punktami kodowymi ASCII \nlub \r\nASCII, w zależności od preferencji, a łącznik jest prostym ASCII -(znakiem minus). Obsługa UTF-8 nie jest wymagana. To wyzwanie polega na , więc wygrywa najkrótszy kod.

Odpowiedzi:


9

Siatkówka , 58 bajtów

(?<!\n)\n(?!\n)
<space>
- (?! |[A-Z][a-z])| (?= )|(?<=-) (?=[A-Z])
<empty>

<space>reprezentuje pojedynczą spację we własnej linii i <empty>reprezentuje pustą linię końcową. Do celów zliczania każda linia przechodzi do osobnego pliku i \nsą zastępowane rzeczywistymi znakami linii. Dla wygody możesz umieścić wszystkie powyższe w jednym pliku i uruchomić go z -sflagą.

Jestem pewien, że jest na to krótszy sposób, więc poczekam z wyjaśnieniem, aż skończę grać w golfa.


Tak naprawdę chciałem rozwiązać ten problem na Retinie, ale nie chciałem zadzierać z Mono :(
orlp

2

GNU Sed, 68

Wynik obejmuje +2 za -zropcje przekazane do sed.

s/\n\n/:/g
s/-\n([A-Z][a-z])/-\1/g
s/-\n /- /g
s/-\n//g
y/\n:/ \n/

Zakłada, że ​​strumień wejściowy nie zawiera żadnych :znaków. Jeśli nie jest to do przyjęcia, wówczas wszystkie :w kodzie mogą zostać zastąpione innymi znakami ASCII, których nie można wydrukować, np. 0x7 BEL.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.