Tạo một đa âm regex


19

Viết một regex hoạt động trong ít nhất 2 hương vị regex (hoặc phiên bản) và khớp với một chuỗi khác nhau trong mỗi hương vị (hoặc phiên bản) mà nó đang chạy.

Các chuỗi được khớp trong thử thách này là những từ đầu tiên của tên mã Ubuntu, được liệt kê bên dưới. Regex của bạn phải phù hợp từ đầu danh sách. Nghĩa là, nếu công trình regex của bạn trong 3 hương vị, nó phải phù hợp Warty HoaryBreezy, và không phải người khác.

Warty
Hoary
Breezy
Dapper
Edgy
Feisty
Gutsy
Hardy
Intrepid
Jaunty
Karmic
Lucid
Maverick
Natty
Oneiric
Precise
Quantal
Raring
Saucy
Trusty
Utopic
Vivid
Wily
Xenial
Yakkety
Zesty
17.10
18.04
18.10
19.04
19.10
...

Nếu regex của bạn hoạt động với hơn 26 hương vị, bạn có thể khớp với số phiên bản Ubuntu thay thế. Bắt đầu từ 17.10, đối với mỗi hương vị mới, thay đổi số thứ hai thành 10 nếu là 04 và tăng số thứ nhất và thay đổi số thứ hai thành 04 nếu không.

Trong mỗi hương vị, regex của bạn chỉ nên khớp với chuỗi được cho là và không có gì khác (không giới hạn ở tên mã). Trailing newlines không quan trọng. Điều đó có nghĩa là regex của bạn chỉ có thể khớp với chuỗi mà không có dòng mới, chỉ khớp chuỗi với dòng mới theo dõi hoặc khớp với cả hai. Và nó không phải nhất quán trong các hương vị khác nhau. Bạn có thể giả sử đầu vào là ASCII có thể in được (ngoại trừ dòng mới, nếu có).

Điểm của bạn là (độ dài mã của bạn + 10) / ((số lượng hương vị) ^ 2). Điểm số thấp nhất chiến thắng.


1
Chỉ cần kiểm tra - bởi "Trong mỗi hương vị, regex của bạn chỉ nên khớp với chuỗi được cho là và không có gì khác.", Điều này có nghĩa là mỗi regex chỉ nên khớp với một tên phiên bản Ubuntu và không có tên nào khác nhưng có thể khớp với các phiên bản không phải phiên bản khác chuỗi tên, hoặc có nghĩa là regex chỉ có thể khớp với chuỗi chính xác đó và không có chuỗi nào khác, ngay cả khi đó không phải là tên phiên bản trong danh sách trên?
Sp3000

@ Sp3000 Nó phải khớp với chuỗi chính xác đó và không có chuỗi nào khác.
jimmy23013

Câu trả lời:


24

87 byte, 5 hương vị, (87 + 10) / 25 = 3,88

^(((?=W)[[:word:]&&]art|Ho(?=a)\ar|Bre(?=ez)[]e]\z|E(?=dg)[[d]]g)y|(?=Da)[D-[E]]apper)$

Tôi đã đi với các hương vị dễ dàng để thử nghiệm bây giờ, đó là:

Cấu trúc chung là ^((...)y|...)$, ví dụ bao thanh toán ys và thêm neo.

Chiến tranh (PCRE)

(?=W)[[:word:]&&]art

Trong PCRE và Ruby, [[:word:]]là một lớp ký tự POSIX khớp với một ký tự từ - trong các hương vị khác, bạn nhận được một [[:word:]lớp ký tự sau đó theo nghĩa đen &&], điều đó không (?=W)khẳng định. Để làm cho Ruby thất bại, &&được sử dụng để giao cắt lớp POSIX không có gì, trong khi trong PCRE &&không có ý nghĩa đặc biệt.

Hoary (Javascript)

Ho(?=a)\ar

Vì bất kỳ lý do gì, Javascript là hương vị duy nhất trong số đó \alà nghĩa đen a- trong các hương vị khác, nó phù hợp với ký tự chuông (ASCII 7).

Breezy (Python)

Bre(?=ez)[]e]\z

Trong Python và Javascript, \zlà một nghĩa đen z- trong các hương vị khác, nó tương đương với phần $cuối của chuỗi neo. Để làm cho Javascript thất bại, chúng tôi sử dụng lớp char []e], đó là một lớp char trống, []sau đó là chữ e]trong Javascript và lớp hai char []e]trong Python.

Dapper (.NET)

(?=Da)[D-[E]]apper

Trong .NET, [D-[E]]là một sự khác biệt thiết lập, loại bỏ các thiết lập [E]từ [D]. Trong PCRE, Javascript và Python, chúng ta có lớp [D-[E]sau đó là một chữ ]. Ruby có một chút khác biệt, nhưng vì một số lý do, nó phân tích thành một lớp [D-[E]]chỉ khớp Evà tôi vẫn chưa hiểu tại sao ...

Sắc sảo (Ruby)

E(?=dg)[[d]]g

Ruby cho phép các lớp char bên trong các lớp char, vì vậy [[d]]thực sự tương đương với [d], hoặc chỉ d. Trong các hương vị khác, chúng ta có [[d]một nghĩa đen ].

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.