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 = 2
hoặc n = 3
vì 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 là 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 = 3
nó là 8 byte và cho n = 2
nó 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 = 3
làm ..?.?
. Tuy nhiên lưu ý rằng nó giảm xuống còn 6 byte n = 2
vì bây giờ chúng ta chỉ cần ..?
. Cũng lưu ý rằng M
có 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 M
nế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
có &
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}