Jaką postacią jest ta jednostka HTML?

11

Cel jest naprawdę prosty. Odbierając ciąg wejściowy, przeanalizuj wszystkie elementy HTML, które odpowiadają następującym znakom (w tym ich wariantom wielkich liter):

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

Zasady analizy:

  • Każdy byt zaczyna się &i kończy na;
  • Pierwszym znakiem po &będzie zmodyfikowany znak (ważna jest litera!)
  • Pozostałe znaki odnoszą się do nazwy akcentu użyć ( acute, grave, circ, tildei uml). Nazwa akcentu MUSI być pisana małymi literami! *
  • Każdy podmiot, który wytwarza HTML znak, że nie ma na tej liście, lub że jest nieważny, należy pozostawić nietknięte (Np: &, &etilde;, &a;)
  • Jednostki numeryczne należy zignorować, ponieważ nie pasują do powyższych reguł

Ta zmiana została wprowadzona w dniu 18-02-2016. Wszystkie istniejące odpowiedzi, które akceptują jednostki HTML z dużymi nazwami akcentów, są poprawne. Wszelkie przyszłe odpowiedzi muszą być zgodne z tą zasadą.

Przykłady:

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

Wynik:

Dane wyjściowe mogą być w ISO-8859- X (1-15), Windows-1252 lub UTF-8/16/32.
Możesz wybrać jedno i tylko jedno prawidłowe kodowanie i użyć go do dowolnego wyniku. Możesz bezpiecznie założyć, że dane wejściowe będą w ASCII.

Każde z poniższych jest prawidłowym wyjściem dla á:

  • á(ISO-8859-1 / 15 lub Windows-1252, odpowiednik \xE1)
  • á(UTF-8, odpowiednik \xC3\xA1lub \u00E1)
  • (UTF-8, odpowiednik a\xCC\x81lub a\u0301)
  • Dowolna kombinacja znaków diakrytycznych, bez użycia encji HTML.

Dane wyjściowe muszą być wizualnie podobne, gdy są renderowane / wyświetlane, do znaków na liście.


Pamiętaj, że wszystkie standardowe luki i wbudowane * są niedozwolone . Ponieważ jest to , najkrótsza odpowiedź wygrywa.

* Ta zmiana została wprowadzona z powodu wielkiego odrzucenia premii i kar, a w momencie pisania nie unieważnia żadnej odpowiedzi

Ismael Miguel
źródło
4
Nie głosowałem, ale zakładam, że głosy negatywne wynikają z tego, że ludzie tak naprawdę nie lubią bonusów / kar - w rezultacie przekształcają jedno wyzwanie w kilka mini-wyzwań.
Kevin W.
1
@KevinW. Jak wyjaśniłem w piaskownicy, zostawiłem tylko te kary, ponieważ chcę zobaczyć, jakie fajne wbudowane rzeczy mogą wymyślić ludzie. Ale oczywiście nie chcę zepsuć wszystkim zabawy. Gdybym nie nałożył kary, wystarczyłaby odpowiedź taka jak w przykładzie JavaScript. A to wcale nie wymagało pracy.
Ismael Miguel
1
IMHO, bonusy wydają się arbitralne - albo zezwalaj, albo nie zezwalaj, nie wchodź pomiędzy.
Addison Crump
1
@ IsmaelMiguel Sugeruję brak premii / kar - dopuszczaj dowolne metody programowania, których chcą używać (oczywiście poza standardowymi lukami) i usuwaj bonusy / kary.
Addison Crump
2
@ IsmaelMiguel Nah - to były wszystkie moje centy. c:
Addison Crump

Odpowiedzi:

4

Japt, 81 75 bajtów

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

Sześć ?s reprezentuje znaki niedrukowalne. Przetestuj online!

Uwaga: Wyprowadza trzecią opcję kodowania; to znaczy litera, po której następuje surowe kodowanie UTF-8 odpowiedniego łączącego znaku diakrytycznego.

Jak to działa

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

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
ETHprodukcje
źródło
Wygląda na to, że działa dobrze. Czy możesz podać zrzut heksowy? Wygląda na to, że masz jakieś „dziwne” znaki, które mogą nie działać w każdym kodowaniu.
Ismael Miguel
@ IsmaelMiguel Właśnie zdałem sobie sprawę, że akcenty nie są częścią kodowania ISO-8859-1; dlatego rozpakowałem ciąg i przełączyłem na bajty UTF-8. Czy nadal chciałbyś zrzut heksowy?
ETHprodukcje
Od ciebie zależy, ale poprzednie rozwiązanie było w porządku.
Ismael Miguel
Wydaje mi się, że masz tam drobny błąd, twój kod wydaje się pozostawiony Ýsam, ale należy go zmienić na…
daavko
@daavko Ups, masz rację! Naprawiono teraz.
ETHprodukcje
12

JavaScript (ES6), 141 122 134 bajtów

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

Podążyłem za przykładem Daavko, używając znaków diakrytycznych, i czuję się jak idiota, że ​​nie zastanawiałem się nad użyciem go wcześniej. W rzeczywistości robi się zaskakująco krótko na JavaScript.

EDYCJA: Neil wyłapał kilka złych przypadków niezdefiniowanych, które są teraz naprawione.

Mwr247
źródło
Widzieć? Mówiłem ci, że możesz wyciąć trochę tłuszczu! To naprawdę zaskakująca odpowiedź! Naprawdę mam nadzieję, że dostaniesz więcej +1
Ismael Miguel
1
To jest po prostu sprytne. +1
Yytsi
Kocham to..! String.prototype.replacejest tak absurdalnie gra w golfa podczas przemierzania strun.
Archenoth,
Nie jestem przekonany, że jest to słuszne É(cokolwiek to jest właściwe).
Neil,
Niestety @Neil ma rację. Wielkie litery HTML są uważane za nieprawidłowe przez przeglądarki. Ale nie określiłem, że nazwa akcentu powinna być pisana małymi literami. To całkowicie moja wina. Uznam tę odpowiedź za prawidłową i wszystkie te, które zostały już opublikowane. Ale każda nowa odpowiedź musi mieć małe litery akcentu.
Ismael Miguel
10

Siatkówka , 115 bajtów

Jestem nowym golfistą, ale myślę, że to może zadziałać.
Ta wersja została wykonana przed wprowadzeniem reguły, która nie zezwala na zastąpienie wielkich liter html (na przykład Á).

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

Dość proste wyszukiwanie i zamiana. Wykorzystuje UTF-8.

Wykorzystuje podejście [litera] \ xCC \ x [kod szesnastkowy znaku diakrytycznego]. Znak diakrytyczny jest dodawany po każdej odpowiedniej literze.

Z jakiegoś powodu domyślna czcionka Droid Sans Mono w interpretatorze nie może poprawnie renderować liter „circ” i „uml”. Jeśli zmienisz to za pomocą narzędzi programistycznych na coś takiego jak DejaVu Sans, będzie dobrze. Myślę, że to ograniczenie czcionki, a nie programu. Ale jeśli to wina programu, postaram się to naprawić.

Oto wersja 129-bajtowa, która nie zastępuje wielkich liter HTML (na przykład Á)

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

Wypróbuj online!
Wypróbuj online! Wersja 129-bajtowa

daavko
źródło
Świetne użycie znaków tam. Nie mogę uwierzyć, że na początku nie myślałem, że będzie krótszy> _ <
Mwr247
@ Mwr247 Thanks! Szukałem sposobu, aby to zrobić, ponieważ chciałem to zrobić, a znaki właśnie gdzieś się pojawiły ... Jestem szczerze zaskoczony, że jest tak krótki.
daavko
1
Niezła fair play i stosowanie zasad! Nigdy nie lubiłem tego języka, ale naprawdę podoba mi się ta odpowiedź. Natychmiastowe +1
Ismael Miguel
Naliczyłem 115 bajtów (110 znaków + 5 dodatkowych bajtów na znaki).
Mwr247,
@ Mwr247 Oh, masz rację. Właśnie wkleiłem go do dokumentu tekstowego i uruchomiłem ls -l i pokazałem 116 ... wydaje się, że edytor dodał na końcu dodatkową linię. Naprawię to.
daavko
3

JavaScript (ES6), 288 bajtów

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

Tworzy obiekt mapy znaków (z podstawowym kodem numerycznym dla każdego znaku) i używa przesunięć (lub 0, jeśli nie istnieje), aby ustalić, czy obiekt powinien zostać przekształcony i jaki jest jego kod znaku. Symetria w przypadkach oznacza dodanie 32, jeśli małe litery, z wyjątkiem sytuacji &Yuml;, gdy używa innego przesunięcia dla UTF8.

Mwr247
źródło
Ładny! Naprawdę podoba mi się twoje podejście, ale 286 bajtów jest trochę długie. Może jest kilka rzeczy, które można odciąć? Odtłuszczanie byłoby świetne
Ismael Miguel
@ IsmaelMiguel 288 faktycznie; Właśnie zdałem sobie sprawę, że w rzeczywistości jest &Yuml;UTF8: jest po prostu w dziwnym miejscu. Mimo to pomyślałem, że raczej dobrze skondensowałem i zoptymalizowałem, biorąc pod uwagę, że dosłowna lista zastąpień byłaby ponad dwa razy dłuższa. Widzisz coś, czego ja nie jestem?
Mwr247
Nie bardzo ... Musi być lepszy sposób na pisanie małymi literami niż używanie .toLowerCase(). To imię jest OGROMNE !!! Ponadto String.fromCharCodemoże przyjmować wiele parametrów lub być nazywanyString.fromCharCode.call([...])
Ismael Miguel
1
@ IsmaelMiguel Wydaje mi się, że miałem rację, wymagając przepisania, ale nie mam racji, że trzeba być kimś innym. Wydaje mi się, że ta odpowiedź jest bardziej interesująca, ale druga jest technicznie bardziej zwięzła, więc zawarłem je osobno.
Mwr247
1
Nie zmienia życia, ale wyrażenie regularne nie zawiera liter, więc nie potrzebuje iflagi.
Neil,