1.83K subscribers
3.3K photos
132 videos
15 files
3.58K links
Блог со звёздочкой.

Много репостов, немножко программирования.

Небольшое прикольное комьюнити: @decltype_chat_ptr_t
Автор: @insert_reference_here
Download Telegram
Частью решения является разбор строк вида:

bright white bags contain 1 shiny gold bag.
vibrant plum bags contain 5 faded blue bags, 6 dotted black bags.
faded blue bags contain no other bags.

Напишем функцию для разбора одной подобной строки:

fn parse_bags_with_amount(line: &str) -> Option<(&str, Vec<(&str, usize)>)> {
let mut p = Lexer::of(line);
// ...

Повторяющимся элементом каждой строки является подстрока "bags contain". Извлечём то, что находится до этой строки — это и будет цветом сумки, про содержимое которой идёт речь:

    let outer_color = p.before_literal(" bags contain ")?;

А вот теперь возможны варианты. Если далее идёт "no other bags.", то на этом можно разбор заканчивать и возвращать пустой список:

    if p.optional(|p| {
p.literal("no other bags.")?;
p.end()
})
.is_some()
{
return Some((outer_color, Vec::new()));
}

А вот теперь нужно распарсить список значений, разделённых запятыми. К сожалению, я не придумал ничего лучшего, чем сделать безусловный цикл, который на каждой итерации будет парсить очередную порцию, а в конце итерации пытаться парсить запятую и завершать цикл, если это не удалось:

    let mut inner_colors = Vec::new();
loop {
// ...
if p.optional(|p| p.literal(", ")).is_none() {
break;
}
}

Тут бы пригодился цикл с постусловием, которого в Rust, увы, нету :/

Теперь нам нужно извлечь число сумок, их цвет и само слово bag, учтя при это, что оно может быть во множественном числе:

        // ...
let amount = p.number()?;
let inner_color = p.before_literal(" bag")?.trim_start_matches(' ');
p.optional(|p| p.literal("s"));
inner_colors.push((inner_color, amount));
// ...

Строка заканчивается точкой:

    p.literal(".")?;
p.end()?;

Если выполнение дошло до этой точки, значит, парсинг успешен:

Some((outer_color, inner_colors))

Проверим, как оно работает:

fn main() {
let input = "\
bright white bags contain 1 shiny gold bag.
vibrant plum bags contain 5 faded blue bags, 6 dotted black bags.
faded blue bags contain no other bags.";
let parsed = input
.lines()
.map(parse_bags_with_amount)
.map(Option::unwrap)
.collect::<Vec<_>>();
assert_eq!(
parsed,
[
("bright white", vec![("shiny gold", 1)]),
("vibrant plum", vec![("faded blue", 5), ("dotted black", 6)]),
("faded blue", vec![]),
],
);
}

Работает! Как всегда, весь код в гисте. Как вы могли заметить, техника не самая изящная, но вместе с тем она достаточно простая, чтобы её при случае, когда требуется быстро написать парсер, его можно было бы написать руками вот прямо сейчас — как я, собственно, тогда и сделал.

UPD (16/10/2022): добавил метод для парсинга числа со знаком
The internet is for porn cats, так что держите котика
Которепости і підписюни (2)
Уведомление по почте в час ночи: "Ваш MR [который уже пару месяцев пилится и совсем недавно пришёл в состояние, пригодное для аппрува] теперь нельзя смержить из-за конфликтов".

Кто, блин, пушает код в рабочую репу в такое время?

#трудовыебудни
Forwarded from This Software Dev Does(n’t)? Exist
Фраза дня (не с работы): А/Б тестирование уровня Аушвиц/Бухенвальд

#shitposting
Ливкодинг - это вроде виджеинга, только картинка создаётся кодом. Программа пишется прямо по ходу выступления и исходник виден на экране.

Вчера впервые поливкодил на местном рейве. Думал меня хватит на полтора часа, но продержался часов шесть, пока не посветлело. Беруши помогли :-)

Забавно, что никто не отличает замысел от багов. Можно писать, что попало. А все думают, что так и было задумано. Лишь бы не черный экран.
Forwarded from Cosy Code
Посылку в сортировочном центре сортировали-сортировали, да не высортировали
Наконец-то смержили мой MR, который висел уже два месяца. И он даже попадёт в ближайший релиз.

#трудовыебудни
Я часто ругаюсь с людьми, причём делаю больно не преднамеренно. Совсем недавно я сделал это ещё раз. Более того, я подвёл человека, который от меня зависит. И уделяю мало внимания тем, кто в моём внимании нуждается.

Я делаю недостаточно. На работе я большую часть времени пинаю балду, вне работы тоже. Мои каналы простаивают без авторского контента. Своим родственникам я помогаю (в той или иной мере) мало и неохотно. По дому от меня помощи не дождаться.

Я не занимаюсь собой. Список "на почитать" лишь растёт, но почти не убывает. Своим телом я тоже не занимаюсь, не смотря на весомые стимулы. Не занимаюсь физической нагрузкой и забиваю на медицинский уход.

Я ничтожен. Все мои постоянные обязанности мелочны и не обременительны. Мир постоянно напоминает мне о том, какой я не взрослый и не самостоятельный, причём романтических отношений это тоже касается. Самое страшное, что меня это в какой-то мере устраивает.

Хочется просто ничего не делать и оставаться лежать в кровати, прижимая к себе плюшевую акулу — единственное существо, которое я могу себе позволить обнять.
#article

О том, какой вред для разработчиков несут игроки с токсичным поведением, и о мерах борьбы с ними, которые работают

media-xyz.com/ru/articles/1098-otkuda-berutsia-toksichnye-igroki-i-kak-s-nim
This media is not supported in your browser
VIEW IN TELEGRAM