Chúng tôi đã có một vấn đề meta-regex-golf như được lấy cảm hứng từ truyện tranh xkcd
Nhưng, sân golf regex này trông cũng rất vui! Tôi muốn phân biệt giữa các tiểu bang của Hoa Kỳ và các khu vực của Ý. Tại sao? Tôi là công dân của cả hai quốc gia và tôi luôn gặp rắc rối với việc này * .
Các vùng của Ý là
Abruzzo, Valle d'Aosta, Puglia, Basilicata, Calabria, Campania, Emilia-Romagna, Friuli-Venezia Giulia, Lazio, Liguria, Lombardia, Marche, Molise, Piemonte, Sardegna, Sicilia, Trentino-Alto Adige/Südtirol, Toscana, Umbria, Veneto
và các tiểu bang của Hoa Kỳ là
Alabama, Alaska, Arizona, Arkansas, California, Colorado, Connecticut, Delaware, Florida, Georgia, Hawaii, Idaho, Illinois, Indiana, Iowa, Kansas, Kentucky, Louisiana, Maine, Maryland, Massachusetts, Michigan, Minnesota, Mississippi, Missouri, Montana, Nebraska, Nevada, New Hampshire, New Jersey, New Mexico, New York, North Carolina, North Dakota, Ohio, Oklahoma, Oregon, Pennsylvania, Rhode Island, South Carolina, South Dakota, Tennessee, Texas, Utah, Vermont, Virginia, Washington, West Virginia, Wisconsin, Wyoming
Công việc của bạn là viết một chương trình phân biệt các danh sách này với một biểu thức chính quy. Đây là một trò chơi mới, vì vậy đây là
Quy tắc
- Việc phân biệt giữa các danh sách phải được thực hiện với một biểu thức chính quy phù hợp.
- Điểm của bạn là độ dài của biểu thức chính quy đó, nhỏ hơn là tốt hơn.
Để rõ ràng: tất cả các công việc phải được thực hiện bằng biểu thức chính quy - không lọc, không thay thế, không có gì ... ngay cả khi những công việc đó cũng được thực hiện với các biểu thức thông thường. Nghĩa là, đầu vào phải được chuyển trực tiếp vào một biểu thức chính quy và chỉ có thể sử dụng câu trả lời nhị phân (khớp / không khớp) cho các phần sau của mã. Đầu vào không bao giờ được kiểm tra hoặc thay đổi bởi bất cứ điều gì ngoại trừ biểu thức khớp. Ngoại lệ : ăn một dòng mới với thứ gì đó giống với Ruby chomp
là tốt.
Chương trình của bạn nên có một mục duy nhất (tùy chọn theo sau \n
hoặc EOF
nếu nó làm cho mọi thứ dễ dàng hơn) từ danh sách từ stdin và in ra để xuất bản tên của danh sách đó. Trong trường hợp này, danh sách của chúng tôi được đặt tên Italy
và USA
.
Để kiểm tra mã của bạn, chỉ cần chạy cả hai danh sách thông qua nó. Hành vi có thể không được xác định cho các chuỗi không xảy ra trong danh sách.
Vấn đề chấm điểm
Điều này có thể phải được thực hiện trên cơ sở ngôn ngữ. Ở Perl,
m/foobarbaz/
là một biểu thức chính quy phù hợp. Tuy nhiên, trong Python,
import re
re.compile('foobarbaz')
làm điều tương tự Chúng tôi sẽ không đếm các trích dẫn cho Python, vì vậy tôi nói chúng tôi không đếm m/
và cuối cùng /
trong Perl. Trong cả hai ngôn ngữ, ở trên sẽ nhận được điểm 9.
Để làm rõ một điểm được nêu ra bởi Abhijit , độ dài thực tế của biểu thức khớp là điểm số, ngay cả khi bạn tạo nó một cách linh hoạt. Ví dụ, nếu bạn tìm thấy một biểu thức ma thuật m
,
n="foo(bar|baz)"
m=n+n
sau đó bạn không nên báo cáo điểm 12: m
có độ dài 24. Và để rõ ràng hơn, biểu thức chính quy được tạo không thể phụ thuộc vào đầu vào. Đó sẽ là đọc đầu vào trước khi chuyển nó vào biểu thức chính quy.
Ví dụ phiên
input> Calabria
Italy
input> New Hampshire
USA
input> Washington
USA
input> Puglia
Italy
* Thật ra, đó là một lời nói dối. Tôi chưa bao giờ có bất kỳ rắc rối với điều này cả.
USA
trong trường hợp chuỗi đó, do đó bạn chỉ cần kiểm tra các vùng của Ý và quay lại USA
nếu không.