Que caractere é essa entidade HTML?

11

O objetivo é realmente simples. Recebendo uma sequência como entrada, analise todas as entidades HTML que correspondem aos seguintes caracteres (incluindo suas variantes em maiúsculas):

áàãâäéèêëíìîïóòõôöúùûüýÿ

Regras de análise:

  • Cada entidade começa com &e termina com;
  • O primeiro caractere após o &será o caractere modificado (maiúsculas e minúsculas são importantes!)
  • Os restantes caracteres referem-se ao nome do acento para usar ( acute, grave, circ, tildee uml). O nome do acento DEVE estar em minúsculas! *
  • Qualquer entidade HTML que produz um caractere que não está nessa lista, ou que é inválido, deve ser deixado intocado (Ex: &, &etilde;, &a;)
  • Entidades numéricas devem ser ignoradas, pois não se enquadram nas regras acima

Esta alteração foi introduzida em 18-02-2016. Todas as respostas existentes que aceitam entidades HTML com nomes de acento em maiúsculas são válidas. Qualquer resposta futura deve seguir esta regra.

Exemplos:

á //á
Téhèh //Téhèh
an & //an &

Resultado:

A saída pode estar em ISO-8859- X (1-15), windows-1252 ou UTF-8/16/32.
Você pode escolher uma e apenas uma das codificações válidas e usá-la para qualquer saída. Você pode assumir com segurança que a entrada estará em ASCII.

Qualquer uma das seguintes opções é uma saída válida para á:

  • á(ISO-8859-1 / 15 ou windows-1252, equivalente a \xE1)
  • á(UTF-8, equivalente a \xC3\xA1ou \u00E1)
  • (UTF-8, equivalente a a\xCC\x81ou a\u0301)
  • Qualquer combinação de sinais diacríticos, sem usar entidades HTML.

A saída deve ser visualmente semelhante, quando renderizada / exibida, aos caracteres da lista.


Lembre-se de que todas as brechas padrão e os embutidos * não são permitidos . Como se trata de , a resposta mais curta vence.

* Essa alteração foi feita devido à grande reprovação de bônus e penalidades e, no momento da redação, não invalida nenhuma resposta

Ismael Miguel
fonte
4
Não votei, mas presumo que os votos negativos sejam porque as pessoas realmente não gostam de bônus / penalidades - elas acabam transformando um desafio em vários mini-desafios.
Kevin W.
1
@KevinW. Como expliquei na sandbox, só deixei essas penalidades porque quero ver o que as coisas internas legais podem trazer. Mas, obviamente, não quero estragar a diversão de todos. Se eu não colocasse a penalidade, uma resposta como o exemplo de Javascript que dei, seria suficiente. E isso não exigia nenhum trabalho.
Ismael Miguel
1
IMHO, os bônus parecem arbitrários - permitir ou não permitir, não entre.
Addison Crump
1
@IsmaelMiguel Sugiro que não haja bônus / penalidades - permita quaisquer métodos de programação que desejem usar (fora das brechas padrão, é claro) e remova os bônus / penalidades.
Addison Crump
2
@IsmaelMiguel Nah - esses eram todos os meus centavos. c:
Addison Crump

Respostas:

4

Japonês, 81 75 bytes

Ur`&([%vYy](ac©e|uml)|%v(g?ve|circ)|[AaOo]Èìe);`@Yg +'Ì+"?????"g"gutca"bYgJ

Os seis ?s representam caracteres não imprimíveis. Teste online!

Nota: Isso gera a terceira opção de codificação; isto é, a letra seguida pela codificação UTF-8 bruta da marca diacrítica combinada correspondente.

Como funciona

Ur"&(    );"       // Replace each ampersand and semicolon that have one of these between them:
([%vYy](acute|uml) //  A vowel or Yy followed by "acute" or "uml",
|%v(grave|circ)    //  or a vowel followed by "grave" or "circ",
|[AaOo]tilde       //  or "a" or "o" followed by "tilde";
@                  // replace each match X and its middle Y with this function:
""g"gutca"bYgJ     //  Take the unprintable at index (index of the second char in Y in "gutca") in this string.
Yg +'Ì+            //  Concatenate the first char in Y and "Ì" to the beginning.
                   // Implicit output

Hexdump do código:

00000000: 55 72 60 26 28 5b 25 76 59 79 5d 28 61 63 a9 65  Ur`&([%vYy](ac©e
00000010: 7c 75 6d 6c 29 7c 25 76 28 67 9f 76 65 7c 63 69  |uml)|%v(g.ve|ci
00000020: 72 63 29 7c 5b 41 61 4f 6f 5d c8 ec 65 29 3b 60  rc)|[AaOo]Èìe);`
00000030: 40 59 67 20 2b 27 cc 2b 22 80 81 82 83 88 22 67  @Yg +'Ì+"....."g
00000040: 22 67 75 74 63 61 22 62 59 67 4a                 "gutca"bYgJ
ETHproductions
fonte
Parece funcionar bem. Você pode fornecer um hexdump? Você parece ter alguns caracteres "estranhos" que podem não funcionar em todas as codificações.
Ismael Miguel
@IsmaelMiguel Acabei de perceber que os acentos não fazem parte da codificação ISO-8859-1; portanto, descompactei a string e mudei para UTF-8 bytes. Você ainda gostaria de um hexdump?
ETHproductions
Depende de você, mas sua solução anterior estava perfeitamente correta.
Ismael Miguel
Eu acho que você pode ter um pequeno bug lá, seu código parece deixar Ýsozinho, mas ele deve ser alterado para Y ...
daavko
@daavko Opa, você está certo! Corrigido agora.
ETHproductions
12

JavaScript (ES6), 141 122 134 bytes

a=>a.replace(/&([aeiouyAEIOUY](acute|uml)|[aeiouAEIOU](grave|circ)|[aoAO]tilde);/g,b=>b[1]+{g:"̀",a:"́",c:"̂",t:"̃",u:"̈"}[b[2]])

Segui o exemplo de daavko usando marcas diacríticas e me sinto um idiota por não pensar em usá-lo mais cedo. Na verdade, é surpreendentemente curto para JavaScript.

Edição: Neil pegou alguns casos ruins de indefinido, que agora estão corrigidos.

Mwr247
fonte
Vejo? Eu te disse que você poderia cortar um pouco de gordura! Esta é uma resposta realmente surpreendente! Espero que você consiga mais +
1s
1
Isso é apenas inteligente. +1
Yytsi 17/02
Eu amo isso..! String.prototype.replaceé tão ridiculamente jogável para travessia de cordas.
Archenoth 17/02
Não estou convencido de que isso faça a coisa certa É(seja lá o que for).
Neil
Infelizmente, @Neil está certo. Entidades HTML maiúsculas são consideradas inválidas pelos navegadores. Mas não especifiquei que o nome do acento deveria estar em letras minúsculas. Isso é totalmente minha culpa. Considerarei esta resposta válida e todas as que já foram publicadas. Mas qualquer nova resposta deve ter os nomes de sotaque em minúsculas.
Ismael Miguel
10

Retina , 115 bytes

Eu sou novo no código-golfe, mas acho que isso pode funcionar.
Esta versão foi criada antes da Áintrodução da regra, que não permite a substituição de entidades html maiúsculas (por exemplo ).

i`&([aeiouy])acute;
$1́
i`&([aeiou])grave;
$1̀
i`&([ao])tilde;
$1̃
i`&([aeiou])circ;
$1̂
i`&([aeiouy])uml;
$1̈

Pesquisa bastante simples e substitua. Usa UTF-8.

Usa a abordagem [letra] \ xCC \ x [código hexadecimal de marca diacrítica]. A marca diacrítica é adicionada após cada letra relevante.

Por alguma razão, a fonte Droid Sans Mono padrão no intérprete não pode processar as letras "circ" e "uml" corretamente. Se você alterá-lo através de ferramentas de desenvolvedor para algo como DejaVu Sans, isso mostra muito bem. Eu acho que isso é uma limitação da fonte, não do programa. Mas se a culpa for do programa, tentarei corrigi-lo.

Aqui está uma versão de 129 bytes, que não substitui os caracteres HTML maiúsculos (por exemplo Á)

&([aeiouyAEIOUY])acute;
$1́
&([aeiouAEIOU])grave;
$1̀
&([aoAO])tilde;
$1̃
&([aeiouAEIOU])circ;
$1̂
&([aeiouyAEIOUY])uml;
$1̈

Experimente online!
Experimente online! Versão de 129 bytes

daavko
fonte
Grande uso das marcas lá. Não posso acreditar que eu não pensei que isso fosse mais curto no início> _ <#
Mwr247
@ Mwr247 Obrigado! Eu estava procurando uma maneira de fazer isso, já que queria tentar e as marcas apareceram em algum lugar ... Estou sinceramente surpreso que seja tão curto.
Daavko
1
Jogo limpo e bom uso das regras! Eu nunca gostei desse idioma, mas realmente estou adorando esta resposta. Instantâneo +1
Ismael Miguel
Contei 115 bytes (110 caracteres + 5 bytes extras para as marcas).
Mwr247
@ Mwr247 Oh, você está certo. Eu apenas colei em um documento de texto e executei ls -l e mostrou 116 ... parece que o editor adicionou uma nova linha extra no final. Eu resolvo isso.
Daavko
3

JavaScript (ES6), 288 bytes

a=>(z=(b,c=1,d=2,e=3,f=0,g=4)=>({b:b+191,grave:c,acute:d,circ:e,tilde:f,uml:g}),y={a:z(0,1,2,3,4,5),e:z(8),i:z(12),o:z(18,1,2,3,4,5),u:z(25),y:z(28,0,2,0)},a.replace(/&\w+;/gi,b=>(x=y[b[1].toLowerCase()])&&(w=x[b.slice(2,-1)])?String.fromCharCode(x.b+w+32*(b[1]>'_')+153*/Yu/.test(b)):b))

Cria um objeto de mapa de caracteres (com o código numérico base para cada caractere) e usa deslocamentos (ou 0, se não existentes) para determinar se uma entidade deve ser convertida e qual é o código de caractere. Simetria nos casos significa adicionar 32 se estiver em minúscula, exceto &Yuml;onde ele usa um deslocamento diferente para UTF8.

Mwr247
fonte
Agradável! Eu realmente gosto da sua abordagem, mas 286 bytes são um pouco longos. Talvez haja algumas coisas que podem ser cortadas? Aparar um pouco de gordura seria ótimo
Ismael Miguel
@IsmaelMiguel 288 na verdade; Acabei de perceber que de fato existe um &Yuml;em UTF8: é apenas em um lugar estranho. Mesmo assim, eu pensei que havia condensado e otimizado bastante, considerando que uma lista de substituições literal seria duas vezes maior. Você está vendo algo que eu não sou?
Mwr247
Na verdade não ... Deve haver uma maneira melhor de escrever letras minúsculas do que usar .toLowerCase(). Esse nome é enorme !!! Além disso, String.fromCharCodepode aceitar vários parâmetros, ou ser chamado comoString.fromCharCode.call([...])
Ismael Miguel
1
@IsmaelMiguel Parece que eu estava certo sobre precisar reescrever, mas errado sobre precisar ser outra pessoa. Acho que essa resposta é mais interessante, mas a outra é tecnicamente mais concisa, por isso incluí as duas separadamente.
Mwr247
1
Não muda a vida, mas seu regexp não contém letras literais, portanto não precisa da ibandeira.
Neil