Băng keo một Regex Decider


11

Nhiệm vụ của bạn là tạo một chương trình xác định xem một chuỗi đã cho có phải là biểu thức chính quy hợp lệ hay không sử dụng các đoạn mã có nguồn gốc từ các trang web trên mạng StackExchange.

Đối với mục đích của thử thách này, phương ngữ biểu thức chính quy sẽ là một bộ siêu ký tự rút gọn và chủ yếu là tối thiểu : ()*?|\. Như vậy, bạn sẽ không thể sử dụng trình phân tích cú pháp regex tích hợp.

  • \được sử dụng để thoát các ký tự meta. Nó phải được theo sau bởi một siêu nhân vật.
  • Dấu ngoặc đơn không được cân bằng phải được cân bằng
  • *?phải được đi trước bởi một nhân vật không phải là meta, một nhóm được ngoặc đơn hoặc một siêu ký tự thoát.
  • Tất cả các ký tự ASCII có thể in khác cộng với dòng mới, tab và khoảng trắng phải được hỗ trợ dưới dạng các ký tự không phải là meta. Điều gì xảy ra với một chuỗi chứa các ký tự khác là không xác định.
  • Ý nghĩa thực sự của regex không quan trọng đối với thử thách này.

Ví dụ

Truthy:
  abc
  a?
  (a|)*
  ()
  a|b*
  \*
  \\
  \\*
  a*b?(cd|e)
  +
  [
  }
  (123\))*
  \|
  (a(b(c|d)*e)*f)*
  (|\)*)
  (abc)+*
  (abc)+
  +abc

^ last test case is an actual newline

Falsy:
  ?abc
  *
  **
  \
  (
  a*?
  a?*
  ?
  a)
  (\)
  (|\)*
  \()
  |*
  (?:abc)
  \\**
  \n

Chấm điểm

Điểm tổng thể của bạn là số lượng đoạn trích được lấy từ các câu hỏi và câu trả lời xung quanh StackExchange.

  • Đoạn trích lặp đi lặp lại nhiều lần như chúng được sử dụng.
  • Khoảng trắng có thể được thêm và xóa một cách tự do (vì Python, Haskell và các ngôn ngữ nhạy cảm với khoảng trắng khác) và không được tính vào số lượng đoạn trích của bạn.
    • Ngoại lệ sẽ là nếu mã của bạn thực sự được viết trong Khoảng trắng .
  • Đoạn trích được phép từ bất kỳ trang web StackExchange nào miễn là chúng đến từ các câu hỏi, câu trả lời và nhận xét cũ hơn (Bao gồm cả thời gian chỉnh sửa - sử dụng các bản sửa đổi cũ hơn nếu cần thiết) so với thử thách này. (Ngày 24 tháng 9 năm 2019 @ 3:30 chiều UTC)
  • Đoạn trích có thể đến từ bất kỳ nơi nào trong câu hỏi, câu trả lời hoặc nội dung nhận xét, cho dù đó là trong một khối mã được định dạng trước hay không.
  • Ghép một đoạn vào giữa một đoạn khác khiến đoạn trích bên ngoài được tính là hai đoạn

Điểm số thấp nhất chiến thắng!


1
@RobinRyder có, đã thay đổi
Beefster

Bài đăng có thể cũ hơn hoặc bằng với thử thách này không, tức là chúng ta có thể sử dụng đoạn trích từ nội dung của thử thách này không?
Jo King

1
"Như vậy, bạn sẽ không thể sử dụng trình phân tích cú pháp regex tích hợp" Điều đó có nghĩa là nó được thiết kế để ngăn chặn việc sử dụng nó cho một ya / nay đơn giản hay chúng ta bị cấm sử dụng regex trong tất cả các câu trả lời của chúng tôi?
user0721090601

@guifa nó được thiết kế sao cho bạn không thể lấy công cụ regex ngôn ngữ của mình và xem liệu nó có biên dịch regex đã cho không. Mọi ngôn ngữ tôi biết đều hỗ trợ một nhóm siêu ký tự lớn hơn và các nhóm bắt chuyên biệt, vì vậy chúng sẽ không khớp chính xác với bộ ký tự này trong mọi trường hợp.
Beefster

1
@ JL2210 Điều đó sẽ làm cho nó thành hai đoạn: một cho đầu và một cho cuối. Bạn có thể sử dụng một đoạn mã miễn là nó vượt qua tất cả các trường hợp kiểm tra và xuất phát từ một câu trả lời / câu hỏi / bài đăng cũ hơn thử thách này
Beefster

Câu trả lời:


6

Perl 6 , 20 đoạn

{$_ eq m/[[<-[()*?|\\]>|\\<[()*?|\\]>|'(' <~~>* ')']<[*?]>?|\|]+/}

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

Các đoạn được lấy từ:

{$_ eq, m/[, <-[, ()*?, |\\, ]>, |\\, <[, ()*?, |\\, ]>, |, '(' <~~>* ')', <[, *?, ]>, ?|, \|, ]+/, }.

Đây chủ yếu là cách tiếp cận tham lam (được thể hiện rõ ràng bởi tất cả một hoặc hai đoạn ký tự). Tôi đã sử dụng SymbolHound để tìm kiếm các ký tự riêng lẻ và tối ưu hóa thực sự duy nhất là '(' <~~>* ')'đoạn trích, được lấy từ câu trả lời của riêng tôi trên các biểu thức Perl 6 đệ quy.

Giải trình:

Điều này về cơ bản kiểm tra xem đầu vào có bằng với một trận đấu tham lam của regex hợp lệ không. Lý do chúng ta không thể chỉ sử dụng chính regex và thêm ^$vào để đánh dấu các kết thúc là vì chúng ta đang sử dụng một regex đệ quy, sẽ không hoạt động nếu có ^$các dấu. Bản thân regex là:

m/[                             ]+/   # Match one or more times
   [              ]  # Any of 
    <-[()*?|\\]> |     # Not a metacharacter
    \\<[()*?|\\]>      # A metacharacter preceded by a \
    '(' <~~>* ')'      # Brackets surrounding a valid regex
                   <[*?]>?  # Optionally followed by a ? or *
                           | \|    # Or just the | metacharacter

TIL ~~, cảm ơn!
user0721090601

@guifa Vâng, tôi đã học được rằng thông qua đặc tả P6 , có rất nhiều điều chưa được ghi lại đúng cách. Tôi nghi ngờ ~~không xuất hiện bởi vì nó chưa được thực hiện đầy đủ (ví dụ <~~0>), mặc dù có những viên ngọc ẩn khác trong đó.
Jo King
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.