Lời khuyên cho việc chơi golf ở Retina


10

Bạn có lời khuyên chung nào cho việc chơi golf ở Retina ? Tôi đang tìm kiếm những ý tưởng có thể được áp dụng cho các vấn đề về golf nói chung ít nhất là cụ thể đối với Retina (ví dụ: "xóa bình luận" không phải là một câu trả lời). Xin vui lòng gửi một lời khuyên cho mỗi câu trả lời.

Để tham khảo, trình biên dịch trực tuyến ở đây .

@ Sp3000 chỉ ra đó cũng là Mẹo cho Regex Golf . Câu trả lời ở đây nên tập trung cụ thể vào các tính năng của Retina chứ không phải vào các mẹo chơi gôn regex chung.



Hmmm, tôi đã ngừng đăng bài này vì Retina vẫn còn nhiều trong quá trình phát triển và tôi sợ hầu hết các câu trả lời cuối cùng sẽ là những mẹo chơi golf regex đơn giản, không cụ thể lắm với Retina. Nhưng chúng tôi cũng có thể cho nó đi, tôi đoán ... :)
Martin Ender

@ MartinBüttner Bạn và một số người khác đã cho tôi rất nhiều lời khuyên và gợi ý hay từ khi tôi bắt đầu nhìn vào Retina, vì vậy tôi nghĩ có lẽ đã đến lúc cho việc này. Tôi đã thêm một giải thích rằng các mẹo regex chung nên đi đến câu hỏi được liên kết.
Chấn thương kỹ thuật số

1
@ MartinBüttner Đây là một nơi tốt để hỏi - Tôi đã tự hỏi một thời gian - vì tò mò cảm hứng cho cái tên "Retina" là gì? Tôi giả sử phần "Re" là dành cho Biểu thức chính quy, nhưng còn phần "tina" thì sao?
Chấn thương kỹ thuật số

3
@DigitalTrauma Tôi đã cố gắng đưa ra một từ hay có thể hoạt động như một từ viết tắt, nhưng không thành công. Từ "võng mạc" khá gần với một số lần thử và tôi thích từ này. Tôi chưa bao giờ quản lý để viết lại nó thành một từ viết tắt và kể từ đó đã từ bỏ nó. Vì vậy, vâng "re" là loại "biểu thức chính quy" và có thể là "n" cho ".NET", nhưng cuối cùng nó chỉ là một từ nghe có vẻ hay.
Martin Ender

Câu trả lời:


3

Kết hợp các vòng lặp nếu có thể

Trong các tính toán không tầm thường, bạn sẽ thường thấy mình sử dụng một số vòng lặp để xử lý dữ liệu:

+`stage1
+`stage2
+`stage3

Vì vậy, điều này chạy stage1cho đến khi đầu ra hội tụ, sau đó stage2cho đến khi đầu ra hội tụ và sau đó stage3cho đến khi đầu ra hội tụ.

Tuy nhiên, nó luôn luôn đáng để kiểm tra các giai đoạn một cách chi tiết. Đôi khi, có thể chạy vòng lặp theo kiểu xen kẽ stage1, stage2, stage3, stage1, stage2, stage3, ...thay vào đó (điều này phụ thuộc rất nhiều vào những gì các giai đoạn thực sự làm, nhưng đôi khi chúng thực hiện thay đổi hoàn toàn trực giao hoặc hoạt động tốt như một đường ống). Trong trường hợp này, bạn có thể lưu byte bằng cách gói chúng trong một vòng lặp duy nhất:

{`stage1
stage2
}`stage3

Nếu stage1là giai đoạn đầu tiên hoặc stage3là giai đoạn cuối cùng của chương trình, thì bạn thậm chí có thể bỏ qua các dấu ngoặc đơn đó (điều này có nghĩa là điều này đã có thể lưu byte cho một vòng lặp gồm hai giai đoạn).

Một sử dụng gần đây của kỹ thuật này có thể được nhìn thấy trong câu trả lời này .


2

Chia chuỗi thành các đoạn có độ dài bằng nhau n

Như trong hầu hết các ngôn ngữ "bình thường" TMTOWTDI (có nhiều hơn một cách để làm điều đó). Tôi giả sử ở đây rằng đầu vào không chứa nguồn cấp dữ liệu và "tách" có nghĩa là chia nó thành các dòng. Nhưng có hai mục tiêu khá khác nhau: nếu độ dài của chuỗi không phải là bội số của độ dài đoạn, bạn có muốn giữ đoạn mã không hoàn chỉnh hay bạn muốn loại bỏ nó?

Giữ một đoạn cuối không hoàn chỉnh

Nói chung, có ba cách để chia tách về Retina. Tôi đang trình bày cả ba cách tiếp cận ở đây, bởi vì chúng có thể tạo ra sự khác biệt lớn hơn khi bạn cố gắng thích ứng chúng với một vấn đề liên quan. Bạn có thể sử dụng thay thế và nối thêm nguồn cấp cho mỗi trận đấu:

.{n}
$&¶

Đó là 8 byte (hoặc ít hơn một chút nếu n = 2hoặc n = 3vì sau đó bạn có thể sử dụng ..hoặc ...tương ứng). Tuy nhiên, điều này có một vấn đề: nó nối thêm một nguồn cấp dữ liệu bổ sung nếu độ dài chuỗi bội số của độ dài khối.

Bạn cũng có thể sử dụng một giai đoạn phân tách và sử dụng thực tế là các ảnh chụp được giữ lại trong phần tách:

S_`(.{n})

Các _tùy chọn loại bỏ các dòng trống mà nếu không sẽ cho kết quả từ bao gồm toàn bộ chuỗi với trận đấu. Đây là 9 byte, nhưng nó không thêm một nguồn cấp dữ liệu. Đối với n = 3nó là 8 byte và cho n = 2nó là 7 byte. Lưu ý rằng bạn có thể lưu một byte tổng thể nếu các dòng trống không thành vấn đề (ví dụ: vì bạn sẽ chỉ xử lý các dòng không trống và loại bỏ các nguồn cấp dữ liệu sau này): sau đó bạn có thể xóa _.

Tùy chọn thứ ba là sử dụng một trận đấu. Với !tùy chọn chúng ta có thể in tất cả các trận đấu. Tuy nhiên, để bao gồm phần đuôi, chúng ta cần cho phép độ dài khớp thay đổi:

M!`.{1,n}

Đây cũng là 9 byte và cũng sẽ không bao gồm một dòng cấp dữ liệu. Điều này cũng trở thành 8 byte để n = 3làm ..?.?. Tuy nhiên lưu ý rằng nó giảm xuống còn 6 byte n = 2vì bây giờ chúng ta chỉ cần ..?. Cũng lưu ý rằng Mcó thể bỏ đi nếu đây là giai đoạn cuối cùng trong chương trình của bạn, lưu một byte trong mọi trường hợp.

Loại bỏ một đoạn cuối không hoàn chỉnh

Điều này sẽ thực sự dài nếu bạn cố gắng thực hiện nó với một sự thay thế, bởi vì bạn cần thay thế đoạn đường mòn không có gì (nếu nó tồn tại) và cũng bằng một sự phân chia. Vì vậy, chúng ta có thể bỏ qua những người một cách an toàn. Thật thú vị, đối với cách tiếp cận trận đấu thì ngược lại: nó ngắn hơn:

M!`.{n}

Đó là 7 byte, hoặc ít hơn cho n = 2, n = 3. Một lần nữa, lưu ý rằng bạn có thể bỏ qua Mnếu đây là giai đoạn cuối cùng trong mã.

Nếu bạn muốn có một linefeed trailing ở đây, bạn có thể lấy nó bằng cách nối |$vào regex.

Phần thưởng: khối chồng chéo

Hãy nhớ rằng M&tùy chọn trả về các kết quả trùng lặp (điều này thường không thể thực hiện được với regex). Điều này cho phép bạn có được tất cả các đoạn chồng chéo (chuỗi con) của một chuỗi có độ dài nhất định:

M!&`.{n}

Có phải bằng cách nào đó có thể chia một chuỗi chính xác trong một nửa với độ dài thay đổi? Vì vậy, 123456trở thành 123\n4561234567890trở thành 12345\n67890?
Kevin Cruijssen

1
@KevinCruijssen Tôi không nghĩ rằng tôi đã thêm bất kỳ tính năng cụ thể nào cho việc đó. Có thể bạn sẽ phải sử dụng các nhóm cân bằng: tio.run/##K0otycxLNPyvquGe8D/YIEHD3sZWQ09TW1PD3hbI1jW0A3JUNP//... Nếu bạn không nhớ một linefeed trailing, bạn có thể bỏ qua ?=.
Martin Ender

Tôi đã có thể hoàn thành thử thách mà tôi nghĩ tôi cần nó khác đi, nhưng các nhóm cân bằng thực sự rất hữu ích! Tôi biết nó phải là thứ gì đó dọc theo những dòng đó, nhưng kỹ năng regex / Retina của tôi gần như không đủ tốt. Cảm ơn đã trả lời! :)
Kevin Cruijssen
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.