タグを閉じてください!


13

これは、以前に削除された同じ名前の私のチャレンジに基づいています

前書き

入力にXMLのような1タグがすべて適切に開閉され、正しい順序であるかどうかに基づいて、真偽値を返すプログラムを作成する必要があります。入力として次のことを考慮してください。

<Apple>

タグが正しく閉じられていないため、これは偽の値を返します。この:

<Apple></Apple>

反対に、正しく閉じられているため、真理値を返します。また、ネストされたタグをチェックして、正しい位置にあることを確認する必要があります。たとえば、これを入力として使用します。

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

すべてのタグは正しく閉じられていますが、正しい順序ではありません。プログラムは、正しいタグ階層とネストをチェックする必要があります。

定義

ルールと仮定に入る前に、いくつかのことを定義しましょう。

鬼ごっこ

基本的なXMLスタイルのタグ。例:<Apple>。彼らは(あるいはそうでなければ無効とfalseyだ)、最大で1つの先頭と末尾のスペースを持っているので、できる< Apple ><Apple>同じです。これらのタグは、などの属性も含めることができますfoo="bar" (必要な二重引用符、または他の無効とfalsey付き)を、および属性名は任意の英数字またはを含むことができ_:-、と.。属性名には属性値も必要ありません。また、値には、"二重引用符を閉じる前以外の値を含めることができます。終了タグには属性を含めることはできません。また、タグに改行を含めることはできません。

タグ名

タグ名はタグの名前です。たとえば、<Apple>のタグ名はAppleです。タグ名には、属性名と同じ文字を含めることができ、大文字と小文字が区別されます。これはそうで<Apple>はありません <apple>

自己閉鎖タグ

<Apple />または<Apple/>(同じです)など、自分自身を閉じる通常のタグ。スラッシュとタグ名の間のスペースは許可されます。

プレーンテキスト

何でも含むことができ、<andで囲まれていない文字列>

「シンプル」タグ

開始タグ、終了タグ、または自己終了タグのいずれか。

ルール

  • 出力は返されるか印刷される場合があり、入力は任意の方法で取得できます
  • 入力は、タグ、プレーンテキスト、またはその両方で構成される文字列です
  • あなたのプログラムは、機能または作業プログラム全体にすることができます

  • プレーンテキストはどこでもかまいません。入力がプレーンテキストのみで構成されている場合、プログラムは真実の値を返す必要があります。

  • プログラムにはネストされたタグの認識が必要です。タグがタグ内にネストされている場合、通常のXMLと同様に、ネストされたタグを閉じてから親を閉じる必要があります。そうしないと、falsey値が返されます。

仮定

  • 入力は常に1つ以上の「単純な」タグであると想定できます。
  • 入力は常に上記で定義されたタグの形式に従うと想定できます。

テストケース

偽り

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

真実の

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です。タグ名と属性名は仕様と異なります。


タグの前後に複数のスペースがある場合、falseとしてマークする必要がありますか?
JayDepp

@JayDeppはい-私の投稿でそれを明確にさせてください
アンドリュー・リー

文字列をXMLに解析するビルトインを使用できますか?
オリバー

@obarakon問題は、これが必ずしも有効なXMLではないことです。脚注を参照してください。
アンドリューリー

これがあると、言うことは正しいですtruthy入力< : : :><:/><: :=":=:" ::></:>< /:>
insertusernamehere 16

回答:


2

網膜76 74バイト

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

^[^<>]*$

私は網膜がゴルフの正規表現に本当に良いことを見たので、私はそれを試してみると思いました。Rubyの回答と同じロジックに従い、0または1を出力します。

オンラインでお試しください!


1
あなたは必要ありませんM`。最終段階に単一の部分しかない場合、一致モードが暗黙的に指定されます。
マーティンエンダー

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 16

@orlp「値には、二重引用符の前にある」以外のすべてを含めることができます。
JayDepp 16

ああ、それは...本当のXMLではありません
orlp

1
本物のXMLを正規表現で解析しないでください:)
JayDepp
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.