ปิดแท็กของคุณ!


13

นี่เป็นพื้นฐานของความท้าทายที่ถูกลบไปแล้วของฉันก่อนหน้านี้ที่มีชื่อเดียวกัน

บทนำ

คุณได้รับมอบหมายให้เขียนโปรแกรมที่ส่งคืนค่าความจริงหรือความเท็จตามหากอินพุตมีแท็กXML เหมือน1 ทั้งหมดที่เปิดและปิดอย่างเหมาะสมและอยู่ในลำดับที่ถูกต้อง พิจารณาสิ่งต่อไปนี้เป็นอินพุต:

<Apple>

นี่จะคืนค่าเท็จเนื่องจากแท็กปิดไม่ถูกต้อง นี้:

<Apple></Apple>

ในทางตรงกันข้ามจะส่งกลับค่าความจริงเพราะมันถูกปิดอย่างถูกต้อง โปรแกรมควรตรวจสอบแท็กที่ซ้อนกันเพื่อให้แน่ใจว่าอยู่ในตำแหน่งที่ถูกต้อง ตัวอย่างเช่นใช้สิ่งนี้เป็นอินพุต:

<mango><Apple></mango></Apple>

แท็กทั้งหมดจะถูกปิดอย่างถูกต้องแต่ไม่ได้อยู่ในลำดับที่ถูกต้อง โปรแกรมของคุณต้องตรวจสอบลำดับชั้นของแท็กและการซ้อนที่ถูกต้อง

คำนิยาม

ขอให้ฉันนิยามบางสิ่งก่อนที่ฉันจะเข้ามาในกฎและข้อสมมติฐาน

แท็ก

แท็กสไตล์ XML พื้นฐาน ตัวอย่างเช่น<Apple>. พวกเขาสามารถมีได้มากที่สุดหนึ่งพื้นที่ชั้นนำและต่อท้าย (หรืออื่น ๆ มันไม่ถูกต้องและเป็นเท็จ) ดังนั้น< Apple >และ<Apple>เหมือนกัน แท็กเหล่านี้สามารถมีคุณลักษณะเช่นfoo="bar" (กับคำพูดคู่ต้องหรืออื่น ๆ ที่ไม่ถูกต้องและ falsey)และชื่อแอตทริบิวต์เท่านั้นที่สามารถมีตัวอักษรและตัวเลขใด ๆ หรือ_, :, และ- .ชื่อแอ็ตทริบิวต์ยังไม่ต้องการค่าแอททริบิวต์และค่าสามารถมีอะไรก็ได้ยกเว้น"ก่อนปิดการเสนอราคาแบบปิดคู่ แท็กปิดจะต้องไม่มีแอตทริบิวต์และไม่มีแท็กที่ควรมีบรรทัดใหม่

ชื่อแท็ก

ชื่อแท็กเป็นชื่อของแท็ก ยกตัวอย่างเช่นชื่อแท็ก<Apple> Appleชื่อแท็กสามารถมีอักขระเหมือนกับชื่อแอตทริบิวต์และคำนึงถึงตัวอักษรพิมพ์เล็ก - ใหญ่ วิธีนี้<Apple>คือไม่ได้ <apple>

แท็กปิดตัวเอง

แท็กปกติที่ปิดตัวเองเช่น<Apple />หรือ<Apple/>(พวกเขาเหมือนกัน) อนุญาตให้มีช่องว่างระหว่างเครื่องหมายทับและชื่อแท็ก

ข้อความธรรมดา

สตริงของตัวอักษรที่สามารถมีอะไรและไม่ได้อยู่ในและ<>

แท็ก "ง่าย"

ไม่ว่าจะเป็นแท็กเปิดปิดหรือปิดตัวเอง

กฎระเบียบ

  • เอาต์พุตอาจถูกส่งคืนหรือพิมพ์และอินพุตอาจถูกใช้ในแบบที่คุณต้องการ
  • อินพุตเป็นสตริงซึ่งประกอบด้วยแท็กข้อความธรรมดาหรือทั้งสองอย่าง
  • โปรแกรมของคุณอาจเป็นฟังก์ชั่นหรือโปรแกรมทำงานทั้งหมด

  • ข้อความธรรมดาสามารถอยู่ได้ทุกที่ หากอินพุตประกอบด้วยข้อความล้วนเท่านั้นโปรแกรมควรส่งคืนค่าความจริง

  • จำเป็นต้องมีการรับรู้ของแท็กที่ซ้อนกันสำหรับโปรแกรม หากแท็กซ้อนอยู่ในแท็กแท็กที่ซ้อนกันนั้นจะต้องปิดก่อนที่จะปิดพาเรนต์เช่นเดียวกับ XML ปกติมิฉะนั้นควรส่งคืนค่าเท็จ

สมมติฐาน

  • คุณสามารถสมมติว่าการป้อนข้อมูลจะเป็นแท็ก "แบบง่าย" อย่างน้อยหนึ่งรายการ
  • คุณสามารถสันนิษฐานได้ว่าอินพุตจะเป็นไปตามรูปแบบสำหรับแท็กที่กำหนดไว้ด้านบนเสมอ

กรณีทดสอบ

Falsey

<apple>

<apple></Apple>

<apple></mango>

<apple><mango>

<a><b></a></b>

Text<ul><li></li><ul />

<pear attr=foo></pear attr=foo>

<Ketchup flavor=spicy></Ketchup>

<Ap ple></Apple>

Truthy

Text 

<Apple />

<Apple></Apple>

< Apple ></ Apple>

<mango><Apple/></mango>

<mango>Text<div class="bar">More text \o/</div></mango>

<food group="fruit">Fruits:<orange :fruit-variety="clementine" /><pear _fruit.type="asian" /></food>

<example foo="abcdefghijklmnopqrstuvwxyz1234567890-/:;()$&@.,?!'" noValue>Any characters allowed! (0.0)</example>

เกณฑ์การให้คะแนน

นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ ช่องโหว่มาตรฐานเป็นสิ่งต้องห้ามตามปกติ


1 หมายเหตุ : นี่ไม่ใช่ XML จริง แต่เป็นหลอก XML ด้วยกฎที่แตกต่างกันสำหรับความท้าทาย ชื่อแท็กและแอตทริบิวต์แตกต่างจากข้อกำหนด


หากแท็กมีมากกว่าหนึ่งช่องว่างก่อนหรือหลังเราต้องทำเครื่องหมายว่าเป็นเท็จหรือไม่
JayDepp

@JayDepp ใช่ - ขอฉันชี้แจงว่าในโพสต์ของฉัน
Andrew Li

เราสามารถใช้ builtins ที่แยกสตริงเป็น XML ได้หรือไม่?
Oliver

@obarakon ปัญหาคือว่านี่ไม่ใช่ XML ที่ถูกต้อง ดูเชิงอรรถ
Andrew Li

มันเป็นสิ่งที่ถูกต้องที่จะพูดว่านี่คือการป้อนข้อมูล truthy : < : : :><:/><: :=":=:" ::></:>< /:>?
insertusernamehere

คำตอบ:


2

เรติน่า , 76 74 ไบต์

+`< ?([-.:\w]+)( ?[-.:\w]+(="[^"]*")?)* ?(/>|>[^<>]*< ?/ ?\1 ?>)

^[^<>]*$

เนื่องจากฉันเห็นว่าเรตินาดีมากสำหรับการเล่นกอล์ฟ regexes ฉันคิดว่าฉันลองใช้ ปฏิบัติตามตรรกะเดียวกันกับคำตอบ Ruby ของฉันและพิมพ์ 0 หรือ 1

ลองออนไลน์!


1
M`คุณไม่จำเป็นต้อง หากสเตจสุดท้ายมีเพียงส่วนเดียวโหมดการจับคู่จะบอกเป็นนัย
Martin Ender

1

ทับทิม (2.3.1), 103 101 100 ไบต์

->s{s.sub!(/< ?([-.:\w]+)( ?[-.:\w]+(="[^"]*")?)* ?(\/>|>[^<>]*< ?\/ ?\1 ?>)/,'')&&redo;!(s=~/<|>/)}

.call("<Apple></Apple>")ฟังก์ชั่นที่ไม่ระบุชื่อเรียกโดยท้าย แทนที่การจับคู่หรือแท็กปิดตัวเองจนกว่าจะไม่ได้มีแล้วส่งคืนว่าสตริงนั้นไม่มีวงเล็บมุมที่เหลืออยู่หรือไม่

ลองออนไลน์!


เครื่องหมายนี้<p title="This is a \"test\"."></p>เป็น Falsey แต่ไม่ควรเป็นเช่นนั้น
orlp

@orlp 'ค่าสามารถมีอะไรก็ได้ยกเว้น "ก่อนเครื่องหมายอัญประกาศปิด'
JayDepp

โอ้ก็ไม่ XML จริง ...
orlp

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