Đóng thẻ của bạn!


13

Điều này dựa trên một thử thách đã bị xóa trước đó của tôi có cùng tên

Giới thiệu

Bạn được giao nhiệm vụ viết một chương trình trả về một truthy hoặc falsey giá trị dựa trên nếu đầu vào có tất cả XML giống như mình 1 thẻ một cách thích hợp mở ra và đóng lại và theo thứ tự đúng. Hãy xem xét những điều sau đây như đầu vào:

<Apple>

Điều này sẽ trả về giá trị falsey vì thẻ không được đóng chính xác. Điều này:

<Apple></Apple>

Ngược lại trả về một giá trị trung thực vì nó được đóng chính xác. Chương trình cũng nên kiểm tra các thẻ lồng nhau để đảm bảo chúng ở đúng vị trí. Ví dụ: lấy cái này làm đầu vào:

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

Tất cả các thẻ được đóng chính xác, nhưng không theo đúng thứ tự . Chương trình của bạn phải kiểm tra phân cấp thẻ chính xác và lồng nhau.

Các định nghĩa

Hãy để tôi xác định một vài điều trước khi tôi đi vào các quy tắc và giả định.

Nhãn

Thẻ kiểu XML cơ bản. Ví dụ : <Apple>. Họ có thể có nhiều nhất, một không gian hàng đầu và dấu (hoặc nếu không thì không hợp lệ và chim ưng), < Apple ><Apple>cũng vậy. Những thẻ này cũng có thể chứa các thuộc tính như foo="bar" (với dấu ngoặc kép cần tăng gấp đôi, hoặc không hợp lệ khác và falsey) , và tên thuộc tính chỉ có thể chứa bất kỳ ký tự chữ và số hoặc _, :, -, và .. Tên thuộc tính cũng không yêu cầu giá trị thuộc tính và các giá trị có thể chứa bất cứ thứ gì ngoại trừ "trước dấu ngoặc kép đóng. Thẻ đóng không được chứa các thuộc tính và không có thẻ nào có dòng mới trong đó.

Tên thẻ

Tên thẻ là tên của thẻ. Ví dụ: <Apple>tên thẻ là Apple. Tên thẻ có thể chứa các ký tự giống như tên thuộc tính và phân biệt chữ hoa chữ thường. Điều này có nghĩa <Apple>không <apple> .

Thẻ tự đóng

Một thẻ thông thường tự đóng như vậy ( <Apple />hoặc <Apple/>chúng giống nhau). Không gian giữa dấu gạch chéo và tên thẻ được cho phép.

Văn bản thô

Một chuỗi các ký tự có thể chứa bất cứ thứ gì và không được đặt trong <>.

Thẻ "đơn giản"

Thẻ mở, đóng hoặc tự đóng.

Quy tắc

  • Đầu ra có thể được trả lại hoặc in, và đầu vào có thể được thực hiện theo bất kỳ cách nào bạn muốn
  • Đầu vào là một chuỗi, bao gồm một trong hai thẻ, văn bản thuần túy hoặc cả hai
  • Chương trình của bạn có thể là một chức năng hoặc toàn bộ chương trình làm việc

  • Văn bản thuần túy có thể ở bất cứ đâu; nếu đầu vào chỉ bao gồm văn bản thuần túy, chương trình sẽ trả về giá trị trung thực.

  • Việc nhận dạng các thẻ lồng nhau là cần thiết cho chương trình. Nếu một thẻ được lồng trong một thẻ, thẻ đó phải được đóng trước khi đóng cha mẹ, giống như XML thông thường hoặc nếu không thì phải trả về giá trị falsey

Giả định

  • Bạn có thể cho rằng đầu vào sẽ luôn là một hoặc nhiều thẻ "đơn giản"
  • Bạn có thể cho rằng đầu vào sẽ luôn tuân theo định dạng cho các thẻ được xác định ở trên

Các trường hợp thử nghiệm

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>

Sự thật

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>

Chấm điểm

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng. Sơ hở tiêu chuẩn bị cấm như bình thường.


1 Lưu ý : Đây không phải là XML thực, mà là XML giả với các quy tắc khác nhau cho thử thách. Tên thẻ và thuộc tính khác với đặc điểm kỹ thuật.


Nếu một thẻ có nhiều hơn một khoảng trắng trước hoặc sau nó, chúng ta có phải đánh dấu nó sai không?
JayDepp

@JayDepp Có - hãy để tôi làm rõ điều đó trong bài đăng của mình
Andrew Li

Chúng ta có thể sử dụng các phần tử phân tích cú pháp chuỗi thành XML không?
Oliver

@obarakon Vấn đề là đây không nhất thiết phải là XML hợp lệ. Xem chú thích.
Andrew Li

Có đúng không khi nói rằng đây là một đầu vào trung thực : < : : :><:/><: :=":=:" ::></:>< /:>?
insertusernamehere

Câu trả lời:


2

Võng mạc , 76 74 byte

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

^[^<>]*$

Vì tôi đã thấy rằng võng mạc thực sự tốt cho các môn thể thao golf, tôi nghĩ rằng tôi đã thử nó. Theo logic tương tự như câu trả lời Ruby của tôi và in 0 hoặc 1.

Hãy thử trực tuyến!


1
Bạn không cần M`. Nếu giai đoạn cuối chỉ có một phần duy nhất, chế độ khớp được ngụ ý.
Martin Ender

1

Ruby (2.3.1), 103 101 100 byte

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

Chức năng ẩn danh được gọi bằng cách nối thêm .call("<Apple></Apple>"). Thay thế các thẻ khớp hoặc tự đóng cho đến khi không có bất kỳ thẻ nào, và sau đó trả về cho dù chuỗi không còn dấu ngoặc góc.

Hãy thử trực tuyến!


Điều này đánh dấu <p title="This is a \"test\"."></p>là Falsey, nhưng nó không nên.
orlp

@orlp 'các giá trị có thể chứa bất cứ thứ gì ngoại trừ "trước dấu ngoặc kép đóng.'
JayDepp

Ồ, đó không phải là XML thực sự ...
orlp

1
XML thực sự không bao giờ nên được phân tích cú pháp bằng regex :)
JayDepp
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.