Xóa dấu gạch nối


15

Thời gian cho một thách thức mới ! Đây là một vấn đề phổ biến khi dán sao chép giữa các định dạng tài liệu khác nhau: gạch nối. Mặc dù nó làm giảm sự rách rưới của bố cục căn lề trái hoặc tăng khoảng cách trong bố cục hợp lý, nhưng đó là một nỗi đau hoàn toàn khi PDF của bạn không được xây dựng chính xác và giữ lại các dấu gạch nối trong bố cục, khiến văn bản sao chép của bạn khó chỉnh sửa hoặc chỉnh lại.

May mắn thay, nếu chúng ta tin vào vô số sách tự giúp đỡ ngoài kia, không có gì là vấn đề nếu bạn coi đó là một thách thức. Tôi tin rằng những cuốn sách tự giúp đỡ này không có ngoại lệ đề cập đến PPCG, nơi mọi vấn đề sẽ được giải quyết nếu được đưa ra như một thách thức. Nhiệm vụ của bạn là loại bỏ gạch nối vi phạm và ngắt dòng khỏi văn bản, để nó sẵn sàng dán vào bất kỳ trình soạn thảo văn bản nào.

Mô tả vấn đề

Bạn sẽ viết một chương trình hoặc chức năng loại bỏ gạch nối và ngắt dòng nếu có. Đầu vào sẽ là một chuỗi trên stdin(hoặc thay thế gần nhất) hoặc là một đầu vào chức năng. Đầu ra (trên stdouthoặc thay thế gần nhất hoặc đầu ra chức năng) sẽ là văn bản 'được sửa'. Văn bản này nên được sao chép trực tiếp . Điều này có nghĩa là đầu ra dẫn đầu hoặc theo dõi là OK, nhưng đầu ra bổ sung giữa chừng văn bản đã sửa của bạn (ví dụ: khoảng trắng hàng đầu trên mỗi dòng) thì không .

Trường hợp cơ bản nhất là như sau (lưu ý: không có dấu cách)

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

Các dấu gạch nối và ngắt dòng vi phạm nên được loại bỏ, để có được

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

Tuy nhiên, một vài trường hợp ngoại lệ nên được quan sát.

  • Dòng mới đôi cho thấy một đoạn ngắt, và nên được giữ lại.
  • Danh từ và tên thích hợp không bao giờ bị phá vỡ trên hai dòng, trừ khi chúng đã có dấu gạch nối (ví dụ: phương trình Navier-Stokes). Ngắt dòng nên được loại bỏ, nhưng dấu gạch nối được giữ lại. Những trường hợp này có thể được xác định bằng cách chỉ viết hoa chữ cái đầu tiên.
  • Đôi khi, một dấu gạch nối chỉ một nhóm từ (ví dụ thế kỷ XIX và thế kỷ XX). Khi điều này xảy ra trên hai dòng, điều này được chỉ định bằng một khoảng trắng ở dòng tiếp theo.

Một ví dụ: (các quan điểm thể hiện trong ví dụ này là hư cấu và không nhất thiết thể hiện quan điểm của tác giả; những người phản đối phương pháp Runge-Kutta-Fehlberg đều được hoan nghênh tham gia vào thử thách này)

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

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

sẽ trở thành

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

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

Các dấu ngắt dòng có thể là điểm mã \nhoặc \r\nASCII tùy theo sở thích của bạn và dấu gạch nối là một ASCII đơn giản -(dấu trừ). Không cần hỗ trợ UTF-8. Thử thách này là , vì vậy đoạn mã ngắn nhất sẽ thắng.

Câu trả lời:


9

Võng mạc , 58 byte

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

<space>đại diện cho một không gian duy nhất trên dòng riêng của nó và <empty>đại diện cho một dòng dấu trống. Đối với mục đích đếm, mỗi dòng đi vào một tệp riêng biệt và \nđược thay thế bằng các ký tự dòng thực tế. Để thuận tiện, bạn có thể đặt tất cả các mục trên vào một tệp duy nhất và chạy nó với -scờ.

Tôi khá chắc chắn rằng có một cách ngắn hơn để làm điều này, vì vậy tôi sẽ chờ một lời giải thích cho đến khi tôi chơi golf xong.


Tôi thực sự muốn giải quyết vấn đề này ở Retina, nhưng không muốn gây rối với Mono :(
orlp

2

GNU Sed, 68

Điểm bao gồm +2 cho -zrcác tùy chọn được chuyển đến sed.

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

Giả sử rằng luồng đầu vào không chứa bất kỳ :ký tự nào . Nếu điều này không được chấp nhận, thì :tất cả các mã trong mã có thể được thay thế bằng một số ký tự ASCII không thể in khác, ví dụ 0x7 BEL.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.