Dalam sebuah string atau tidak?

8

Baru-baru ini saya mengalami masalah dengan juru bahasa TeaScript yang baru . Masalah terbesar adalah mengidentifikasi apakah string berisi karakter khusus atau tidak.


Tantangan

Karakter khusus didefinisikan sebagai karakter dengan codepoint 160 hingga 255. Anda akan diberikan input berupa string karakter dengan codepoint 0 hingga 255, paling banyak di antaranya adalah karakter khusus. Input akan terdiri dari awalan nol atau lebih karakter, string yang dikutip, dan akhiran nol atau lebih karakter. Jika ada karakter khusus dalam string yang dikutip, Anda harus menampilkan nilai yang benar, jika tidak, nilai yang salah.

Detail

  • Karakter "'dianggap kutipan.
  • Di dalam string yang dikutip, garis miring terbalik \akan digunakan untuk keluar dari karakter berikut. Dalam awalan dan sufiks, tidak memiliki arti khusus.
  • Kutipan akan selalu seimbang.
  • Hanya akan ada satu string yang dikutip.

Contohnya

"Hello, World¡"
true

"Hello, World"¡
false

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

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

\"foo¡"
true
Downgoat
sumber
1
Ini bisa menggunakan test case di mana karakter Unicode melarikan diri.
Martin Ender
1
Juga menguji kasus yang benar-benar menggunakan 'string dan banyak string dalam satu kasus uji (idealnya dengan karakter Unicode di antara mereka).
Martin Ender
@ MartinBüttner Salah satu aturan adalah bahwa "Hanya akan ada satu set kutipan" tetapi +1 untuk ide-ide ujian lainnya.
user81655
@ user81655 oh benar, saya mengabaikannya. Itu menyederhanakan banyak hal.
Martin Ender
6
"Karena hanya ada 1.114.112 karakter dalam unicode, kode Anda harus sesingkat mungkin" ................ Saya tidak punya kata-kata untuk pembenaran golf Anda.
Produk ETH

Jawaban:

5

Retina , 19 17 byte

Terima kasih kepada user81655 untuk menghemat 2 byte.

Hitungan byte menggunakan ISO 8859-1.

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

Outputnya 0 atau 1.

Cobalah online.

Penjelasan

Karena asumsi tantangan, yang pertama 'atau "akan mulai hanya string input dan yang terakhir 'atau "mengakhirinya. Kita juga tidak perlu khawatir mereka tetap sama karena mereka dijamin tetap sama.

Oleh karena itu, regex hanya mencoba untuk menemukan karakter dengan titik kode 161 hingga 255, inklusif, yang didahului oleh satu kutipan dan diikuti oleh yang lain. Akan selalu ada 0 atau 1 pertandingan.

Martin Ender
sumber
Bukankah ini akan memberikan hasil positif palsu "abc"¡'? (Saya kira tergantung pada bagaimana Anda membaca OP, kutipan tunggal telanjang itu tidak pernah dapat terjadi dalam suatu input, tetapi secara teknis hanya ada satu set kutipan dalam input ini.)
Lynn
@Mauris, spek mengatakan bahwa kutipan akan selalu seimbang.
Martin Ender
Berikut solusi lain 17-byte: (['"]).*[¡-ÿ].*\1. Kebetulan lebih praktis.
Mama Fun Roll
@ ן nɟuɐɯɹɐ ן oɯ ya, saya mempertimbangkan yang itu, tetapi mengira itu berlebihan, mengingat asumsi tantangan. ¯ \ _ (ツ) _ / ¯
Martin Ender
4

Catatan: Ini dapat dilakukan dengan ekspresi reguler sederhana. s=>s.match`['"].*[¡-ÿ].*['"]`29 byte dalam JavaScript, tetapi lebih asyik tanpa ekspresi reguler:

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

Penjelasan

Pengembalian 1untuk truedan 0untuk false. Dalam " "kode di bawah ini adalah U+00A0 NO-BREAK SPACE(titik kode 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

Uji

pengguna81655
sumber
Apakah ini menangani backspace untuk menghindari kutip?
edc65
Apa maksudmu? Anda dapat mengujinya menggunakan cuplikan uji.
user81655
Baik. Sebenarnya
edc65
Oh, regex Anda bahkan lebih pendek daripada solusi Retina dua tahap saya. Apakah Anda keberatan jika saya menggunakannya?
Martin Ender
@ MartinBüttner Silakan. Lagipula sama saja.
user81655