태그를 닫으십시오!


13

이것은 동일한 이름을 가진 이전에 삭제 된 도전 과제를 기반으로합니다.

소개

입력에 XML과 같은 1 개의 태그 가 모두 적절하게 열리고 닫히고 올바른 순서로 있는지에 따라 참 또는 거짓 값을 반환하는 프로그램을 작성해야합니다 . 다음을 입력으로 고려하십시오.

<Apple>

태그가 올바르게 닫히지 않아 잘못된 값을 반환합니다. 이:

<Apple></Apple>

반대로 올바르게 닫혀 있기 때문에 정확한 값을 반환합니다. 프로그램은 또한 중첩 된 태그가 올바른 위치에 있는지 확인해야합니다. 예를 들어, 이것을 입력으로 사용하십시오.

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

모든 태그가 올바르게 닫히지 만 올바른 순서는 아닙니다 . 프로그램은 올바른 태그 계층 및 중첩을 확인해야합니다.

정의

규칙과 가정에 들어가기 전에 몇 가지 사항을 정의하겠습니다.

꼬리표

기본 XML 스타일 태그 예를 들면 다음과 같습니다 <Apple>.. 그들은 너무, 최고의 공간 후행 (그렇지 않으면이 무효 falsey의) 대부분에서 하나를 가질 수 < Apple ><Apple>동일합니다. 태그는 같은 속성을 포함 할 수 있습니다 foo="bar" (필수 따옴표, 그렇지 않으면 무효 falsey과)를 , 그리고 속성 이름은 영숫자 문자 또는 포함 할 수 있습니다 _, :, -,와 .. 속성 이름에는 속성 값도 필요하지 않으며 값은 "큰 따옴표로 묶기 전에는 아무 것도 포함 할 수 없습니다 . 닫는 태그에는 속성이 없어야하며 태그에는 줄 바꿈이 없어야합니다.

태그 이름

태그 이름은 태그 이름입니다. 예를 들어 <Apple>의 태그 이름은 Apple입니다. 태그 이름은 속성 이름과 동일한 문자를 포함 할 수 있으며 대소 문자를 구분합니다. 이 수단 <Apple>이다 없습니다 <apple> .

자체 결산 태그

<Apple />or 와 같이 닫히는 일반 태그입니다 <Apple/>(동일합니다). 슬래시와 태그 이름 사이의 공백이 허용됩니다.

일반 텍스트

무엇이든을 포함 할 수 있으며 묶여되지 않는 문자의 문자열 <>.

"간단한"태그

여는 태그, 닫는 태그 또는 자체 닫는 태그입니다.

규칙

  • 출력물은 반환되거나 인쇄 될 수 있으며 원하는 방식으로 입력 할 수 있습니다.
  • 입력은 태그, 일반 텍스트 또는 둘 다로 구성된 문자열입니다.
  • 프로그램은 기능 또는 전체 작업 프로그램이 될 수 있습니다

  • 일반 텍스트는 어디에나있을 수 있습니다. 입력 이 일반 텍스트 로만 구성된 경우 프로그램은 정확한 값을 반환해야합니다.

  • 프로그램에 중첩 태그를 인식해야합니다. 태그가 태그에 중첩 된 경우 일반 XML처럼 상위를 닫기 전에 중첩 된 태그를 닫아야합니다. 그렇지 않으면 잘못된 값이 반환되어야합니다.

가정

  • 입력이 항상 하나 이상의 "간단한"태그라고 가정 할 수 있습니다
  • 입력이 항상 위에 정의 된 태그의 형식을 따르는 것으로 가정 할 수 있습니다

테스트 사례

팔시

<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

문자열을 XML로 구문 분석하는 내장을 사용할 수 있습니까?
Oliver

@obarakon 문제는 이것이 반드시 유효한 XML 일 필요는 없다는 것입니다. 각주를 참조하십시오.
Andrew Li

그것은이는 것으로, 말을 정확 truthy 입력 : < : : :><:/><: :=":=:" ::></:>< /:>?
insertusername 여기

답변:


2

레티 나 , 76 74 바이트

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

^[^<>]*$

레티 나가 골프 정규식에 정말 좋은 것을 보았으므로 시도해 보았습니다. 내 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은 : 정규 표현식으로 해석해서는 안
JayDepp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.