172 похожих чатов

Здравствуйте. Мне нужно вычислять длину строки в const контексте. Желательно делать

это как можно быстрее (насколько это возможно в const контексте).

Поревьювьте, пожалуйста, мой код: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=8f4f5f7e772e8113e937218955a0d03b

const fn length(string: &str) -> usize {
const PAT_1: u8 = 0b10000000;
const PAT_3: u8 = 0b11100000;
const PAT_4: u8 = 0b11110000;

let bytes = string.as_bytes();
let mut index = 0;
let mut length = 0;

while index < bytes.len() {
length += 1;

let first = bytes[index];

if first & PAT_1 == 0 {
index += 1;
continue;
}

let prefix = first & PAT_4;

match prefix {
PAT_4 => index += 4,
PAT_3 => index += 3,
_ => index += 2,
}
}

length
}

13 ответов

2 просмотра

Код не весь юникод поддерживает, а так ок.

Ilya-Lakhin Автор вопроса
Ilya Lakhin
Что из юникода не поддерживает?

эмодзи клоуна например 🤡

Ilya-Lakhin Автор вопроса
Ilya Lakhin
println!("{}", length("🤡🤡🤡")); выдал 3.

А 👍👍🏻👍🏼👍🏽👍🏾👍🏿?

Le Chat
А 👍👍🏻👍🏼👍🏽👍🏾👍🏿?

Вангую, они составные палец + цвет

Ilya-Lakhin Автор вопроса
Le Chat
А 👍👍🏻👍🏼👍🏽👍🏾👍🏿?

Не сработало. Но браузер, правда, тоже не справился. Там графемы?

Ilya Lakhin
Не сработало. Но браузер, правда, тоже не справилс...

Да я на шару предложил, но в винде и телеге не всегда 1 в 1 эмодзи матчатся, но это, насколько помню, пол + профессия, но в это редкие кейсы, кажется, я б забил

Ilya-Lakhin Автор вопроса
Ilya Lakhin
Не сработало. Но браузер, правда, тоже не справилс...

> Но браузер, правда, тоже не справился Кстати, InteliJ Idea справился с прорисовкой пальцев. )

fn length_recursive(bytes: &[u8], index: usize, length: usize) -> usize { if index >= bytes.len() { return length; } const PAT_1: u8 = 0b10000000; const PAT_3: u8 = 0b11100000; const PAT_4: u8 = 0b11110000; let first = bytes[index]; let mut next_index = index; if first & PAT_1 == 0 { next_index += 1; } else { let prefix = first & PAT_4; match prefix { PAT_4 => next_index += 4, PAT_3 => next_index += 3, _ => next_index += 2, } } length_recursive(bytes, next_index, length + 1) } fn length(string: &str) -> usize { length_recursive(string.as_bytes(), 0, 0) } Такое решение может работать?

ARMA
fn length_recursive(bytes: &[u8], index: usize, le...

Можно за один рекурсивный вызов попробовать считать по несколько символов длинны, должно быть довольно быстро

Ilya-Lakhin Автор вопроса
ARMA
fn length_recursive(bytes: &[u8], index: usize, le...

А почему рекурсия будет лучше?

Похожие вопросы

Обсуждают сегодня

я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
в сях есть множество как в питоне? для удаление дубликатов
Linus
25
читать файл максимально быстро? странный вопрос))
zamtmn
53
How to create an OS in C? what to study?
Linus
18
тоесть, указав return eax, сгенерируется никому ненужная инструкция mov eax,eax ?
Aiwan \ (•◡•) / _bot
24
а как бы вылезти из ИО, что то типа IO -> Ether или в какую сторону смотреть ? что то туплю
Fedor
9
Всем доброго вечера! Хочу поделиться своим злоключением с человеком, который, как оказалось сюда тоже скидывал свое резюме. Жаль, что я вашу группу не нашел раньше… человек ки...
Роман Ахмедзянов
4
а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Компания Elif ищет менеджера проектов, который будет заниматься поиском и ведением новых проектов. Прежде чем приступить к работе, вам нужно пройти наш недельный курс, где вы ...
Elif
5
Привет, кто может сделать юзербота с апи? Задачи: - создавать группы - создавать каналы - задавать для созданных каналов аватарку или эмоджи, имя группы - добавлять в группы...
Lencore
11
Карта сайта