Apa karakter entitas HTML itu?

11

Tujuannya sangat sederhana. Menerima string sebagai input, parsing semua entitas HTML yang sesuai dengan karakter berikut (termasuk varian huruf besar mereka):

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

Aturan parsing:

  • Setiap entitas dimulai dengan &dan diakhiri dengan;
  • Karakter pertama setelah &akan menjadi karakter yang dimodifikasi (huruf besar!)
  • Karakter yang tersisa merujuk ke nama aksen untuk menggunakan ( acute, grave, circ, tildedan uml). Nama aksen HARUS dalam huruf kecil! *
  • Setiap entitas HTML yang menghasilkan karakter yang tidak ada di daftar itu, atau bahwa tidak valid, harus dibiarkan tak tersentuh (Misalnya: &, &etilde;, &a;)
  • Entitas numerik harus diabaikan, karena tidak sesuai dengan aturan di atas

Perubahan ini diperkenalkan pada 18-02-2016. Semua jawaban yang ada yang menerima entitas HTML dengan nama aksen huruf besar adalah valid. Setiap jawaban di masa depan harus mengikuti aturan ini.

Contoh:

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

Keluaran:

Outputnya bisa dalam ISO-8859- X (1-15), windows-1252 atau UTF-8/16/32.
Anda dapat memilih satu dan hanya satu dari pengkodean yang valid dan menggunakannya untuk output apa pun . Anda dapat dengan aman berasumsi bahwa input akan berada di ASCII.

Salah satu dari yang berikut ini adalah output yang valid untuk á:

  • á(ISO-8859-1 / 15 atau windows-1252, setara dengan \xE1)
  • á(UTF-8, setara dengan \xC3\xA1atau \u00E1)
  • (UTF-8, setara dengan a\xCC\x81atau a\u0301)
  • Setiap kombinasi diakritik, tanpa menggunakan entitas HTML.

Outputnya harus serupa secara visual, ketika ditampilkan / ditampilkan, dengan karakter dalam daftar.


Ingat, semua celah standar dan bawaan * tidak diizinkan . Karena ini adalah , jawaban terpendek menang.

* Perubahan ini dilakukan karena tidak disetujuinya bonus dan penalti, dan pada saat penulisan, tidak membatalkan jawaban apa pun

Ismael Miguel
sumber
4
Saya tidak memberikan suara, tetapi saya berasumsi bahwa downvotes adalah karena orang tidak benar-benar menyukai bonus / penalti - Mereka akhirnya membuat satu tantangan menjadi beberapa tantangan kecil.
Kevin W.
1
@KevinW. Seperti yang saya jelaskan di kotak pasir, saya hanya meninggalkan hukuman itu karena saya ingin melihat hal-hal bawaan apa yang bisa dihasilkan orang. Tapi yang jelas, saya tidak ingin merusak kesenangan semua orang. Jika saya tidak memberikan hukuman, jawaban seperti contoh Javascript yang saya berikan, akan cukup. Dan itu tidak membutuhkan kerja sama sekali.
Ismael Miguel
1
IMHO, bonusnya tampak sewenang-wenang - boleh atau tidak boleh, jangan di antaranya.
Addison Crump
1
@IsmaelMiguel Saya menyarankan tidak ada bonus / penalti - izinkan metode pemrograman apa pun yang ingin mereka gunakan (di luar Standard Loopholes, tentu saja) dan hapus bonus / penalti.
Addison Crump
2
@ IsmaelMiguel Nah - itu semua sen saya. c:
Addison Crump

Jawaban:

4

Japt, 81 75 byte

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

Keenam ?mewakili karakter yang tidak patut. Uji secara online!

Catatan: Ini menampilkan opsi penyandian ketiga; yaitu, huruf yang diikuti oleh pengkodean UTF-8 mentah dari tanda diakritik gabungan yang sesuai.

Bagaimana itu bekerja

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 kode:

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
Produksi ETH
sumber
Tampaknya bekerja dengan baik. Bisakah Anda memberikan hexdump? Anda tampaknya memiliki beberapa karakter "aneh" yang mungkin tidak berfungsi di setiap penyandian.
Ismael Miguel
@IsmaelMiguel Saya baru menyadari bahwa aksennya bukan bagian dari penyandian ISO-8859-1; dengan demikian, saya telah mengompresi string dan beralih ke byte UTF-8. Apakah Anda masih menginginkan hexdump?
ETHproduksi
Terserah Anda, tetapi solusi Anda sebelumnya baik-baik saja.
Ismael Miguel
Saya pikir Anda mungkin memiliki bug kecil di sana, kode Anda tampaknya Ý
dibiarkan begitu
@daavko Whoops, kau benar! Diperbaiki sekarang
ETHproduksi
12

JavaScript (ES6), 141 122 134 byte

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

Mengikuti contoh daavko menggunakan tanda diakritik, dan saya merasa seperti orang idiot karena tidak berpikir untuk menggunakannya lebih cepat. Secara mengejutkan mendapatkan singkatan untuk JavaScript.

EDIT: Neil menangkap beberapa kasus buruk yang tidak terdefinisi, yang sekarang diperbaiki.

Mwr247
sumber
Lihat? Saya katakan bahwa Anda bisa mengurangi lemak! Ini jawaban yang sangat mengejutkan! Saya benar-benar berharap Anda mendapatkan lebih banyak +1
Ismael Miguel
1
Ini hanya pintar. +1
Yytsi
Aku menyukainya..! String.prototype.replacesangat golfable untuk string traversal.
Archenoth
Saya tidak yakin bahwa ini melakukan hal yang benar untuk É(apa pun itu benar).
Neil
Sayangnya, @Neil benar. Entitas HTML huruf besar dianggap tidak valid oleh browser. Tapi, saya tidak menentukan bahwa nama aksen harus dalam huruf kecil. Itu sepenuhnya salahku. Saya akan menganggap jawaban ini valid dan semua yang sudah diposting. Tetapi setiap jawaban baru harus memiliki nama aksen dalam huruf kecil.
Ismael Miguel
10

Retina , 115 byte

Saya baru mengenal kode-golf, tetapi saya pikir ini mungkin berhasil.
Versi ini dibuat sebelum aturan, yang tidak memungkinkan penggantian entitas html huruf besar (misalnya Á) diperkenalkan.

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

Pencarian dan penggantian yang cukup sederhana. Menggunakan UTF-8.

Menggunakan pendekatan [huruf] \ xCC \ x [kode hex mark]. Tanda diakritik ditambahkan setelah setiap surat yang relevan.

Untuk beberapa alasan, font Droid Sans Mono default pada interpreter tidak dapat membuat huruf "circ" dan "uml" dengan benar. Jika Anda mengubahnya melalui alat pengembang ke sesuatu seperti DejaVu Sans, itu menunjukkan baik-baik saja. Saya pikir ini adalah batasan font, bukan programnya. Tetapi jika itu kesalahan program, saya akan mencoba memperbaikinya.

Ini adalah versi 129 byte, yang tidak menggantikan entites HTML huruf besar (misalnya Á)

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

Cobalah online!
Cobalah online! Versi 129-byte

daavko
sumber
Penggunaan tanda di sana sangat bagus. Tidak percaya saya tidak berpikir itu lebih pendek pada awalnya> _ <
Mwr247
@ Mwr247 Terima kasih! Saya sedang mencari cara untuk melakukan ini, karena saya ingin mencoba melakukannya dan tanda-tanda hanya muncul di suatu tempat ... Saya benar-benar terkejut itu sangat singkat.
daavko
1
Permainan yang bagus dan penggunaan aturan! Saya tidak pernah menyukai bahasa ini, tetapi saya benar-benar menyukai jawaban ini. +1 Instan
Ismael Miguel
Saya menghitung 115 byte (110 karakter + 5 byte tambahan untuk tanda).
Mwr247
@ Mwr247 Oh, Anda benar. Saya baru saja menempelkannya ke dokumen teks dan menjalankan ls-l dan itu menunjukkan 116 ... tampaknya editor menambahkan baris baru di akhir. Saya akan memperbaikinya.
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))

Membuat objek peta karakter (dengan kode numerik dasar untuk setiap karakter), dan menggunakan offset (atau 0 jika tidak ada) untuk menentukan apakah entitas harus dikonversi dan seperti apa kode karakternya. Simetri dalam kasing berarti menambahkan 32 jika huruf kecil, kecuali untuk &Yuml;, di mana ia menggunakan offset berbeda untuk UTF8.

Mwr247
sumber
Bagus! Saya sangat suka pendekatan Anda, tetapi 286 byte agak panjang. Mungkin ada beberapa hal yang bisa terputus? Memotong sedikit lemak akan menjadi hal yang hebat
Ismael Miguel
@IsmaelMiguel 288 sebenarnya; Saya baru menyadari bahwa sebenarnya ada &Yuml;di UTF8: itu hanya di tempat yang aneh. Semua sama, saya pikir saya mengembun dan mengoptimalkannya dengan cukup baik, mengingat daftar ganti literal akan lebih dari dua kali lebih lama. Apakah Anda melihat sesuatu yang bukan saya?
Mwr247
Tidak juga ... Pasti ada cara yang lebih baik untuk membuat huruf kecil daripada menggunakan .toLowerCase(). Nama itu BESAR !!! Juga, String.fromCharCodedapat menerima beberapa parameter, atau disebut sebagaiString.fromCharCode.call([...])
Ismael Miguel
1
@ IsmaelMiguel Sepertinya saya benar tentang hal itu membutuhkan penulisan ulang, tetapi salah tentang hal itu perlu menjadi orang lain. Saya merasa jawaban ini lebih menarik, tetapi yang lain secara teknis lebih ringkas, jadi saya memasukkan keduanya secara terpisah.
Mwr247
1
Tidak mengubah hidup tetapi regexp Anda tidak mengandung huruf literal sehingga tidak perlu ibendera.
Neil