Remova a hifenização

15

Hora de um novo desafio de ! É um problema comum ao copiar e colar entre vários formatos de documento: hifenização. Embora reduza a irregularidade de um layout alinhado à esquerda ou reduza o espaçamento em um layout justificado, é uma dor completa quando o PDF não é construído adequadamente e retém os hífens no layout, dificultando a edição ou refluxo do texto copiado.

Felizmente, se acreditarmos nos inúmeros livros de auto-ajuda existentes, nada será um problema se você o encarar como um desafio. Acredito que esses livros de auto-ajuda, sem exceção, se referem ao PPCG, onde qualquer problema será resolvido se for apresentado como um desafio. Sua tarefa é remover a hifenização e as quebras de linha ofensivas de um texto, para que esteja pronto para colar em qualquer editor de texto.

Descrição do Problema

Você escreverá um programa ou função que remove hifenização e quebras de linha, quando aplicável. A entrada será uma string stdin(ou a alternativa mais próxima) ou como uma entrada de função. A saída ( saídastdout alternativa ou função mais próxima) será o texto 'corrigido'. Este texto deve ser diretamente copiável e colável. Isso significa que a saída inicial ou final está OK, mas a saída adicional na metade do texto corrigido (por exemplo, espaços iniciais em todas as linhas) não está .

O caso mais básico é o seguinte (nota: sem espaços à direita)

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

O hífen e as quebras de linha ofensivas devem ser removidos, para obter

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

No entanto, algumas exceções devem ser observadas.

  • Novas linhas duplas indicam uma quebra de parágrafo e devem ser mantidas.
  • Nomes e nomes próprios nunca são divididos em duas linhas, a menos que já contenham um hífen (por exemplo, equações de Navier-Stokes). A quebra de linha deve ser removida, mas o hífen é mantido. Esses casos podem ser identificados com apenas a primeira letra maiúscula.
  • Às vezes, um hífen indica um grupo de palavras (por exemplo, século XIX e XX). Quando isso acontece em duas linhas, isso é indicado com um espaço à esquerda na próxima linha.

Um exemplo: (as opiniões expressas neste exemplo são fictícias e não representam necessariamente a visão do autor; os oponentes do método Runge-Kutta-Fehlberg são igualmente bem-vindos a participar desse desafio)

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

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

se tornará

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

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

As quebras de linha podem ser o ponto de código \nou \r\nASCII, dependendo da sua preferência, e o hífen é um ASCII simples -(sinal de menos). O suporte UTF-8 não é necessário. Esse desafio é o , então o código mais curto vence.

Sanchises
fonte

Respostas:

9

Retina , 58 bytes

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

<space>representa um espaço único em sua própria linha e <empty>representa uma linha de fuga vazia. Para fins de contagem, cada linha entra em um arquivo separado e \né substituída por caracteres reais de avanço de linha. Por conveniência, você pode colocar todos os itens acima em um único arquivo e executá-lo com a -sbandeira.

Tenho certeza de que há uma maneira mais curta de fazer isso, então esperarei com uma explicação até terminar o golfe.

Martin Ender
fonte
Na verdade, eu queria enfrentar esse na Retina, mas não queria mexer com Mono :(
orlp 16/16/15
2

GNU Sed, 68

A pontuação inclui +2 para as -zropções passadas para sed.

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

Supõe que o fluxo de entrada não contenha nenhum :caractere. Se isso não for aceitável, :todos os códigos no código poderão ser substituídos por algum outro caractere ASCII não imprimível, por exemplo, 0x7 BEL.

Trauma Digital
fonte
2

TeaScript , 76 bytes

xB(`([A-Z][a-z]+-)
(\\S)`,b="$1$2",`(\\S)-
(\\S)`,b,`(\\S-?)
 ?(.)`,"$1 $2")

Método muito "força bruta".

Experimente online

Downgoat
fonte