In einer Schnur oder nicht?

8

Vor kurzem hatte ich einige Probleme mit dem neuen TeaScript- Interpreter. Das größte Problem besteht darin, festzustellen, ob eine Zeichenfolge Sonderzeichen enthält oder nicht.


Herausforderung

Ein Sonderzeichen wird als Zeichen mit den Codepunkten 160 bis 255 definiert. Sie erhalten eine Eingabe, bei der es sich um eine Zeichenfolge mit den Codepunkten 0 bis 255 handelt, von denen höchstens eines ein Sonderzeichen ist. Die Eingabe besteht aus einem Präfix von null oder mehr Zeichen, einer Zeichenfolge in Anführungszeichen und einem Suffix von null oder mehr Zeichen. Wenn die Zeichenfolge in Anführungszeichen ein Sonderzeichen enthält, sollten Sie einen Wahrheitswert ausgeben, andernfalls einen Falschwert.

Einzelheiten

  • Die Zeichen "'werden als Anführungszeichen betrachtet.
  • Innerhalb der Zeichenfolge in Anführungszeichen wird ein Backslash \verwendet, um das folgende Zeichen zu umgehen. Im Präfix und Suffix hat es keine besondere Bedeutung.
  • Zitate werden immer ausgewogen sein.
  • Es wird nur eine Zeichenfolge in Anführungszeichen geben.

Beispiele

"Hello, World¡"
true

"Hello, World"¡
false

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

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

\"foo¡"
true
Downgoat
quelle
1
Dies könnte einen Testfall verwenden, bei dem das Unicode-Zeichen maskiert wird.
Martin Ender
1
Auch Testfälle, die tatsächlich 'Zeichenfolgen und mehrere Zeichenfolgen in einem einzelnen Testfall verwenden (idealerweise mit dem Unicode-Zeichen dazwischen).
Martin Ender
@ MartinBüttner Eine der Regeln lautet: "Es wird nur einen Satz Anführungszeichen geben", aber +1 für die anderen Testfallideen.
user81655
@ user81655 oh richtig, das habe ich übersehen. Das vereinfacht die Dinge.
Martin Ender
6
"Da Unicode nur 1.114.112 Zeichen enthält, muss Ihr Code so kurz wie möglich sein." ................ Ich habe keine Worte für Ihre Golfbegründungen.
ETHproductions

Antworten:

5

Netzhaut , 19 17 Bytes

Vielen Dank an user81655 für das Speichern von 2 Bytes.

Die Byteanzahl verwendet ISO 8859-1.

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

Die Ausgabe ist 0 oder 1.

Probieren Sie es online aus.

Erläuterung

Aufgrund der Annahmen der Herausforderung beginnt die erste 'oder "die einzige Zeichenfolge der Eingabe und die letzte 'oder "beendet sie. Wir müssen uns auch keine Sorgen machen, dass sie gleich sind, weil sie garantiert sowieso gleich sind.

Daher versucht der reguläre Ausdruck nur, ein Zeichen mit den Codepunkten 161 bis einschließlich 255 zu finden, dem ein Anführungszeichen vorausgeht und dem ein anderes folgt. Es wird immer entweder 0 oder 1 Übereinstimmung geben.

Martin Ender
quelle
Wird dies nicht ein falsches Positiv sein "abc"¡'? (Ich denke, je nachdem, wie Sie das OP lesen, kann dieses bloße einfache Anführungszeichen niemals in einer Eingabe vorkommen, aber technisch gesehen enthält diese Eingabe nur einen Satz von Anführungszeichen.)
Lynn
@ Mauris die Spezifikation sagt, dass Anführungszeichen immer ausgeglichen sein werden.
Martin Ender
Hier ist eine weitere 17-Byte-Lösung : (['"]).*[¡-ÿ].*\1. Es ist praktischer.
Mama Fun Roll
@ ן nɟuɐɯɹɐ ן oɯ ja, ich habe das in Betracht gezogen, aber angesichts der Annahmen der Herausforderung dachte ich, es sei übertrieben. ¯ \ _ (ツ) _ / ¯
Martin Ender
4

Hinweis: Dies kann mit einem einfachen regulären Ausdruck erfolgen. s=>s.match`['"].*[¡-ÿ].*['"]`ist 29 Bytes in JavaScript, aber es macht mehr Spaß ohne reguläre Ausdrücke:

JavaScript (ES6), 84 82 Byte

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

Erläuterung

Rückgabe 1für trueund 0für false. Der " "im folgenden Code ist ein U+00A0 NO-BREAK SPACE(Codepunkt 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

Prüfung

user81655
quelle
Behandelt es die Rücktaste, um Anführungszeichen zu umgehen?
edc65
Was meinst du? Sie können es mit dem Test-Snippet testen.
user81655
Recht. Es tut in der Tat
edc65
Oh, Ihre Regex ist noch kürzer als meine zweistufige Retina-Lösung. Stört es Sie, wenn ich es benutze?
Martin Ender
@ MartinBüttner Mach weiter. Es ist sowieso ziemlich dasselbe.
user81655