Видаліть дефіс


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. 

Розриви рядків можуть бути \nабо \r\nкодовою точкою ASCII, залежно від ваших уподобань, а дефіс - це простий 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.