そのHTMLエンティティは何のキャラクターですか?


11

目標は本当にシンプルです。入力として文字列を受け取り、次の文字(大文字のバリアントを含む)に対応するすべてのHTMLエンティティを解析します。

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

解析ルール:

  • 各エンティティは次で始まり、次&で終わる;
  • の後の最初の文字&は変更された文字になります(大文字と小文字が重要です!)
  • 残りの文字は、(使用アクセントの名前を参照してacutegravecirctildeおよびuml)。アクセント名小文字でなければなりません!*
  • そのリストにない文字を生成、またはそれが無効である任意のHTMLエンティティは、手つかずのままにしておく必要があり(例:&&etilde;&a;
  • 数値エンティティは上記のルールに適合しないため、無視する必要があります

この変更は、2016年2月18日に導入されました。大文字のアクセント名を持つHTMLエンティティを受け入れる既存の回答はすべて有効です。今後の回答は、このルールに従う必要があります。

例:

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

出力:

出力は、ISO-8859- X(1-15)、windows-1252、またはUTF-8 / 16/32になります。有効なエンコーディングを1つだけ
選択して、任意の出力に使用できます。入力はASCIIであると安全に想定できます。

次のいずれかが有効な出力ですá

  • á(ISO-8859-1 / 15またはwindows-1252、に相当\xE1
  • á(UTF-8と同等\xC3\xA1または\u00E1
  • (UTF-8と同等a\xCC\x81またはa\u0301
  • HTMLエンティティを使用しない、発音区別記号の任意の組み合わせ。

出力は、レンダリング/表示するときに、リスト上の文字と視覚的に類似している必要があります。


すべての標準的な抜け穴とビルトイン *は許可されていません。これはであるため、最短の回答が優先されます。

*この変更は、ボーナスとペナルティが大幅に不承認になったために行われたものであり、作成時には回答を無効にしません。


4
私は投票しませんでしたが、ダウン投票はボーナス/ペナルティが本当に好きではないためだと思います-彼らは最終的にいくつかのミニチャレンジに1つの挑戦をすることになります。
ケビンW.

1
@KevinW。サンドボックスで説明したように、私は人々が思い付くことができるクールな組み込みのものを見たいので、私はそれらのペナルティを残しただけです。しかし、明らかに、私はみんなの楽しみを台無しにしたくない。罰則を付けなかった場合、私が与えたJavascriptの例のような答えで十分でしょう。そして、それはまったく仕事を必要としませんでした。
イスマエルミゲル

1
私見では、ボーナスはarbitrary意的なように見えます-許可するか許可しないか、間に入らないか
アディソンクランプ

1
@IsmaelMiguelボーナス/ペナルティはないことをお勧めします-使用したいプログラミング方法(もちろん、標準の抜け穴以外)を許可し、ボーナス/ペナルティを削除します。
アディソンクランプ

2
@IsmaelMiguel Nah-それは私のすべてでした。c:
アディソンクランプ

回答:


4

Japt、81 75バイト

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

6 ?sは、印刷できない文字を表します。オンラインでテストしてください!

注:これにより、3番目のエンコードオプションが出力されます。つまり、文字の後に、対応する結合発音区別符号の未加工のUTF-8エンコーディングが続きます。

使い方

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:

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

うまく機能しているようです。hexdumpを提供していただけますか?すべてのエンコーディングで機能しない「奇妙な」文字がいくつかあるようです。
イスマエルミゲル

@IsmaelMiguel私は、アクセントがISO-8859-1エンコーディングの一部ではないことに気付きました。したがって、文字列を圧縮解除し、UTF-8バイトに切り替えました。あなたはまだhexdumpが好きですか?
ETHproductions

あなた次第ですが、以前のソリューションは完全に問題ありませんでした。
イスマエルミゲル

あなたはそこに小さなバグがあるかもしれないと思う、あなたのコードは放っÝておくようだが、それはitに変更されるべきだ
...-daavko

@daavkoおっと、あなたは正しい!修正されました。
ETHproductions

12

JavaScript(ES6)、141 122 134バイト

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

daavkoの発音区別符号を使用した例に従いましたが、それをもっと早く使用することを考えないのはばかみたいです。実際、JavaScriptでは驚くほど短くなります。

編集:ニールは未定義のいくつかの悪いケースをキャッチし、現在修正されています。


見る?脂肪を減らすことができると言いました!これは本当に驚くべき答えです!+1がさらに増えることを願っています
イスマエルミゲル

1
これは賢いです。+1
Yytsi

大好きです..!String.prototype.replaceストリングトラバーサルのために非常に途方もなくゴルフ可能です。
アルケノス

私はこれが正しいことをすることを確信していませんÉ(その正しいことは何でも)。
ニール

悲しいことに、@ Neilは正しい。大文字のHTMLエンティティはブラウザによって無効と見なされます。しかし、アクセント名をすべて小文字にする必要はありませんでした。それは完全に私のせいです。この回答は有効であり、すでに投稿されているすべての回答を検討します。ただし、新しい回答では、アクセント名を小文字にする必要があります。
イスマエルミゲル

10

網膜、115バイト

私はコードゴルフは初めてですが、これはうまくいくと思います。
このバージョンは、ルールの前に作成されました。ルールでは、大文字のhtmlエンティティ(たとえばÁ)の置換は許可されていません。

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

非常に簡単な検索と置換。UTF-8を使用します。

[文字] \ xCC \ x [ダイアクリティカルマーク16進コード]アプローチを使用します。関連するすべての文字の後に発音区別符号が追加されます。

何らかの理由で、インタープリターのデフォルトのDroid Sans Monoフォントでは、「circ」および「uml」の文字を適切にレンダリングできません。開発者ツールを使用してDejaVu Sansなどに変更すると、問題なく表示されます。これはプログラムの制限ではなく、フォントの制限だと思います。しかし、それがプログラムのせいなら、私はそれを修正しようとします。

これは129バイトバージョンで、大文字のHTMLエンティティを置き換えません(たとえばÁ

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

オンラインでお試しください!
オンラインでお試しください!129バイトバージョン


そこのマークの素晴らしい使用。最初はそれが短いとは思わなかったとは信じられない> _ <
-Mwr247

@ Mwr247ありがとう!私はそれをやろうと思ったので、これを行う方法を探していましたが、マークがどこかに表示されただけです...
-daavko

1
素敵なフェアプレイとルールの使用!私はこの言語が好きではありませんでしたが、私は本当にこの答えを愛しています。インスタント+1
イスマエルミゲル

115バイトをカウントしました(110文字+マーク用に余分な5バイト)。
Mwr247

@ Mwr247ああ、あなたは正しい。テキストドキュメントに貼り付けてls -lを実行したところ、116 ...が表示され、エディターが最後に余分な改行を追加したようです。修正します。
-daavko

3

JavaScript(ES6)、288バイト

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

文字マップオブジェクトを作成し(各文字の基本数値コードを使用)、オフセット(または存在しない場合は0)を使用して、エンティティを変換する必要があるかどうか、およびその文字コードを決定します。この場合の対称性は、&Yuml;UTF8の異なるオフセットを使用する場合を除き、小文字の場合は32を追加することを意味します。


いいね!私はあなたのアプローチが本当に好きですが、286バイトは少し長いです。切断できるものがいくつかありますか?いくつかの脂肪のトリミングは素晴らしいだろう
イスマエルミゲル

@IsmaelMiguel 288実際には; 実際、&Yuml;UTF8 にはaがあることに気付きました。それはただ奇妙な場所にあります。それでも、文字通りの置換リストの長さは2倍以上になると考えて、かなりうまく圧縮して最適化したと思いました。私ではないものを見ていますか?
Mwr247

そうではありません...を使用するよりも小文字を作成するためのより良い方法が必要.toLowerCase()です。その名前は巨大です!!! また、String.fromCharCode複数のパラメーターを受け入れるか、次のように呼び出すことができますString.fromCharCode.call([...])
Ismael Miguel

1
@IsmaelMiguel書き直しが必要なのは正しかったように思えますが、他の誰かになる必要があるのは間違っているようです。この答えはもっとおもしろいと思いますが、もう1つは技術的に簡潔であるため、両方を別々に含めました。
Mwr247

1
人生を変えることはありませんが、正規表現にはリテラル文字が含まれていないため、iフラグは必要ありません。
ニール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.