Nhân vật HTML đó là nhân vật nào?


11

Mục tiêu thực sự đơn giản. Nhận một chuỗi làm đầu vào, phân tích tất cả các thực thể HTML tương ứng với các ký tự sau (bao gồm các biến thể chữ hoa của chúng):

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

Quy tắc phân tích cú pháp:

  • Mỗi thực thể bắt đầu bằng &và kết thúc bằng;
  • Ký tự đầu tiên sau &sẽ là ký tự được sửa đổi (trường hợp chữ cái là quan trọng!)
  • Các nhân vật còn lại đề cập đến tên của giọng để sử dụng ( acute, grave, circ, tildeuml). Tên giọng PHẢI được viết thường! *
  • Bất kỳ thực thể HTML mà tạo ra một nhân vật không có trong danh sách đó, hoặc không hợp lệ, không nên đụng đến (Ví dụ: &, &etilde;, &a;)
  • Các thực thể số nên được bỏ qua, vì chúng không phù hợp với các quy tắc trên

Thay đổi này được giới thiệu vào ngày 18-02-2016. Tất cả các câu trả lời hiện có chấp nhận các thực thể HTML có tên viết hoa là hợp lệ. Bất kỳ câu trả lời trong tương lai phải tuân theo quy tắc này.

Ví dụ:

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

Đầu ra:

Đầu ra có thể ở ISO-8859- X (1-15), windows-1252 hoặc UTF-8/16/32.
Bạn có thể chọn một và chỉ một trong các bảng mã hợp lệ và sử dụng nó cho bất kỳ đầu ra nào . Bạn có thể giả định rằng đầu vào sẽ ở dạng ASCII.

Bất kỳ điều nào sau đây là đầu ra hợp lệ cho á:

  • á(ISO-8859-1 / 15 hoặc windows-1252, tương đương \xE1)
  • á(UTF-8, tương đương \xC3\xA1hoặc \u00E1)
  • (UTF-8, tương đương a\xCC\x81hoặc a\u0301)
  • Bất kỳ sự kết hợp nào của dấu phụ, mà không sử dụng các thực thể HTML.

Đầu ra phải tương tự trực quan, khi được hiển thị / hiển thị, với các ký tự trong danh sách.


Hãy nhớ rằng, tất cả các sơ hở tiêu chuẩn và tích hợp * đều không được phép . Vì đây là , câu trả lời ngắn nhất sẽ thắng.

* Thay đổi này được thực hiện do sự không chấp thuận lớn về tiền thưởng và hình phạt, và tại thời điểm viết, không làm mất hiệu lực bất kỳ câu trả lời nào


4
Tôi đã không bỏ phiếu, nhưng tôi cho rằng những người bị hạ thấp là vì mọi người không thực sự thích tiền thưởng / hình phạt - Cuối cùng họ thực hiện một thử thách thành một vài thử thách nhỏ.
Kevin W.

1
@KevinW. Như tôi đã giải thích trong hộp cát, tôi chỉ để lại những hình phạt đó vì tôi muốn xem những thứ tích hợp tuyệt vời mà mọi người có thể nghĩ ra. Nhưng rõ ràng, tôi không muốn làm hỏng niềm vui của mọi người. Nếu tôi không đặt tính hợp pháp, một câu trả lời như ví dụ Javascript tôi đã đưa ra, là đủ. Và điều đó không đòi hỏi phải làm việc gì cả.
Ismael Miguel

1
IMHO, tiền thưởng có vẻ tùy ý - cho phép hoặc không cho phép, không đi vào giữa.
Addison Crump

1
@IsmaelMiguel Tôi đề nghị không có tiền thưởng / hình phạt - cho phép bất kỳ phương pháp lập trình nào họ muốn sử dụng (tất nhiên, ngoài các lỗ hổng tiêu chuẩn) và loại bỏ các khoản thưởng / hình phạt.
Addison Crump

2
@IsmaelMiguel Nah - đó là tất cả số xu của tôi. c:
Addison Crump

Câu trả lời:


4

Japt, 81 75 byte

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

Sáu ?s đại diện cho ký tự không thể in được. Kiểm tra nó trực tuyến!

Lưu ý: Điều này xuất ra tùy chọn mã hóa thứ ba; đó là, chữ cái theo sau là mã hóa UTF-8 thô của dấu phụ kết hợp tương ứng.

Làm thế nào nó hoạt động

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

Mã thập phân của mã:

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

Nó dường như làm việc độc đáo. Bạn có thể vui lòng cung cấp một hexdump? Bạn dường như có một số ký tự "lạ" có thể không hoạt động trong mọi mã hóa.
Ismael Miguel

@IsmaelMiguel Tôi mới nhận ra rằng các dấu không phải là một phần của mã hóa ISO-8859-1; do đó, tôi đã giải nén chuỗi và chuyển sang byte UTF-8. Bạn vẫn muốn một hexdump?
Sản xuất ETH

Tùy thuộc vào bạn, nhưng giải pháp trước đây của bạn là hoàn toàn tốt.
Ismael Miguel

Tôi nghĩ rằng bạn có thể có một lỗi nhỏ ở đó, mã của bạn dường như để Ýyên, nhưng nó nên được đổi thành Ý ...
daavko

@daavko Rất tiếc, bạn nói đúng! Đã sửa bây giờ.
Sản phẩm điện tử

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

Đã làm theo ví dụ của daavko bằng cách sử dụng dấu phụ, và tôi cảm thấy như một thằng ngốc vì không nghĩ đến việc sử dụng nó sớm hơn. Thực tế được viết tắt đáng ngạc nhiên cho JavaScript.

EDIT: Neil bắt gặp một số trường hợp xấu không xác định, hiện đã được sửa.


Xem? Tôi nói với bạn rằng bạn có thể cắt giảm một số chất béo! Đây là một câu trả lời thực sự đáng ngạc nhiên! Tôi thực sự hy vọng bạn sẽ nhận được nhiều hơn 1
Ismael Miguel

1
Đây chỉ là thông minh. +1
Yytsi

Tôi thích nó..! String.prototype.replacelà vô lý golfable cho truyền tải chuỗi.
Archenoth 17/2/2016

Tôi không tin rằng điều này làm đúng É( cho dù điều đó đúng).
Neil

Đáng buồn thay, @Neil đã đúng. Các thực thể HTML Uppercase được coi là không hợp lệ bởi các trình duyệt. Nhưng, tôi đã không xác định rằng tên trọng âm nên được viết bằng chữ thường. Đó là toàn bộ lỗi của tôi. Tôi sẽ xem xét câu trả lời này hợp lệ và tất cả những câu đã được đăng. Nhưng bất kỳ câu trả lời mới phải có tên trọng âm bằng chữ thường.
Ismael Miguel

10

Võng mạc , 115 byte

Tôi mới chơi golf-code, nhưng tôi nghĩ nó có thể hoạt động.
Phiên bản này được tạo ra trước quy tắc, không cho phép thay thế các thực thể html chữ hoa (ví dụ Á) được giới thiệu.

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

Khá đơn giản tìm kiếm và thay thế. Sử dụng UTF-8.

Sử dụng phương pháp [letter] \ xCC \ x [mã hex dấu diacritical]. Dấu phụ được thêm vào sau mỗi chữ cái có liên quan.

Vì một số lý do, phông chữ Droid Sans Mono mặc định trong trình thông dịch không thể hiển thị đúng các chữ cái "Circ" và "uml". Nếu bạn thay đổi nó thông qua các công cụ dành cho nhà phát triển thành một cái gì đó như DejaVu Sans, nó sẽ hiển thị tốt. Tôi nghĩ rằng đây là một hạn chế của phông chữ, không phải chương trình. Nhưng nếu đó là lỗi của chương trình, tôi sẽ cố gắng sửa nó.

Đây là phiên bản 129 byte, không thay thế các ký tự HTML viết hoa (ví dụ Á)

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

Hãy thử trực tuyến!
Hãy thử trực tuyến! Phiên bản 129 byte


Sử dụng tuyệt vời của các nhãn hiệu đó. Không thể tin rằng lúc đầu tôi không nghĩ rằng nó ngắn hơn> _ <
Mwr247

@ Mwr247 Cảm ơn! Tôi đã tìm kiếm một cách để làm điều này, vì tôi muốn thử làm nó và các dấu hiệu chỉ xuất hiện ở đâu đó ... Tôi thực sự ngạc nhiên vì nó quá ngắn.
daavko

1
Chơi đẹp và sử dụng các quy tắc! Tôi không bao giờ thích ngôn ngữ này, nhưng tôi thực sự yêu câu trả lời này. Tức thì +1
Ismael Miguel

Tôi đếm được 115 byte (110 ký tự + 5 byte thêm cho các dấu).
Mwr247

@ Mwr247 Ồ, bạn nói đúng. Tôi vừa dán nó vào một tài liệu văn bản và chạy ls -l và nó hiển thị 116 ... có vẻ như biên tập viên đã thêm một dòng mới vào cuối. Tôi sẽ sửa chữa nó.
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))

Tạo một đối tượng bản đồ ký tự (với mã số cơ sở cho mỗi ký tự) và sử dụng offset (hoặc 0 nếu không tồn tại) để xác định xem có nên chuyển đổi thực thể không và mã ký tự đó là gì. Đối xứng trong các trường hợp có nghĩa là thêm 32 nếu viết thường, ngoại trừ &Yuml;, trong đó nó sử dụng một phần bù khác cho UTF8.


Đẹp! Tôi thực sự thích aproach của bạn, nhưng 286 byte hơi dài. Có lẽ có một vài điều có thể được cắt bỏ? Cắt tỉa một số chất béo sẽ là tuyệt vời
Ismael Miguel

@IsmaelMiguel 288 thực sự; Tôi mới nhận ra rằng trên thực tế có một &Yuml;UTF8: nó chỉ ở một nơi kỳ lạ. Tất cả đều giống nhau, tôi nghĩ rằng tôi cô đọng và tối ưu hóa nó khá tốt, xem xét một danh sách thay thế theo nghĩa đen sẽ dài hơn gấp đôi. Bạn có thấy điều gì tôi không?
Mwr247

Không thực sự ... Phải có một cách tốt hơn để tạo chữ thường hơn là sử dụng .toLowerCase(). Tên đó là LỚN !!! Ngoài ra, String.fromCharCodecó thể chấp nhận nhiều tham số hoặc được gọi làString.fromCharCode.call([...])
Ismael Miguel

1
@IsmaelMiguel Có vẻ như tôi đã đúng về việc nó cần viết lại, nhưng sai về việc nó cần phải là một người khác. Tôi cảm thấy câu trả lời này thú vị hơn, nhưng câu trả lời khác thì ngắn gọn hơn về mặt kỹ thuật, vì vậy tôi đã bao gồm cả hai cách riêng biệt.
Mwr247

1
Không thay đổi cuộc sống nhưng regrec của bạn không chứa các chữ cái nên nó không cần icờ.
Neil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.