สิ่งที่เป็นตัวละคร HTML นั้น?


11

เป้าหมายง่ายมาก การรับสตริงเป็นอินพุตให้วิเคราะห์เอนทิตี HTML ทั้งหมดที่ตรงกับอักขระต่อไปนี้ (รวมถึงตัวแปรตัวพิมพ์ใหญ่):

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

การแยกกฎ:

  • แต่ละเอนทิตีเริ่มต้นด้วย&และลงท้ายด้วย;
  • ตัวอักษรตัวแรกหลังจากที่&จะเป็นตัวละครที่ปรับเปลี่ยน (กรณีตัวอักษรเป็นสิ่งสำคัญ!)
  • ตัวอักษรที่เหลืออ้างถึงชื่อของสำเนียงที่จะใช้ ( acute, grave, circ, tildeและuml) ชื่อที่เน้นจะต้องเป็นตัวพิมพ์เล็ก! * * * *
  • นิติบุคคล HTML ใด ๆ ที่ก่อให้ตัวละครที่ไม่อยู่ในรายการนั้น ๆ หรือว่าไม่ถูกต้องควรจะเหลือไม่มีใครแตะต้อง (เช่น: &, &etilde;, &a;)
  • ควรละเว้นเอนทิตีที่เป็นตัวเลขเนื่องจากไม่สอดคล้องกับกฎข้างต้น

การเปลี่ยนแปลงนี้เริ่มใช้ตั้งแต่วันที่ 18-02-2559 คำตอบที่มีอยู่ทั้งหมดที่ยอมรับเอนทิตี 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
ฉันไม่ได้ลงคะแนน แต่ฉันคิดว่า downvotes นั้นเป็นเพราะผู้คนไม่ชอบโบนัส / บทลงโทษจริง ๆ - พวกเขาลงเอยด้วยการทำสิ่งที่ท้าทายให้กลายเป็นความท้าทายเล็ก ๆ หลายประการ
Kevin W.

1
@KevinW ดังที่ฉันได้อธิบายไว้ในกล่องทรายฉันเพียง แต่ทิ้งบทลงโทษเหล่านั้นไว้เพราะฉันต้องการดูว่าอะไรที่ผู้คนสามารถสร้างขึ้นมาได้ แต่เห็นได้ชัดว่าฉันไม่ต้องการที่จะทำให้เสียความสนุกของทุกคน ถ้าฉันไม่ใส่ความผิดคำตอบเช่นจาวาสคริปต์ที่ฉันให้ไว้ก็เพียงพอแล้ว และนั่นก็ไม่จำเป็นต้องทำงานเลย
Ismael Miguel

1
IMHO โบนัสดูเหมือนโดยพลการไม่ว่าจะอนุญาตหรือไม่อนุญาต
Addison Crump

1
@IsmaelMiguel ฉันขอแนะนำให้ไม่มีโบนัส / การลงโทษ - อนุญาตให้ใช้วิธีการเขียนโปรแกรมใด ๆ ที่พวกเขาต้องการใช้ (นอกมาตรฐานของช่องโหว่มาตรฐาน) และลบโบนัส / การลงโทษ
Addison Crump

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

หก?s แสดงถึงตัวอักษรที่ไม่สามารถพิมพ์ได้ ทดสอบออนไลน์!

หมายเหตุ: นี่จะเป็นตัวเลือกการเข้ารหัสที่สาม นั่นคือตัวอักษรตามด้วยการเข้ารหัส 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 ได้ไหม? คุณดูเหมือนจะมีอักขระ "แปลก ๆ " บางตัวที่อาจไม่สามารถใช้งานได้ในการเข้ารหัสทุกครั้ง
Ismael Miguel

@IsmaelMiguel ฉันเพิ่งรู้ว่าสำเนียงไม่ได้เป็นส่วนหนึ่งของการเข้ารหัส ISO-8859-1 ดังนั้นฉันจึงไม่บีบอัดสตริงและเปลี่ยนเป็น UTF-8 ไบต์ คุณยังต้องการ hexdump ไหม?
ETHproductions

ขึ้นอยู่กับคุณ แต่ทางออกก่อนหน้าของคุณนั้นดีมาก
Ismael Miguel

ฉันคิดว่าคุณอาจมีข้อผิดพลาดเล็ก ๆ ที่นั่นรหัสของคุณดูเหมือนจะทิ้งไว้Ýคนเดียว แต่ควรเปลี่ยนเป็นÝ ...
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]])

ทำตามตัวอย่างของ daavko โดยใช้เครื่องหมายกำกับเสียงและฉันรู้สึกเหมือนคนงี่เง่าที่ไม่คิดว่าจะใช้มันในไม่ช้า อันที่จริงแล้ว JavaScript สั้นเกินไป

แก้ไข: นีลตรวจพบกรณีเลวร้ายที่ไม่ได้กำหนดซึ่งตอนนี้ได้รับการแก้ไขแล้ว


ดู? ฉันบอกคุณว่าคุณสามารถลดไขมันได้! นี่เป็นคำตอบที่น่าประหลาดใจจริงๆ! ฉันหวังว่าคุณจะได้รับ +1 มากกว่านี้
Ismael Miguel

1
นี่เป็นแค่ความฉลาด +1
Yytsi

ฉันรักมัน..! String.prototype.replaceสามารถเล่นได้อย่างขันแข็งเพื่อการสำรวจเส้นทางด้วยเชือก
Archenoth

ฉันไม่เชื่อว่าเรื่องนี้จะเป็นสิ่งที่เหมาะสมสำหรับÉ(สิ่งที่เป็นสิ่งที่ถูกต้อง)
Neil

น่าเศร้าที่ @ Neil ถูกต้อง เบราว์เซอร์เอนทิตีตัวพิมพ์ใหญ่ HTML ไม่ถูกต้อง แต่ฉันไม่ได้ระบุว่าชื่อสำเนียงควรเป็นตัวพิมพ์เล็กทั้งหมด นั่นคือความผิดของฉัน ฉันจะพิจารณาคำตอบนี้ถูกต้องและทุกคนที่โพสต์แล้ว แต่คำตอบใหม่จะต้องมีชื่อที่เน้นเป็นตัวพิมพ์เล็ก
Ismael Miguel

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 ทันที
Ismael Miguel

ฉันนับ 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


ดี! ฉันชอบ aproach ของคุณ แต่ 286 ไบต์นั้นค่อนข้างยาว อาจมีบางสิ่งที่สามารถตัดออกได้? การตัดไขมันบางส่วนจะดีมาก
Ismael Miguel

@IsmaelMiguel 288 จริง ๆ ; ฉันเพิ่งรู้ว่ามี&Yuml;อยู่จริงใน UTF8: มันอยู่ในสถานที่แปลก ๆ เหมือนกันทั้งหมดฉันคิดว่าฉันควบแน่นและปรับให้เหมาะสมมันค่อนข้างดีการพิจารณารายการแทนที่ที่แท้จริงจะยาวกว่าสองเท่า คุณเห็นสิ่งที่ฉันไม่?
Mwr247

ไม่ได้จริงๆ ... .toLowerCase()ต้องมีวิธีที่ดีกว่าที่จะทำให้ตัวอักษรตัวพิมพ์เล็กกว่าการใช้ ชื่อนั้นใหญ่มาก !!! นอกจากนี้String.fromCharCodeสามารถยอมรับพารามิเตอร์หลายตัวหรือถูกเรียกว่าString.fromCharCode.call([...])
Ismael Miguel

1
@IsmaelMiguel ดูเหมือนว่าฉันถูกต้องเกี่ยวกับมันต้องการเขียนใหม่ แต่ผิดเกี่ยวกับมันต้องเป็นคนอื่น ฉันรู้สึกว่าคำตอบนี้น่าสนใจยิ่งขึ้น แต่อีกคำตอบที่กระชับกว่าในทางเทคนิคดังนั้นฉันจึงรวมคำตอบเหล่านั้นแยกกัน
Mwr247

1
ไม่ใช่การเปลี่ยนแปลงชีวิต แต่ regexp ของคุณไม่มีตัวอักษรที่แท้จริงดังนั้นจึงไม่จำเป็นต้องมีการiตั้งค่าสถานะ
Neil
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.