Quel caractère est cette entité HTML?

11

Le but est vraiment simple. En recevant une chaîne en entrée, analysez toutes les entités HTML qui correspondent aux caractères suivants (y compris leurs variantes majuscules):

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

Règles d'analyse:

  • Chaque entité commence par &et se termine par;
  • Le premier caractère après le &sera le caractère modifié (la casse est importante!)
  • Les caractères restants font référence au nom de l'accent à utiliser ( acute, grave, circ, tildeet uml). Le nom d'accent DOIT être en minuscules! *
  • Toute entité HTML qui produit un caractère qui ne figure pas sur cette liste, ou qui est invalide, doit être laissée intacte (ex: &, &etilde;, &a;)
  • Les entités numériques doivent être ignorées, car elles ne correspondent pas aux règles ci-dessus

Cette modification a été introduite le 18-02-2016. Toutes les réponses existantes qui acceptent les entités HTML avec des noms d'accent majuscules sont valides. Toute réponse future doit suivre cette règle.

Exemples:

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

Production:

La sortie peut être en ISO-8859- X (1-15), windows-1252 ou UTF-8/16/32.
Vous pouvez choisir un et un seul des encodages valides et l'utiliser pour n'importe quelle sortie. Vous pouvez supposer en toute sécurité que l'entrée sera en ASCII.

L'un des éléments suivants est une sortie valide pour á:

  • á(ISO-8859-1 / 15 ou windows-1252, équivalent à \xE1)
  • á(UTF-8, équivalent à \xC3\xA1ou \u00E1)
  • (UTF-8, équivalent à a\xCC\x81ou a\u0301)
  • Toute combinaison de signes diacritiques, sans utiliser d'entités HTML.

La sortie doit être visuellement similaire, lorsqu'elle est rendue / affichée, aux caractères de la liste.


N'oubliez pas que toutes les failles standard et intégrées * sont interdites . Puisqu'il s'agit de , la réponse la plus courte l'emporte.

* Ce changement a été effectué en raison de la grande désapprobation des bonus et pénalités, et au moment de la rédaction, n'invalide aucune réponse

Ismael Miguel
la source
4
Je n'ai pas voté, mais je suppose que les votes négatifs sont parce que les gens n'aiment pas vraiment les bonus / pénalités - Ils finissent par faire un défi en plusieurs mini-défis.
Kevin W.
1
@KevinW. Comme je l'ai expliqué dans le bac à sable, je n'ai laissé ces pénalités que parce que je veux voir ce que les gens peuvent trouver avec des trucs intégrés sympas. Mais évidemment, je ne veux pas gâcher le plaisir de tout le monde. Si je ne mettais pas la pénalité, une réponse comme l'exemple Javascript que j'ai donné serait suffisante. Et cela ne nécessitait aucun travail.
Ismael Miguel
1
À mon humble avis, les bonus semblent arbitraires - autoriser ou non, ne pas aller entre les deux.
Addison Crump
1
@IsmaelMiguel Je ne suggère aucun bonus / pénalité - autorisez les méthodes de programmation qu'ils souhaitent utiliser (en dehors des échappatoires standard, bien sûr) et supprimez les bonus / pénalités.
Addison Crump
2
@IsmaelMiguel Nah - c'était tout pour moi. c:
Addison Crump

Réponses:

4

Japt, 81 75 octets

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

Les six ?s représentent des caractères non imprimables. Testez-le en ligne!

Remarque: Cela génère la troisième option d'encodage; c'est-à-dire la lettre suivie du codage UTF-8 brut de la marque diacritique combinée correspondante.

Comment ça fonctionne

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 du code:

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
la source
Cela semble bien fonctionner. Pouvez-vous fournir un hexdump? Vous semblez avoir là quelques caractères "étranges" qui peuvent ne pas fonctionner dans tous les encodages.
Ismael Miguel
@IsmaelMiguel Je viens de réaliser que les accents ne font pas partie du codage ISO-8859-1; ainsi, j'ai décompressé la chaîne et je suis passé aux octets UTF-8. Souhaitez-vous toujours un hexdump?
ETHproductions
À vous de voir, mais votre solution précédente était parfaitement bien.
Ismael Miguel
Je pense que vous pourriez avoir un petit bug là-bas, votre code semble laisser Ýseul, mais il devrait être changé en Ý ...
daavko
@daavko Oups, vous avez raison! Fixé maintenant.
ETHproductions
12

JavaScript (ES6), 141 122 134 octets

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

J'ai suivi l'exemple de daavko en utilisant des signes diacritiques, et je me sens comme un idiot de ne pas penser à l'utiliser plus tôt. En fait, il devient étonnamment court pour JavaScript.

EDIT: Neil a détecté de mauvais cas d'indéfinis, qui sont maintenant corrigés.

Mwr247
la source
Voir? Je t'ai dit que tu pouvais couper du gras! C'est une réponse vraiment surprenante! J'espère vraiment que vous obtiendrez plus de +1
Ismael Miguel
1
C'est juste intelligent. +1
Yytsi
J'aime cela..! String.prototype.replaceest tellement ridiculement jouable au golf pour la traversée des cordes.
Archenoth
Je ne suis pas convaincu que cela fasse la bonne chose É(quelle que soit la bonne chose).
Neil
Malheureusement, @Neil a raison. Les entités HTML majuscules sont considérées comme non valides par les navigateurs. Mais, je n'ai pas spécifié que le nom d'accent devrait être tout en minuscules. C'est entièrement ma faute. Je considérerai cette réponse comme valable et toutes celles qui ont déjà été postées. Mais toute nouvelle réponse doit avoir les noms d'accent en minuscules.
Ismael Miguel
10

Rétine , 115 octets

Je suis nouveau au code-golf, mais je pense que cela pourrait fonctionner.
Cette version a été faite avant la règle, qui ne permet pas de remplacer les entités html majuscules (par exemple Á) a été introduite.

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

Recherche et remplacement assez simples. Utilise UTF-8.

Utilise l'approche [lettre] \ xCC \ x [code hexadécimal diacritique]. La marque diacritique est ajoutée après chaque lettre pertinente.

Pour une raison quelconque, la police Droid Sans Mono par défaut dans l'interpréteur ne peut pas rendre correctement les lettres "circ" et "uml". Si vous le modifiez via des outils de développement pour quelque chose comme DejaVu Sans, cela se montre très bien. Je pense que c'est une limitation de la police, pas du programme. Mais si c'est la faute du programme, je vais essayer de le réparer.

Voici une version de 129 octets, qui ne remplace pas les entites HTML majuscules (par exemple Á)

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

Essayez-le en ligne!
Essayez-le en ligne! Version 129 octets

daavko
la source
Grande utilisation des marques là-bas. Je ne peux pas croire que je ne pensais pas que
c'était
@ Mwr247 Merci! Je cherchais un moyen de le faire, car je voulais essayer de le faire et les marques sont apparues quelque part ... Je suis honnêtement surpris que ce soit si court.
daavko
1
Beau fair-play et utilisation des règles! Je n'ai jamais aimé cette langue, mais j'aime vraiment cette réponse. Instantané +1
Ismael Miguel
J'ai compté 115 octets (110 caractères + 5 octets supplémentaires pour les marques).
Mwr247
@ Mwr247 Oh, vous avez raison. Je viens de le coller dans un document texte et j'ai exécuté ls -l et il a montré 116 ... semble l'éditeur a ajouté une nouvelle ligne supplémentaire à la fin. Je le réparerai.
daavko
3

JavaScript (ES6), 288 octets

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))

Crée un objet de mappage de caractères (avec le code numérique de base pour chaque caractère) et utilise des décalages (ou 0 s'il n'existe pas) pour déterminer si une entité doit être convertie et quel est son code de caractère. La symétrie dans les cas signifie ajouter 32 en minuscules, sauf pour Ÿ, où il utilise un décalage différent pour UTF8.

Mwr247
la source
Agréable! J'aime beaucoup votre approche, mais 286 octets, c'est un peu long. Peut-être qu'il y a quelques éléments qui peuvent être supprimés? Couper un peu de graisse serait super
Ismael Miguel
@IsmaelMiguel 288 en fait; Je viens de réaliser qu'il y a en fait un ŸUTF8: c'est juste dans un endroit bizarre. Tout de même, je pensais avoir condensé et optimisé plutôt bien, étant donné qu'une liste de remplacement littérale serait plus de deux fois plus longue. Voyez-vous quelque chose que je ne suis pas?
Mwr247
Pas vraiment ... Il doit y avoir une meilleure façon de faire des lettres minuscules que d'utiliser .toLowerCase(). Ce nom est ÉNORME !!! En outre, String.fromCharCodepeut accepter plusieurs paramètres ou être appelé commeString.fromCharCode.call([...])
Ismael Miguel
1
@IsmaelMiguel Semble avoir raison d'avoir besoin d'une réécriture, mais tort d'avoir besoin d'être quelqu'un d'autre. Je pense que cette réponse est plus intéressante, mais l'autre est techniquement plus concise, donc je les ai incluses séparément.
Mwr247
1
Cela ne change pas la vie, mais votre expression rationnelle ne contient aucune lettre littérale, elle n'a donc pas besoin du idrapeau.
Neil