Який символ є цією суттю HTML?


11

Мета дійсно проста. Отримавши рядок як вхідний, проаналізуйте всі об'єкти HTML, які відповідають наступним символам (включаючи їх великі варіанти):

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

Правила розбору:

  • Кожна сутність починається з &і закінчується;
  • Першим символом після &заповіту буде модифікований символ (важливий регістр букви!)
  • Решта символів позначають назву акценту використовувати ( acute, grave, circ, tildeі uml). Назва акценту ОБОВ'ЯЗКОВА має бути з малої літери! *
  • Будь HTML - об'єкт , який виробляє символ , який не в цьому списку, або є недійсним, слід залишити недоторканими (Наприклад: &, &etilde;, &a;)
  • Числові об'єкти слід ігнорувати, оскільки вони не відповідають правилам, наведеним вище

Ця зміна була введена станом на 18-02-2016. Усі існуючі відповіді, які приймають сутність HTML із великими іменами наголосу, є дійсними. Будь-яка майбутня відповідь повинна слідувати цьому правилу.

Приклади:

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

Вихід:

Вихід може бути в ISO-8859- X (1-15), windows-1252 або UTF-8/16/32.
Ви можете вибрати одне і лише одне з дійсних кодувань і використовувати його для будь-якого виводу. Можна сміливо припускати, що вхід буде в ASCII.

Будь-яке з наведених нижче дійсних результатів для á:

  • á(ISO-8859-1 / 15 або windows-1252, еквівалентно \xE1)
  • á(UTF-8, еквівалентно \xC3\xA1або \u00E1)
  • (UTF-8, еквівалентно a\xCC\x81або a\u0301)
  • Будь-яка комбінація діакритики, без використання HTML-об'єктів.

Виведення має бути візуально схожим при відображенні / відображенні символів у списку.


Пам'ятайте, що всі стандартні лазівки та вбудовані * заборонені . Оскільки це , найкоротша відповідь виграє.

* Ця зміна була здійснена через велике несхвалення бонусів та штрафних санкцій, і під час написання документа не визнає жодної відповіді


4
Я не голосував, але я припускаю, що голосування є тому, що людям не дуже подобаються бонуси / штрафи. Вони в кінцевому підсумку роблять одне завдання на кілька міні-викликів.
Кевін В.

1
@KevinW. Як я пояснив у пісочниці, я залишив лише ті покарання, бо хочу побачити, які класні вбудовані речі люди можуть придумати. Але очевидно, я не хочу всім псувати задоволення. Якби я не застосував покарання, відповіді, як приклад Javascript, який я дав, буде достатньо. А це взагалі не вимагало роботи.
Ісмаїл Мігель

1
ІМХО, бонуси здаються довільними - або дозволяють, або не дозволяють, не переходьте між ними.
Аддісон Кримп

1
@IsmaelMiguel Я не пропоную жодних бонусів / штрафних санкцій - дозвольте будь-які методи програмування, які вони бажають використовувати (поза звичайними лазівками, звичайно) та зніміть бонуси / штрафи.
Аддісон Кримп

2
@IsmaelMiguel Nah - це були всі мої центи. c:
Addison Crump

Відповіді:


4

Japt, 81 75 байт

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

Шість ?представляють недруковані символи. Перевірте це в Інтернеті!

Примітка. Це виводить третій варіант кодування; тобто лист, за яким слід неочищене кодування 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

Шестнадцятковий код:

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

Здається, добре працює. Чи можете ви, будь ласка, надати шестикутник? Здається, у вас є якісь "дивні" символи, які можуть працювати не в кожному кодуванні.
Ісмаїл Мігель

@IsmaelMiguel Я щойно зрозумів, що наголоси не є частиною кодування ISO-8859-1; таким чином, я розтиснув рядок і перейшов на байти UTF-8. Ви все ще хотіли б гексдумп?
ETHproductions

Ви залежали від вас, але ваше попереднє рішення було прекрасно.
Ісмаїл Мігель

Я думаю, що у вас може виникнути крихітна помилка, ваш код, здається, залишиться в Ýспокої, але його слід змінити на Ý ...
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]])

Слідуючи прикладу Даавко, використовуючи діакритичні позначки, і я відчуваю себе ідіотцем, коли не думав скоріше його використовувати. Насправді напрочуд короткий JavaScript.

EDIT: Ніл виявив деякі погані випадки невизначеності, які зараз виправлені.


Побачити? Я сказав вам, що ви можете порізати трохи жиру! Це дійсно дивна відповідь! Дуже сподіваюся, що ви отримаєте більше +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 [шестнадцятковий код діакритичної позначки]. Діакритичний знак додається після кожного відповідного листа.

Чомусь шрифт 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, якщо їх немає), щоб визначити, чи слід об'єкт перетворювати та який його код символів. Симетрія у випадках означає додавання 32, якщо малі регістри, за винятком випадків &Yuml;, коли для UTF8 використовується інше зміщення.


Приємно! Мені дуже подобається ваш підхід, але 286 байт трохи довше. Може, є кілька речей, які можна відрізати? Обрізання трохи жиру було б чудово
Ісмаель Мігель

@IsmaelMiguel 288 насправді; Я щойно зрозумів, що насправді є &Yuml;UTF8: він просто в дивному місці. Тим не менш, я думав, що я згустив його та оптимізував його досить добре, вважаючи, що список буквальної заміни буде більш ніж удвічі довшим. Ви бачите щось, чого я не є?
Mwr247

Насправді ... Має бути кращий спосіб виготовлення малих літер, ніж використання .toLowerCase(). Це ім'я ВЕЛИЧЕЗНО !!! Також String.fromCharCodeможна приймати декілька параметрів або називатись такString.fromCharCode.call([...])
Ісмаель Мігель

1
@IsmaelMiguel Здається, я мав рацію з приводу того, що потрібно переписати, але не так, що потрібно бути кимось іншим. Я вважаю, що ця відповідь є цікавішою, але інша є технічно більш стислою, тому я включила їх обох окремо.
Mwr247

1
Не змінює життя, але ваш regexp не містить буквальних букв, тому його не потрібно iпрапор.
Ніл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.