Regex Golf: Khu vực của Ý so với Hoa Kỳ


23

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

bản quyền 2013 Randall Munroe

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 chomplà 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 \nhoặc EOFnế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 ItalyUSA.

Để 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: mcó độ 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ả.


Bạn có thể vui lòng giải thích, ý của bạn là "không lọc, không thay thế, không gì cả ... ngay cả khi những điều đó cũng được thực hiện với các biểu thức thông thường." Chỉ cần làm rõ, nó có nghĩa là lọc, thay thế danh sách các trạng thái / khu vực hoặc trọng tâm là rộng hơn?
Abhijit

@ Abhijit chỉnh sửa. Điều đó rõ ràng hơn?
gian hàng


1
"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." quy tắc này bị phá vỡ : nó cho phép một người quay trở lại USAtrong 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 USAnếu không.
o0 '.

1
@boothby tốt, không, đó là logic đơn giản: về cơ bản, nó chỉ yêu cầu một biểu thức chính quy để phù hợp với các khu vực Ý, nhưng không cần phải nói theo một cách phức tạp. Các toàn bộ điểm về bang của Hoa Kỳ là hoàn toàn không liên quan đến câu hỏi thực tế yêu cầu, nhờ vào lỗi này. Điều này cũng làm cho câu hỏi ít thú vị hơn nhiều.
o0 '.

Câu trả lời:


10

Perl - 51 36 byte (đối với regex)

print<>=~/.A|ise|net|te|z.o|[cp]a|[lr]ia|r[cd]/?"Italy
":"USA
"

Không có gì đặc biệt, nhưng cũng có thể đăng nó, bởi vì nó khác với giải pháp 51 byte khác.

Hoặc cách khác, rút ​​ngắn giải pháp đã ngắn của tôi xuống 15 byte. Điều này chiến thắng bây giờ, tôi nghĩ.


7

Perl, 40 ký tự

Tiếp cận điều này từ hướng khác, tức là phù hợp với các tiểu bang Hoa Kỳ:

[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b

Tính năng duy nhất dành riêng cho Perl / PCRE trong regrec là \bneo ranh giới từ, mà tôi đã sử dụng thay cho $neo cuối chuỗi để cho nó khớp với "South Carolina".

Đây là biểu thức chính quy trong một lớp lót Perl để thử nghiệm:

perl -nE 'say /[DNIOWy]|ss|M.n|^A.*a|or|[aguh]i|[sth]\b/ ? "USA" : "Italy"'

Đây là một khai thác thử nghiệm nhiều golf hơn: perl -pe '$ _ = / re /? "USA \ n": "Italy \ n"'
Bút danh

3
@Pseudonymous: meh. Miễn là nó không được tính vào điểm số, cũng có thể giữ cho nó có thể đọc được.
Ilmari Karonen

5

Ruby (regex đơn giản), 44

$_ = gets.chomp
puts /'|-|(([^gn]i|gn|at)a|[hst]e|to|zo)$|To|La|pa/ ? "Italy" : "USA"

Bạn biết gì? Độ nhạy trường hợp là neo bắt đầu từ tốt nhất.

Tôi không chắc chắn, nhưng tôi nghĩ tôi nợ các pađể trả lời Hax0r778 của .


3

Perl - 51

(<STDIN> =~ m/'|-|ru|pu|at|pa|az|gu|mb|rc|ie|rd|ci|os|abr|mol|ven/)?printf("Italy\n"):printf("USA\n");

3

JavaScript 42

alert(/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(prompt())?"Italy":"USA")

Ban đầu tôi sẽ làm việc này từ phía Hoa Kỳ, vì việc loại bỏ KWXY khỏi danh sách Hoa Kỳ khiến nhiều quốc gia xa lánh ... Nhưng Ý đã vượt qua 17 nhân vật tốt nhất ...

Nếu chúng ta đi với ký hiệu mũi tên béo, chúng ta có thể giảm hàm này thành một hàm đơn giản với biến trả về.

r=s=>/at|gn|mp|sc|-|'|((zi?|t)o|[hts]e|[lrd]ia)$/g.test(s)?"Italy":"USA"

> r("South Dakota") // USA
> r("Puglia") // Italy
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.