Trong một chuỗi hay không?


8

Gần đây tôi đã gặp một số rắc rối với trình thông dịch TeaScript mới . Vấn đề lớn nhất là xác định xem một chuỗi có chứa bất kỳ ký tự đặc biệt nào hay không.


Thử thách

Một ký tự đặc biệt được định nghĩa là một ký tự có mã từ 160 đến 255. Bạn sẽ được cung cấp một đầu vào là một chuỗi các ký tự có mã từ 0 đến 255, nhiều nhất là một ký tự đặc biệt. Đầu vào sẽ bao gồm tiền tố từ 0 ký tự trở lên, chuỗi được trích dẫn và hậu tố bằng 0 hoặc nhiều ký tự. Nếu có một ký tự đặc biệt trong chuỗi trích dẫn, bạn nên xuất giá trị trung thực, nếu không thì giá trị falsey.

Chi tiết

  • Các nhân vật "'được coi là trích dẫn.
  • Trong chuỗi trích dẫn, dấu gạch chéo ngược \sẽ được sử dụng để thoát ký tự sau. Trong tiền tố và hậu tố, nó không có ý nghĩa đặc biệt.
  • Báo giá sẽ luôn được cân bằng.
  • Sẽ chỉ có một chuỗi trích dẫn.

Ví dụ

"Hello, World¡"
true

"Hello, World"¡
false

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

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

\"foo¡"
true

1
Điều này có thể sử dụng một trường hợp thử nghiệm trong đó ký tự Unicode được thoát.
Martin Ender

1
Ngoài ra các trường hợp thử nghiệm thực sự sử dụng 'chuỗi và nhiều chuỗi trong một trường hợp thử nghiệm (lý tưởng nhất là với ký tự Unicode giữa chúng).
Martin Ender

@ MartinBüttner Một trong những quy tắc là "Sẽ chỉ có một bộ dấu ngoặc kép" nhưng +1 cho các ý tưởng trường hợp thử nghiệm khác.
dùng81655

@ user81655 oh đúng rồi, tôi đã bỏ qua điều đó. Điều đó đơn giản hóa mọi thứ.
Martin Ender

6
"Bởi vì chỉ có 1.114.112 ký tự trong unicode, mã của bạn sẽ cần phải ngắn nhất có thể" ................ Tôi không có từ nào để biện minh cho việc chơi golf của bạn.
Sản phẩm ETH

Câu trả lời:


5

Võng mạc , 19 17 byte

Cảm ơn user81655 vì đã tiết kiệm được 2 byte.

Số lượng byte sử dụng ISO 8859-1.

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

Đầu ra là 0 hoặc 1.

Hãy thử trực tuyến.

Giải trình

Do các giả định của thử thách, chuỗi đầu tiên 'hoặc "sẽ bắt đầu chuỗi duy nhất của đầu vào và cuối cùng 'hoặc "kết thúc nó. Chúng ta cũng không cần phải lo lắng về việc chúng giống nhau bởi vì dù sao chúng cũng được đảm bảo giống nhau.

Do đó, regex chỉ cố gắng tìm một ký tự có mã điểm 161 đến 255, bao gồm, trước một trích dẫn và tiếp theo là một ký tự khác. Sẽ luôn có 0 hoặc 1 trận đấu.


Điều này sẽ không cho một dương tính giả cho "abc"¡'? (Tôi đoán tùy thuộc vào cách bạn đọc OP, trích dẫn đơn lẻ đó không bao giờ có thể xảy ra trong đầu vào, nhưng về mặt kỹ thuật chỉ có một bộ trích dẫn trong đầu vào này.)
Lynn

@Mauris thông số kỹ thuật nói rằng báo giá sẽ luôn được cân bằng.
Martin Ender

Đây là một giải pháp 17 byte khác : (['"]).*[¡-ÿ].*\1. Nó xảy ra để thực tế hơn.
Mama Fun Roll

@ Nɟuɐɯɹɐ ן oɯ yeah, tôi đã xem xét cái đó, nhưng hình dung nó là quá mức cần thiết, đưa ra các giả định của thử thách. ¯ \ _ (ツ) _ /
Martin Ender

4

Lưu ý: Điều này có thể được thực hiện với một biểu thức chính quy đơn giản. s=>s.match`['"].*[¡-ÿ].*['"]`là 29 byte trong JavaScript, nhưng sẽ vui hơn khi không có biểu thức chính quy:

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

Giải trình

Trả về 1cho true0cho false. Các " "trong các mã dưới đây là một U+00A0 NO-BREAK SPACE(mã điểm 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

Kiểm tra


Liệu nó xử lý backspace để thoát dấu ngoặc kép?
edc65

Ý anh là gì? Bạn có thể kiểm tra nó bằng đoạn kiểm tra.
dùng81655

Đúng. Thực tế là vậy
edc65

Oh, regex của bạn thậm chí còn ngắn hơn giải pháp Retina hai giai đoạn của tôi. Bạn có phiền nếu tôi sử dụng nó?
Martin Ender

@ MartinBüttner Đi trước. Dù sao nó cũng khá giống nhau.
dùng81655
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.