Tôi muốn thử một loại thử thách golf regex mới, yêu cầu bạn giải quyết các nhiệm vụ tính toán không cần thiết mà không có gì ngoài sự thay thế regex. Để làm cho điều này trở nên khả thi hơn và ít việc vặt hơn, bạn sẽ được phép áp dụng một số thay thế, lần lượt từng cái một.
Các thách thức
Chúng ta sẽ bắt đầu đơn giản: đưa ra một chuỗi chứa hai số nguyên dương, dưới dạng các số thập phân cách nhau bởi a ,
, tạo ra một chuỗi chứa tổng của chúng, cũng như một số thập phân. Vì vậy, rất đơn giản
47,987
nên biến thành
1034
Câu trả lời của bạn nên làm việc cho các số nguyên dương tùy ý.
Định dạng
Mỗi câu trả lời phải là một chuỗi các bước thay thế, mỗi bước bao gồm một biểu thức chính quy và chuỗi thay thế. Tùy chọn, đối với mỗi bước trong chuỗi, bạn có thể chọn lặp lại thay thế cho đến khi chuỗi ngừng thay đổi. Dưới đây là một ví dụ đệ trình ( không giải quyết được vấn đề trên):
Regex Modifiers Replacement Repeat?
\b(\d) g |$1 No
|\d <none> 1| Yes
\D g <empty> No
Với đầu vào 123,456
, đệ trình này sẽ xử lý đầu vào như sau: thay thế đầu tiên được áp dụng một lần và mang lại:
|123,|456
Bây giờ thay thế thứ hai được áp dụng trong một vòng lặp cho đến khi chuỗi ngừng thay đổi:
1|23,|456
11|3,|456
111|,|456
111|,1|56
111|,11|6
111|,111|
Và cuối cùng, sự thay thế thứ ba được áp dụng một lần:
111111
Lưu ý rằng tiêu chí chấm dứt cho các vòng lặp là liệu chuỗi có thay đổi hay không, liệu regex có tìm thấy kết quả khớp hay không. (Nghĩa là, nó cũng có thể chấm dứt nếu bạn tìm thấy một trận đấu nhưng sự thay thế giống hệt với trận đấu.)
Chấm điểm
Điểm chính của bạn sẽ là số bước thay thế trong bài nộp của bạn. Mỗi lần thay thế lặp đi lặp lại sẽ được tính trong 10 bước. Vì vậy, ví dụ trên sẽ ghi điểm 1 + 10 + 1 = 12
.
Trong trường hợp (không quá khó xảy ra) của một chiếc cà vạt, điểm phụ là tổng của kích thước của tất cả các bước. Đối với mỗi bước thêm regex ( không có dấu phân cách), bộ sửa đổi và chuỗi thay thế. Đối với ví dụ trên đây sẽ là (6 + 1 + 3) + (3 + 0 + 2) + (2 + 1 + 0) = 18
.
Quy tắc linh tinh
Bạn có thể sử dụng bất kỳ hương vị regex nào (mà bạn nên chỉ ra), nhưng tất cả các bước phải sử dụng cùng một hương vị. Hơn nữa, bạn không được sử dụng bất kỳ tính năng nào của ngôn ngữ máy chủ của flavour, như các cuộc gọi lại thay thế hoặc công cụ e
sửa đổi của Perl , để đánh giá mã Perl. Tất cả các thao tác phải xảy ra độc quyền thông qua thay thế regex.
Lưu ý rằng nó phụ thuộc vào hương vị và công cụ sửa đổi của bạn cho dù mỗi lần thay thế duy nhất thay thế tất cả các lần xuất hiện hay chỉ một lần duy nhất. Ví dụ: nếu bạn chọn hương vị ECMAScript, một bước duy nhất theo mặc định sẽ chỉ thay thế một lần xuất hiện, trừ khi bạn sử dụng công cụ g
sửa đổi. Mặt khác, nếu bạn đang sử dụng hương vị .NET, mỗi bước sẽ luôn thay thế tất cả các lần xuất hiện.
Đối với các ngôn ngữ có các phương thức thay thế khác nhau để thay thế một lần và toàn cầu (ví dụ: Ruby sub
so với gsub
), giả sử rằng thay thế duy nhất là mặc định và coi thay thế toàn cầu như một công cụ g
sửa đổi.
Kiểm tra
Nếu hương vị bạn chọn là .NET hoặc ECMAScript, bạn có thể sử dụng Retina để kiểm tra trình của mình (Tôi được cho biết, nó cũng hoạt động trên Mono). Đối với các hương vị khác, có lẽ bạn sẽ phải viết một chương trình nhỏ bằng ngôn ngữ máy chủ áp dụng các thay thế theo thứ tự. Nếu bạn làm như vậy, xin vui lòng bao gồm chương trình kiểm tra này trong câu trả lời của bạn.