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

Дано строка 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

February 2026

S M T W T F S
123456 7
8910111213 14
15161718192021
22232425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 25th, 2026 09:01 am
Powered by Dreamwidth Studios