Có một số phần tử chẵn trong đầu vào của bạn:
say elems <1 1 0 2 0 2 1 2 2 2 4 4 3 3>; # 14
grep
Khối của bạn tiêu thụ hai yếu tố mỗi lần:
{$^a eq $^b}
Vì vậy, nếu bạn thêm hoặc xóa một phần tử, bạn sẽ gặp phải lỗi khi khối được chạy trên phần tử còn lại ở cuối.
Có nhiều cách để giải quyết vấn đề của bạn.
Nhưng bạn cũng đã hỏi về tùy chọn cho phép chồng lấp, vì vậy, ví dụ, bạn nhận được hai (2 2)
danh sách phụ khi 2 2 2
gặp phải chuỗi . Và, trong một tĩnh mạch tương tự, có lẽ bạn muốn xem hai trận đấu, không phải bằng 0, với đầu vào như:
<1 2 2 3 3 4>
Vì vậy, tôi cũng sẽ tập trung vào các giải pháp giải quyết những vấn đề đó.
Mặc dù thu hẹp không gian giải pháp để giải quyết các vấn đề bổ sung, vẫn có nhiều cách để thể hiện giải pháp theo chức năng.
Một cách chỉ thêm một chút mã vào cuối của bạn:
my @s = <1 1 0 2 0 2 1 2 2 2 4 4 3 3>;
say grep {$^a eq $^b}, @s .rotor( 2 => -1 ) .flat
Các .rotor
phương pháp chuyển đổi một danh sách vào một danh sách các tiểu danh sách, mỗi chiều dài tương tự. Ví dụ, say <1 2 3 4> .rotor: 2
hiển thị ((1 2) (3 4))
. Nếu đối số độ dài là một cặp, thì khóa là độ dài và giá trị là phần bù để bắt đầu cặp tiếp theo. Nếu phần bù là âm, bạn sẽ có danh sách phụ trùng lặp. Do đó say <1 2 3 4> .rotor: 2 => -1
hiển thị ((1 2) (2 3) (3 4))
.
Các .flat
phương pháp "flattens" invocant của nó. Ví dụ, say ((1,2),(2,3),(3,4)) .flat
hiển thị (1 2 2 3 3 4)
.
Một cách có lẽ dễ đọc hơn để viết giải pháp trên sẽ là bỏ qua flat
và sử dụng .[0]
và .[1]
lập chỉ mục vào các danh sách phụ được trả về bởi rotor
:
say @s .rotor( 2 => -1 ) .grep: { .[0] eq .[1] }
Xem thêm bình luận của Elizabeth Mattijsen cho một biến thể khác khái quát cho mọi kích thước danh sách phụ.
Nếu bạn cần một mẫu mã hóa tổng quát hơn, bạn có thể viết một cái gì đó như:
say @s .pairs .map: { .value xx 2 if .key < @s - 1 and [eq] @s[.key,.key+1] }
Các .pairs
phương pháp trên một danh sách trả về một danh sách các cặp, mỗi cặp tương ứng với mỗi người trong số các yếu tố trong danh sách invocant của nó. Các .key
của mỗi cặp là chỉ số của phần tử trong danh sách invocant; những .value
là giá trị của nguyên tố này.
.value xx 2
có thể đã được viết .value, .value
. (Xem xx
.)
@s - 1
là số phần tử trong @s
âm 1.
Các [eq]
trong [eq] list
là một giảm .
Nếu bạn cần khớp mẫu văn bản để quyết định yếu tố nào tạo thành các phần tử bằng nhau liền kề, bạn có thể chuyển đổi danh sách đầu vào thành chuỗi, khớp với đó bằng một trong các trạng từ khớp tạo ra danh sách khớp, sau đó ánh xạ từ danh sách kết quả khớp với mong muốn của bạn kết quả. Để khớp với các lớp phủ (ví dụ: 2 2 2
kết quả được ((2 2) (2 2))
sử dụng :ov
:
say @s .Str .match( / (.) ' ' $0 /, :ov ) .map: { .[0].Str xx 2 }
2 2 2 2
nó sẽ in 3(2 2)
giây như mong đợi. Chưa bao giờ nghe về phương pháprotor
ban đầu tôi đã đưa rasquish
phương pháp và kiểm tra xem nó có các tính năng hoặc đối số như thế nào không@s.squish(:length 2, :multiple_instances yes)
nhưng nó không có các tính năng như vậy và nó không phù hợp với nhiệm vụ. So vớisquish
,rotor
có vẻ khá phù hợp. Trên thực tế, nó thậm chí có thể là mạnh nhất cho loại hình hoạt động này.