文字列かどうか?


8

最近、新しいTeaScriptインタープリターで問題が発生しています。最大の問題は、文字列に特殊文字が含まれているかどうかを識別することです。


チャレンジ

特殊文字は、コードポイント160〜255の文字として定義されます。コードポイント0〜255の文字列である入力が与えられますが、最大1つは特殊文字です。入力は、ゼロ以上の文字のプレフィックス、引用符付き文字列、およびゼロ以上の文字のサフィックスで構成されます。引用符で囲まれた文字列に特殊文字がある場合は、真の値を出力し、そうでない場合は偽の値を出力する必要があります。

細部

  • 文字"'は引用符と見なされます。
  • 引用符で囲まれた文字列内では、バックスラッシュ\を使用して次の文字をエスケープします。プレフィックスとサフィックスでは、特別な意味はありません。
  • 見積もりは常にバランスが取れています。
  • 引用符で囲まれた文字列は1つだけです。

"Hello, World¡"
true

"Hello, World"¡
false

"Hello' Wo\"rld\\"¡
false

ab"cd\"ef\\gh\i\\"£
false

\"foo¡"
true

1
これは、Unicode文字がエスケープされるテストケースを使用できます。
マーティンエンダー

1
また'、単一のテストケースで文字列と複数の文字列を実際に使用するテストケース(理想的には、その間にUnicode文字を使用)。
マーティンエンダー

@MartinBüttnerルールの1つは、「引用符のセットは1つしかない」ということですが、他のテストケースのアイデアは+1します。
user81655

@ user81655ああ、見落としました。それは物事を簡素化します。
マーティンエンダー

6
「Unicodeには1,114,112文字しかないので、コードはできるだけ短くする必要があります」................ゴルフの正当化についての言葉はありません。
ETHproductions、2015

回答:


5

Retina19 17バイト

2バイトを節約してくれたuser81655に感謝します。

バイト数はISO 8859-1を使用します。

['"].*[¡-ÿ].*['"]

出力は0または1です。

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

説明

挑戦の仮定、最初に起因する'か、"入力の文字列のみと最後開始します'"、それが終了します。いずれにしても同じであることが保証されているため、同じであることを心配する必要もありません。

したがって、正規表現は、コードポイント161〜255の文字を検索しようとしますが、その前に1つの引用符があり、その後に別の引用符が続きます。常に0または1の一致があります。


これは誤検知を引き起こしません"abc"¡'か?(OPの読み方にもよりますが、入力では一重引用符は決して発生しませんが、技術的にはこの入力には引用符のセットが1つしかありません。)
Lynn

@Mauris仕様では、相場は常にバランスが取れていると述べています。
Martin Ender

次に、17バイトのソリューションを示します(['"]).*[¡-ÿ].*\1。それはたまたまより実用的です。
ママファンロール

@ןnɟuɐɯɹɐןoɯええ、私はそれを検討しましたが、チャレンジの前提を考えれば、それはやり過ぎだと考えました。¯\ _(ツ)_ /¯
マーティン・エンダー

4

注:これは、単純な正規表現で実行できます。s=>s.match`['"].*[¡-ÿ].*['"]`JavaScriptでは29バイトですが、正規表現を使わない方が楽しいです。

JavaScript(ES6)、84 82バイト

s=>[...s].map((c,i)=>q?i<s.lastIndexOf(q)&c>" "?r=1:s:c=="'"|c=='"'?q=c:0,q=r=0)|r

説明

戻り値1のためにtrue0のためにfalse" "以下のコードでは、U+00A0 NO-BREAK SPACE(コード・ポイント160)。

s=>
  [...s].map((c,i)=>     // for each character c in the string
    q?
      i<s.lastIndexOf(q) // if we are still inside the string
        &c>" "?r=1       // and c is a "unicode character", set the result to 1 (true)
      :s                 // returning s for false guarantees that the array returned by map
                         //     will cast to NaN, which allows us to use |r instead of &&r
    :c=="'"|c=='"'?      // if we are starting a string
      q=c                // set the end of string character
    :0,
    q=                   // q = end string character
      r=0,               // initialise r to 0 (false)
  )|r                    // return r

テスト


引用符をエスケープするためにバックスペースを処理しますか?
edc65

どういう意味ですか?テストスニペットを使用してテストできます。
user81655

正しい。それは実際にはあります
edc65

ああ、あなたの正規表現は私の2ステージのRetinaソリューションよりもさらに短いです。使ってもいいですか?
マーティンエンダー

@MartinBüttnerどうぞ。とにかくほとんど同じです。
user81655
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.