Welches Zeichen ist diese HTML-Entität?

11

Das Ziel ist wirklich einfach. Wenn Sie eine Zeichenfolge als Eingabe erhalten, analysieren Sie alle HTML-Entitäten, die den folgenden Zeichen entsprechen (einschließlich ihrer Großbuchstabenvarianten):

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

Analyseregeln:

  • Jede Entität beginnt mit &und endet mit;
  • Das erste Zeichen nach dem &wird das geänderte Zeichen sein (Groß- und Kleinschreibung ist wichtig!)
  • Die restlichen Zeichen auf den Namen des Akzent beziehen sich auf verwenden ( acute, grave, circ, tildeund uml). Der Akzentname MUSS in Kleinbuchstaben sein! * *
  • Jede HTML - Entität , die ein Zeichen erzeugt , die nicht auf dieser Liste enthalten ist, oder das ist ungültig, sollte unangetastet bleiben (zB: &, &etilde;, &a;)
  • Numerische Entitäten sollten ignoriert werden, da sie nicht in die obigen Regeln passen

Diese Änderung wurde am 18-02-2016 eingeführt. Alle vorhandenen Antworten, die HTML-Entitäten mit Akzentnamen in Großbuchstaben akzeptieren, sind gültig. Jede zukünftige Antwort muss dieser Regel folgen.

Beispiele:

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

Ausgabe:

Die Ausgabe kann in ISO-8859- X (1-15), Windows-1252 oder UTF-8/16/32 erfolgen.
Sie können eine und nur eine der gültigen Codierungen auswählen und für jede Ausgabe verwenden. Sie können davon ausgehen, dass die Eingabe in ASCII erfolgt.

Eine der folgenden Angaben ist eine gültige Ausgabe für á:

  • á(ISO-8859-1 / 15 oder Windows-1252, entspricht \xE1)
  • á(UTF-8, entspricht \xC3\xA1oder \u00E1)
  • (UTF-8, entspricht a\xCC\x81oder a\u0301)
  • Beliebige Kombination von Diakritika ohne Verwendung von HTML-Entitäten.

Die Ausgabe muss beim Rendern / Anzeigen den Zeichen in der Liste visuell ähnlich sein.


Denken Sie daran, dass alle Standardlücken und integrierten Funktionen * nicht zulässig sind . Da dies , gewinnt die kürzeste Antwort.

* Diese Änderung wurde aufgrund der großen Missbilligung von Boni und Strafen vorgenommen und macht zum Zeitpunkt des Schreibens keine Antwort ungültig

Ismael Miguel
quelle
4
Ich habe nicht gewählt, aber ich gehe davon aus, dass die Abstimmungen darauf zurückzuführen sind, dass die Leute Boni / Strafen nicht wirklich mögen. Am Ende machen sie aus einer Herausforderung mehrere Mini-Herausforderungen.
Kevin W.
1
@ KevinW. Wie ich im Sandkasten erklärt habe, habe ich diese Strafen nur hinterlassen, weil ich sehen möchte, welche coolen eingebauten Sachen die Leute sich einfallen lassen können. Aber natürlich möchte ich nicht allen den Spaß verderben. Wenn ich die Strafe nicht ausdrücken würde, würde eine Antwort wie das von mir gegebene Javascript-Beispiel ausreichen. Und das erforderte überhaupt keine Arbeit.
Ismael Miguel
1
IMHO scheinen die Boni willkürlich zu sein - entweder erlauben oder nicht erlauben, nicht dazwischen gehen.
Addison Crump
1
@IsmaelMiguel Ich schlage keine Boni / Strafen vor - erlaube alle Programmiermethoden, die sie verwenden möchten (natürlich außerhalb der Standard-Lücken) und entferne die Boni / Strafen.
Addison Crump
2
@IsmaelMiguel Nah - das waren alle meine Cent. c:
Addison Crump

Antworten:

4

Japt, 81 75 Bytes

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

Die sechs ?s stehen für nicht druckbare Zeichen. Testen Sie es online!

Hinweis: Dies gibt die dritte Codierungsoption aus. das heißt, der Buchstabe, gefolgt von der rohen UTF-8-Codierung der entsprechenden diakritischen Kombinationsmarke.

Wie es funktioniert

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 des Codes:

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
ETH-Produktionen
quelle
Es scheint gut zu funktionieren. Können Sie bitte einen Hexdump bereitstellen? Sie scheinen dort einige "seltsame" Zeichen zu haben, die möglicherweise nicht in jeder Codierung funktionieren.
Ismael Miguel
@IsmaelMiguel Ich habe gerade festgestellt, dass die Akzente nicht Teil der ISO-8859-1-Codierung sind. Daher habe ich die Zeichenfolge dekomprimiert und auf UTF-8-Bytes umgestellt. Möchten Sie noch einen Hexdump?
ETHproductions
Bis zu Ihnen, aber Ihre vorherige Lösung war vollkommen in Ordnung.
Ismael Miguel
Ich denke, Sie könnten einen kleinen Fehler dort haben, Ihr Code scheint in ÝRuhe zu lassen , aber es sollte in Ý ... geändert werden
daavko
@daavko Hoppla, du hast recht! Jetzt behoben.
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]])

Ich bin Daavkos Beispiel mit diakritischen Zeichen gefolgt, und ich fühle mich wie ein Idiot, weil ich nicht daran gedacht habe, es früher zu verwenden. Wird für JavaScript eigentlich überraschend kurz.

EDIT: Neil hat einige schlimme Fälle von undefiniert gefangen, die jetzt behoben sind.

Mwr247
quelle
Sehen? Ich habe dir gesagt, dass du etwas Fett schneiden könntest! Dies ist eine wirklich überraschende Antwort! Ich hoffe sehr, dass Sie mehr + 1 bekommen
Ismael Miguel
1
Das ist einfach klug. +1
Yytsi
Ich liebe es..! String.prototype.replaceist so lächerlich golfbar für das Durchqueren von Saiten.
Archenoth
Ich bin nicht davon überzeugt, dass dies das Richtige tut É(was auch immer das Richtige ist).
Neil
Leider hat @Neil recht. HTML-Entitäten in Großbuchstaben werden von Browsern als ungültig angesehen. Ich habe jedoch nicht angegeben, dass der Akzentname nur in Kleinbuchstaben geschrieben werden soll. Das ist ganz und gar meine Schuld. Ich werde diese Antwort als gültig und alle bereits veröffentlichten betrachten. Bei jeder neuen Antwort müssen die Akzentnamen jedoch in Kleinbuchstaben angegeben werden.
Ismael Miguel
10

Netzhaut , 115 Bytes

Ich bin neu im Code-Golf, aber ich denke, das könnte funktionieren.
Diese Version wurde vor der ÁEinführung der Regel erstellt, die das Ersetzen von HTML-Entitäten in Großbuchstaben (zum Beispiel ) nicht zulässt .

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

Ganz einfach suchen und ersetzen. Verwendet UTF-8.

Verwendet den Ansatz [Buchstabe] \ xCC \ x [Hex-Code für diakritische Markierung]. Nach jedem relevanten Buchstaben wird eine diakritische Markierung hinzugefügt.

Aus irgendeinem Grund kann die Standardschriftart Droid Sans Mono im Interpreter die Buchstaben "circ" und "uml" nicht richtig rendern. Wenn Sie es über Entwicklertools in etwas wie DejaVu Sans ändern, wird es gut angezeigt. Ich denke, dies ist eine Einschränkung der Schriftart, nicht des Programms. Aber wenn das Programm schuld ist, werde ich versuchen, es zu beheben.

Hier ist eine 129-Byte-Version, die HTML-Entites in Großbuchstaben (zum Beispiel Á) nicht ersetzt.

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

Probieren Sie es online aus!
Probieren Sie es online aus! 129-Byte-Version

daavko
quelle
Gute Verwendung der Marken dort. Ich kann nicht glauben, dass ich nicht daran gedacht habe, dass das zuerst kürzer ist> _ <
Mwr247
@ Mwr247 Danke! Ich suchte nach einem Weg, dies zu tun, da ich es versuchen wollte und die Markierungen nur irgendwo auftauchten ... Ich bin ehrlich überrascht, dass es so kurz ist.
Daavko
1
Nettes Fairplay und Anwendung der Regeln! Ich habe diese Sprache nie gemocht, aber ich liebe diese Antwort wirklich. Sofort +1
Ismael Miguel
Ich habe 115 Bytes gezählt (110 Zeichen + 5 zusätzliche Bytes für die Markierungen).
Mwr247
@ Mwr247 Oh, du hast recht. Ich habe es gerade in ein Textdokument eingefügt und ls -l ausgeführt und es zeigte 116 ... anscheinend hat der Editor am Ende eine zusätzliche neue Zeile hinzugefügt. Ich werde es reparieren.
Daavko
3

JavaScript (ES6), 288 Byte

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

Erstellt ein Zeichentabellenobjekt (mit dem numerischen Basiscode für jedes Zeichen) und verwendet Offsets (oder 0, falls nicht vorhanden), um zu bestimmen, ob eine Entität konvertiert werden soll und wie ihr Zeichencode lautet. Symmetrie bedeutet in den Fällen das Hinzufügen von 32 in Kleinbuchstaben, außer wenn &Yuml;ein anderer Offset für UTF8 verwendet wird.

Mwr247
quelle
Nett! Ich mag Ihren Ansatz sehr, aber 286 Bytes sind etwas lang. Vielleicht gibt es ein paar Dinge, die abgeschnitten werden können? Etwas Fett zu schneiden wäre großartig
Ismael Miguel
@IsmaelMiguel 288 eigentlich; Ich habe gerade festgestellt, dass es &Yuml;in UTF8 tatsächlich eine gibt : Es ist nur an einem seltsamen Ort. Trotzdem dachte ich, ich hätte es ziemlich gut verdichtet und optimiert, da eine wörtliche Ersetzungsliste mehr als doppelt so lang wäre. Sehen Sie etwas, was ich nicht bin?
Mwr247
Nicht wirklich ... Es muss einen besseren Weg geben, Kleinbuchstaben zu schreiben als zu verwenden .toLowerCase(). Dieser Name ist riesig !!! Auch String.fromCharCodekönnen mehrere Parameter übernehmen, oder wie genannt werdenString.fromCharCode.call([...])
Ismael Miguel
1
@IsmaelMiguel Scheint, ich hatte Recht damit, dass es umgeschrieben werden musste, aber falsch, dass es jemand anderes sein musste. Ich finde diese Antwort interessanter, aber die andere ist technisch prägnanter, deshalb habe ich beide getrennt aufgenommen.
Mwr247
1
Nicht lebensverändernd, aber Ihr regulärer Ausdruck enthält keine wörtlichen Buchstaben, sodass er die iFlagge nicht benötigt .
Neil