Какой символ это 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 Нах - это были все мои центы. c:
Эддисон Крамп

Ответы:


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

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

До вас, но ваше предыдущее решение было прекрасно.
Исмаэль Мигель

Я думаю, что у вас может быть небольшая ошибка, ваш код, похоже, Ýостался один, но его следует изменить на Ý ...
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.

РЕДАКТИРОВАТЬ: Нил обнаружил несколько плохих случаев неопределенных, которые теперь исправлены.


Увидеть? Я сказал вам, что вы можете сократить жир! Это действительно удивительный ответ! Я искренне надеюсь, что вы получите больше +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 Спасибо! Я искал способ сделать это, так как я хотел попытаться сделать это, и отметки просто где-то появились ... Я честно удивлен, что это так коротко.
Даавко

1
Хорошая честная игра и использование правил! Мне никогда не нравился этот язык, но я действительно люблю этот ответ. Мгновенное +1
Исмаэль Мигель

Я насчитал 115 байтов (110 знаков + 5 дополнительных байтов для меток).
Mwr247

@ Mwr247 О, ты прав. Я просто вставил его в текстовый документ и запустил ls -l, и он показал 116 ... кажется, что редактор добавил дополнительную строку в конце. Я исправлю это.
Даавко

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
Не изменяющий жизнь, но ваше регулярное выражение не содержит буквенных букв, поэтому ему не нужен iфлаг.
Нил
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.