Feb. 2nd, 2023

amarao: (Default)
Я тут решал какую-то задачу на литкоде, и одна из подзадач была:

Дано строка str1 и строка str2. Надо проверить, что строка str2 состоит из повторов строки str1. По решению большей задачи размер str2 гарантировано является кратным размеру str1, то есть нужно просто проверить, что str1 снова и снова повторяется в str2.

str1 и str2 - это [u8].

Два решения:

Похожий на сишный вариант с двойным циклом

str2.iter().enumerate().all(|(i, &b1)| b1 == str1[i % str2.len()]

Мой вариант:

str2.iter().eq(str1.iter().cycle().take(str2.len()))


В целом, дело не в экономии байт, а в логике: первое делает какую-то низкоуровневую циклическую арифметику с неиллюзорным шансом словить панику на out of bound access, а второе конструирует инвариант: мы сравниваем итераторы по str2 и по циклическому повторению str1 с размером, равным длине str2.

В целом, нам бы мог помочь Iterator.array_chunks, но он не стабильный пока что (то есть его ещё нет в стабильном rust'е).

Profile

amarao: (Default)
amarao

May 2026

S M T W T F S
     12
3 4 567 89
101112 13141516
17181920 2122 23
242526 27282930
31      

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 27th, 2026 06:00 pm
Powered by Dreamwidth Studios