Удалить переносы


15

Время для нового испытания! Это общая проблема при копировании между различными форматами документов: переносы. Хотя это уменьшает шероховатость выровненного по левому краю макета или выравнивает интервалы в выровненном макете, это полная боль, когда ваш PDF-файл создан неправильно и сохраняет дефисы в макете, что затрудняет редактирование или переформатирование скопированного текста.

К счастью, если верить бесчисленным книгам о самопомощи, ничто не является проблемой, если вы считаете это проблемой. Я полагаю, что в этих книгах по самосовершенствованию все без исключения упоминаются PPCG, где любая проблема будет решена, если ее представить в качестве задачи. Ваша задача - удалить из текста оскорбительные переносы и переносы строк, чтобы его можно было вставить в любой текстовый редактор.

Описание проблемы

Вы напишите программу или функцию, которая удаляет переносы и переносы строк, где это применимо. На входе будет строка stdin(или ближайшая альтернатива) или функция ввода. Выход (на stdoutили ближайший альтернативном или функцию вывода) будет «исправлено» текст. Этот текст должен быть непосредственно копируемым. Это означает, что начальный или конечный вывод в порядке, но дополнительный вывод наполовину исправленного текста (например, начальные пробелы в каждой строке) - нет .

Наиболее простой случай следующий (примечание: без пробелов)

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

Оскорбительный дефис и разрывы строк должны быть удалены, чтобы получить

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

Однако следует соблюдать несколько исключений.

  • Двойные строки указывают на разрыв абзаца и должны быть сохранены.
  • Собственные существительные и имена никогда не разбиваются на две строки, если они уже не содержат дефис (например, уравнения Навье-Стокса). Разрыв строки должен быть удален, но дефис сохранен. Эти случаи можно определить, указав только первую букву.
  • Иногда дефис обозначает слово группа (например, девятнадцатый и двадцатый век). Когда это происходит через две строки, это обозначается пробелом на следующей строке.

Пример: (взгляды, выраженные в этом примере, являются вымышленными и не обязательно отражают точку зрения автора; противники метода Рунге-Кутта-Фельберга также могут принять участие в этом вызове)

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

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

станет

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

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

В зависимости от ваших предпочтений разрывы строк могут быть либо кодовой точкой ASCII, \nлибо \r\nASCII, а дефис - это простой ASCII -(знак минус). Поддержка UTF-8 не требуется. Эта задача - , поэтому выигрывает самый короткий код.

Ответы:


9

Сетчатка , 58 байт

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

<space>представляет один пробел в своей строке и <empty>представляет собой пустую завершающую строку. В целях подсчета каждая строка помещается в отдельный файл и \nзаменяется фактическими символами перевода строки. Для удобства вы можете поместить все вышеперечисленное в один файл и запустить его с -sфлагом.

Я почти уверен, что есть более короткий способ сделать это, поэтому я подожду объяснений, пока не закончу играть в гольф.


Я действительно хотел заняться этим в Retina, но не хотел связываться с Mono :(
orlp

2

GNU Sed, 68

Оценка включает в себя +2 за -zr опций, переданных sed.

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

Предполагается, что входной поток не содержит :символов. Если это неприемлемо, то :все символы в коде могут быть заменены другим непечатаемым символом ASCII, например 0x7 BEL.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.