Bu HTML varlığı hangi karakterdir?


11

Amaç gerçekten basit. Bir dize girdi olarak alındığında, aşağıdaki karakterlere karşılık gelen tüm HTML varlıklarını (büyük harf varyantları dahil) ayrıştırın:

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

Ayrıştırma kuralları:

  • Her varlık ile başlar &ve biter;
  • İrade sonrasındaki ilk karakter &değiştirilen karakter olacaktır (büyük / küçük harf önemlidir!)
  • Kalan karakter kullanmak aksanıyla adına başvurmak ( acute, grave, circ, tildeve uml). Aksan adı küçük harf OLMALIDIR ! *
  • O listede olmayan bir karakter çıkaran veya geçersiz Herhangi HTML varlık, el değmemiş bırakılmalıdır (Örn: &, &etilde;, &a;)
  • Yukarıdaki kurallara uymadıkları için sayısal varlıklar yok sayılmalıdır.

Bu değişiklik 18-02-2016 tarihinden itibaren yapılmıştır. Büyük harf aksanlı isimlere sahip HTML varlıklarını kabul eden mevcut yanıtların tümü geçerlidir. Gelecekte verilecek herhangi bir yanıt bu kurala uymak zorundadır.

Örnekler:

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

Çıktı:

Çıkış ISO-8859- X (1-15), windows-1252 veya UTF-8/16/32 olabilir. Geçerli kodlardan birini ve yalnızca birini
seçebilir ve bunu herhangi bir çıktı için kullanabilirsiniz . Girişin ASCII'de olacağını güvenle varsayabilirsiniz.

Aşağıdakilerden herhangi biri aşağıdakiler için geçerli bir çıktıdır á:

  • á(ISO-8859-1 / 15 veya windows-1252, eşdeğeri \xE1)
  • á(UTF-8, \xC3\xA1veya eşdeğeri \u00E1)
  • (UTF-8, a\xCC\x81veya eşdeğeri a\u0301)
  • HTML objeleri kullanmadan aksanların herhangi bir kombinasyonu.

Çıktı, oluşturulduğunda / görüntülendiğinde, listedeki karakterlerle görsel olarak benzer olmalıdır.


Unutmayın, tüm standart boşluklara ve yerleşiklere * izin verilmez . Bu , en kısa cevap kazanır.

* Bu değişiklik, bonusların ve cezaların büyük ölçüde onaylanmaması nedeniyle yapıldı ve yazma sırasında herhangi bir cevabı geçersiz kılmadı


4
Oy vermedim, ancak aşağı oyların, insanların bonusları / cezaları gerçekten sevmedikleri için olduğunu düşünüyorum - Sonunda birkaç mini meydan okumaya bir meydan okuma yapıyorlar.
Kevin W.

1
@KevinW. Kum havuzunda açıkladığım gibi, sadece bu cezaları bıraktım çünkü insanların ne kadar havalı yerleşik şeylerle karşılaşabileceğini görmek istiyorum. Ama belli ki, herkesin eğlencesini bozmak istemiyorum. Cezai koymazsam verdiğim Javascript örneği gibi bir cevap yeterli olur. Ve bu hiç iş gerektirmiyordu.
Ismael Miguel

1
IMHO, bonuslar keyfi görünüyor - ya izin ver ya da izin verme, aralarına girme.
Addison Crump

1
@IsmaelMiguel Hiçbir bonus / ceza önermiyorum - kullanmak istedikleri programlama yöntemlerine izin verin (tabii ki Standart Loopholes dışında) ve bonusları / cezaları kaldırın.
Addison Crump

2
@IsmaelMiguel Nah - hepsi sentlerimdi. c:
Addison Crump

Yanıtlar:


4

Japt, 81 75 bayt

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

Altı ?s yazdırılamaz karakterleri temsil eder. Çevrimiçi test edin!

Not: Bu, üçüncü kodlama seçeneğini çıkarır; yani, harfin ardından gelen birleştirici aksan işaretinin ham UTF-8 kodlaması.

Nasıl çalışır

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

Onaltılık kod:

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

Güzel çalışıyor gibi görünüyor. Lütfen bir hexdump sağlayabilir misiniz? Orada her kodlamada işe yaramayabilecek bazı "garip" karakterler var gibi görünüyor.
Ismael Miguel

@IsmaelMiguel Vurguların ISO-8859-1 kodlamasının bir parçası olmadığını fark ettim; bu nedenle, dizeyi sıkıştırdım ve UTF-8 baytına geçtim. Hâlâ bir hexdump ister misiniz?
ETHproductions

Size kalmış, ancak önceki çözümünüz gayet iyi.
Ismael Miguel

Sanırım orada küçük bir hata olabilir, kodunuzu Ýyalnız bırakmak gibi görünüyor , ama Ý ... olarak değiştirilmelidir
daavko

@daavko Whoops, haklısın! Şimdi düzeltildi.
ETHproductions

12

JavaScript (ES6), 141 122 134 bayt

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

Darasak işaretleri kullanarak daavko'nun örneğini takip ettim ve daha sonra kullanmayı düşünmediğim için aptal gibi hissediyorum. Aslında JavaScript için şaşırtıcı derecede kısalıyor.

DÜZENLEME: Neil, şu anda düzeltilmiş bazı kötü tanımlanmamış vakaları yakaladı.


Görmek? Sana biraz yağ kesebileceğini söyledim! Bu gerçekten şaşırtıcı bir cevap! Umarım daha fazla + 1 alırsınız
Ismael Miguel

1
Bu sadece akıllı. +1
Yytsi

Onu seviyorum..! String.prototype.replaceipte gezinme için gülünç golfçüdür.
Archenoth

Bunun É(doğru olan ne olursa olsun) bunun için doğru olanı yaptığına ikna olmadım .
Neil

Ne yazık ki, @Neil haklı. Büyük harfli HTML varlıkları tarayıcılar tarafından geçersiz kabul edilir. Ancak, vurgu adının küçük harf olması gerektiğini belirtmedim. Bu tamamen benim hatam. Bu cevabı geçerli olarak ve zaten gönderilen tüm cevapları dikkate alacağım. Ancak yeni yanıtlarda aksan adları küçük harfle yazılmalıdır.
Ismael Miguel

10

Retina , 115 bayt

Ben kod golf yeniyim, ama bence bu işe yarayabilir.
Bu sürüm, büyük harfli html varlıklarının (örneğin Á) değiştirilmesine izin vermeyen kuraldan önce yapılmıştır .

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

Oldukça basit arama ve değiştirme. UTF-8 kullanır.

[Letter] \ xCC \ x [aksan işareti onaltılık kod] yaklaşımını kullanır. Aksanlı işaret her ilgili harften sonra eklenir.

Bazı nedenlerden dolayı, yorumlayıcıdaki varsayılan Droid Sans Mono yazı tipi "circ" ve "uml" harflerini düzgün şekilde oluşturamaz. Geliştirici araçlarıyla DejaVu Sans gibi bir şeye değiştirirseniz, gayet iyi görünür. Bence bu programın değil, yazı tipinin bir sınırlaması. Ama programın hatasıysa, düzeltmeye çalışacağım.

İşte büyük bayt HTML girişlerinin yerine geçmeyen 129 baytlık bir sürüm (örneğin Á)

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

Çevrimiçi deneyin!
Çevrimiçi deneyin! 129 baytlık sürüm


Orada işaretleri büyük kullanımı. İlk başta daha kısa olduğunu düşünemiyorum inanamıyorum> _ <
Mwr247

@ Mwr247 Teşekkürler! Bunu yapmak için bir yol arıyordum, çünkü bunu yapmaya çalışmak istedim ve işaretler bir yere geldi ... Dürüst olmak gerekirse çok kısa olduğuna şaşırdım.
daavko

1
Güzel adil oyun ve kuralların kullanımı! Bu dili hiç sevmedim, ama bu cevabı gerçekten çok seviyorum. Anında +1
Ismael Miguel

115 bayt saydım (işaretler için 110 karakter + 5 ekstra bayt).
Mwr247

@ Mwr247 Oh, haklısın. Ben sadece bir metin belgesine yapıştırdı ve ls -l koştu ve 116 gösterdi ... editörü sonunda ekstra bir yeni satır ekledi görünüyor. Ben düzeltirim.
daavko

3

JavaScript (ES6), 288 bayt

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

Bir karakter eşleme nesnesi oluşturur (her karakter için temel sayısal kodla birlikte) ve bir varlığın dönüştürülmesi gerekip gerekmediğini ve karakter kodunun ne olduğunu belirlemek için ofsetleri (veya yoksa 0 değerini) kullanır. Durumlardaki simetri, &Yuml;UTF8 için farklı bir ofset kullandığı durumlar hariç , küçük harfse 32 eklemek anlamına gelir .


Güzel! Yaklaşmanızı gerçekten çok seviyorum, ama 286 bayt biraz uzun. Belki kesilebilecek birkaç şey var? Bazı yağları
Ismael Miguel

@IsmaelMiguel 288 aslında; &Yuml;UTF8'de aslında bir tane olduğunu fark ettim : sadece garip bir yerde. Aynı şekilde, gerçek bir değiştirme listesinin iki kat daha uzun olacağı düşünülürse, oldukça iyi bir şekilde yoğunlaştırdığımı ve optimize ettiğimi düşündüm. Benim olmadığım bir şey görüyor musun?
Mwr247

Pek değil ... Küçük harf yapmanın, kullanmaktan daha iyi bir yolu olmalı .toLowerCase(). Bu isim BÜYÜK !!! Ayrıca, String.fromCharCodebirden fazla parametre kabul edebilir veya olarak adlandırılabilirString.fromCharCode.call([...])
Ismael Miguel

1
@IsmaelMiguel Yeniden yazmaya ihtiyaç duyduğu konusunda haklıydım, ancak başka biri olması gerektiği konusunda yanlışım. Bu cevabın daha ilginç olduğunu düşünüyorum, ama diğeri teknik olarak daha özlü, bu yüzden ikisini de ayrı ayrı dahil ettim.
Mwr247

1
Yaşamı değiştirmez, ancak normal ifadenizde hiçbir harf yoktur, bu nedenle ibayrağa ihtiyaç duymaz .
Neil
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.