Processamento de texto # 1: Hifenização

14

fundo

Esta é a primeira parte de um campo de golfe de 3 buracos no processamento de texto. A idéia geral é que, se você pegar um texto de entrada e direcioná-lo através das soluções para os três desafios (com uma pequena quantidade de código de cola), ele cuspirá um parágrafo lindamente formatado. Neste primeiro desafio, sua tarefa é hifenizar um pedaço de texto usando determinados padrões de hifenização.

Entrada

Seu programa deve receber duas entradas de sequência: um pedaço de texto e uma lista de padrões de hifenização. A primeira entrada é simplesmente uma sequência não vazia de caracteres e espaços ASCII imprimíveis; não conterá quebras de linha ou tildes ~. A segunda entrada é uma lista de palavras delimitadas por vírgulas, que consistem em sílabas delimitadas por til de caracteres ASCII em minúsculas. Um exemplo é ex~cel~lent,pro~gram~ming,abil~i~ties.

Resultado

Seu programa deve modificar a primeira entrada da seguinte maneira. Qualquer palavra (substring máximo de caracteres ASCII alfabéticos) cuja versão em minúscula hifenizada for encontrada na segunda entrada deve ser substituída por essa versão hifenizada, mas seu caso deve ser preservado. Com a lista de exemplos acima, se o texto contiver a palavra Excellent, ela será substituída por Ex~cel~lent; no entanto, nãoExcellently deve ser modificado. Sua saída deve ser essa string modificada.

Regras detalhadas e pontuação

Você pode assumir o seguinte sobre as entradas:

  • A primeira entrada não contém espaços, nem espaços iniciais, finais ou repetidos. Não está vazio.
  • A segunda entrada contém pelo menos uma palavra e cada palavra contém pelo menos duas sílabas. Cada sílaba não está vazia.
  • A segunda entrada não contém uma palavra que ocorra como uma sílaba em outra palavra.

Você pode alterar a ordem das duas entradas, se desejado, e, opcionalmente, adicionar uma nova linha à saída.

Você pode escrever uma função ou um programa completo. A contagem de bytes mais baixa vence e as brechas padrão não são permitidas.

Casos de teste

Eles estão listados no formato 1st input [newline] 2nd input [newline] output.

Excellent programming abilities, you work excellently!
ex~cel~lent,pro~gram~ming,abil~i~ties
Ex~cel~lent pro~gram~ming abil~i~ties, you work excellently!

Superman (sometimes incorrectly spelled "Super-man") is super #&%@ing strong.
su~per,some~times,in~cor~rectly,spell~ing
Superman (some~times in~cor~rectly spelled "Su~per-man") is su~per #&%@ing strong.

IncONsISTent caPItalizATIon!
in~con~sis~tent,cap~i~tal~iza~tion
In~cON~sIS~Tent caP~I~tal~izA~TIon!

Such short words.
awk~ward
Such short words.

Digits123 are456cool789.
dig~its,dig~i~tal,are~cool
Dig~its123 are456cool789.

magic magic
ma~gic
ma~gic ma~gic

Qualquer possível erro de hifenização neste desafio é devido a essa ferramenta de hifenização .

Zgarb
fonte
Presumo que a entrada seja ASCII de 7 bits padrão e não uma versão estendida de 8 bits?
orlp
Tudo bem assumir que qualquer caractere não alfanumérico não será contado como uma alteração em uma palavra (por exemplo, uma primeira entrada como #programming!ainda será afetada por uma segunda entrada de pro~gram~ming)? Os números também não contam (ou seja, são permitidos apenas caracteres alfabéticos)?
cole
@orlp Sim, a entrada consiste em caracteres ASCII imprimíveis padrão, conforme listado aqui .
Zgarb
@Cole Caracteres não alfabéticos não fazem parte das palavras (consulte o segundo caso de teste). Os dígitos contam como não alfabéticos, adicionarei um caso de teste sobre isso.
Zgarb 3/09/15
Posso assumir um número máximo de sílabas em uma palavra?
Qwertiy

Respostas:

5

Pip, 60 54 bytes

Fwa^`([A-Za-z]+)`O{aQ'~?'~w@++y}M(LCwQ_RM'~FIb^',Yv)|w

Repositório do GitHub para Pip

Recebe entradas como argumentos da linha de comando (que requer aspas ao redor da entrada 1, supondo que contenha espaços). Nenhuma nova linha final é impressa (adicione um xno final do programa para adicionar um).

Um pouco não-destruído, com comentários:

 ; Split 1st input on runs of letters, including the separators in the results
a^:`([A-Za-z]+)`
 ; Split 2nd input on commas
b^:',
 ; Iterate over the words w in that list
Fwa {
  ; Filter b for entries that match the current word (lowercase, with tildes removed)
 m:(LCw EQ _RM'~)FIb
  ; We expect this to be a list of 0 or 1 elements
  ; If it has one, m gets that element (the hyphenation pattern); if it's empty, m gets nil
 i:-1
 m:m@i
  ; Map this function to each character of pattern m: if it's tilde, return tilde;
  ; otherwise, return corresponding character of w
 m:{aEQ'~ ? '~ w@++i}Mm
  ; Output the result, unless it was nil (falsey), in which case output the original word
 Om|w
}

Exemplo de execução:

C:\Users\dlosc> pip.py hyphens.pip "IncONsISTent caPItalizATIon!" in~con~sis~tent,cap~i~tal~iza~tion
In~cON~sIS~Tent caP~I~tal~izA~TIon!
DLosc
fonte
8

Retina , 88 bytes

+is`(?<![a-z~])([a-z~]+)(?=([a-z]+)+[^a-z~].*(?<=[\n,]\1(?(2)!)(?<-2>~\2)+[\n,]))
$1~
\n.*
<empty>

Para fins de contagem, cada linha entra em um arquivo separado, \né substituída por caracteres de nova linha reais e <empty>é um arquivo vazio. Por conveniência, você pode executar o código acima a partir de um único arquivo (onde <empty>há uma linha vazia) se você usar o -ssinalizador de intérprete.

Martin Ender
fonte
2

Javascript ES6, 117 141 caracteres

f=(t,p)=>p.split`,`.map(p=>t=t.replace(RegExp("((?:^|[^a-z])"+p.replace(/~/g,")(")+")(?=$|[^a-z])","ig"),(...x)=>x.slice(1,-2).join("~")))&&t

Teste:

document.querySelector(".question pre").textContent.split("\n\n").map(t=>(t=t.split("\n"))&&f(t[0],t[1])==t[2])
// Array [ true, true, true, true, true ]
Qwertiy
fonte
Você pode usar eval em vez do construtor RegExp. Modelos de corda também pode economizar alguns bytes
Downgoat
1

Javascript (ES6), 173 169

Pesquisa e Regex Básica

(a,b)=>(b.split`,`.map(s=>a=a.replace(eval(`/(^|[^a-z])(${s.replace(/~/g,"")})(?=[^a-z]|$)/gi`),(_,n,o)=>(x=0,n+s.split``.map((q,i)=>(q=='~'&&++x?q:o[i-x])).join``))),a)

Violino

Edit: Corrigido bug para o caso de teste magic magic,ma~gic

DankMemes
fonte
Errado: f("magic magic", "ma~gic")retorna"ma~gic magic"
Qwertiy
@Qwertiy fixed. De alguma forma, corrigi-lo me salvou 4 bytes também!
DankMemes #
0

Perl, 146

$a=<>;$d=$_=~s/~//rg,$a=~s/(?<!\pL)$d(?!\pL)/h($&,$_)/gie for(split/,|\n/,<>);
print$a;
sub h{($g,$h)=@_;while($h=~/~/g){substr($g,"@-",0)='~'}$g}

Apenas uma primeira tentativa, muitas coisas podem ser encurtadas - continuará amanhã!

Jarmex
fonte