Частью решения является разбор строк вида:
Теперь нам нужно извлечь число сумок, их цвет и само слово
UPD (16/10/2022): добавил метод для парсинга числа со знаком
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)>)> {Повторяющимся элементом каждой строки является подстрока "bags contain". Извлечём то, что находится до этой строки — это и будет цветом сумки, про содержимое которой идёт речь:
let mut p = Lexer::of(line);
// ...
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();Тут бы пригодился цикл с постусловием, которого в Rust, увы, нету :/
loop {
// ...
if p.optional(|p| p.literal(", ")).is_none() {
break;
}
}
Теперь нам нужно извлечь число сумок, их цвет и само слово
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): добавил метод для парсинга числа со знаком
Gist
Crude parsing
Crude parsing. GitHub Gist: instantly share code, notes, and snippets.
Уведомление по почте в час ночи: "Ваш MR [который уже пару месяцев пилится и совсем недавно пришёл в состояние, пригодное для аппрува] теперь нельзя смержить из-за конфликтов".
Кто, блин, пушает код в рабочую репу в такое время?
#трудовыебудни
Кто, блин, пушает код в рабочую репу в такое время?
#трудовыебудни
Forwarded from This Software Dev Does(n’t)? Exist
Forwarded from Канал Ивана Дианова
Ливкодинг - это вроде виджеинга, только картинка создаётся кодом. Программа пишется прямо по ходу выступления и исходник виден на экране.
Вчера впервые поливкодил на местном рейве. Думал меня хватит на полтора часа, но продержался часов шесть, пока не посветлело. Беруши помогли :-)
Забавно, что никто не отличает замысел от багов. Можно писать, что попало. А все думают, что так и было задумано. Лишь бы не черный экран.
Вчера впервые поливкодил на местном рейве. Думал меня хватит на полтора часа, но продержался часов шесть, пока не посветлело. Беруши помогли :-)
Забавно, что никто не отличает замысел от багов. Можно писать, что попало. А все думают, что так и было задумано. Лишь бы не черный экран.
Наконец-то смержили мой MR, который висел уже два месяца. И он даже попадёт в ближайший релиз.
#трудовыебудни
#трудовыебудни
Я часто ругаюсь с людьми, причём делаю больно не преднамеренно. Совсем недавно я сделал это ещё раз. Более того, я подвёл человека, который от меня зависит. И уделяю мало внимания тем, кто в моём внимании нуждается.
Я делаю недостаточно. На работе я большую часть времени пинаю балду, вне работы тоже. Мои каналы простаивают без авторского контента. Своим родственникам я помогаю (в той или иной мере) мало и неохотно. По дому от меня помощи не дождаться.
Я не занимаюсь собой. Список "на почитать" лишь растёт, но почти не убывает. Своим телом я тоже не занимаюсь, не смотря на весомые стимулы. Не занимаюсь физической нагрузкой и забиваю на медицинский уход.
Я ничтожен. Все мои постоянные обязанности мелочны и не обременительны. Мир постоянно напоминает мне о том, какой я не взрослый и не самостоятельный, причём романтических отношений это тоже касается. Самое страшное, что меня это в какой-то мере устраивает.
Хочется просто ничего не делать и оставаться лежать в кровати, прижимая к себе плюшевую акулу — единственное существо, которое я могу себе позволить обнять.
Я делаю недостаточно. На работе я большую часть времени пинаю балду, вне работы тоже. Мои каналы простаивают без авторского контента. Своим родственникам я помогаю (в той или иной мере) мало и неохотно. По дому от меня помощи не дождаться.
Я не занимаюсь собой. Список "на почитать" лишь растёт, но почти не убывает. Своим телом я тоже не занимаюсь, не смотря на весомые стимулы. Не занимаюсь физической нагрузкой и забиваю на медицинский уход.
Я ничтожен. Все мои постоянные обязанности мелочны и не обременительны. Мир постоянно напоминает мне о том, какой я не взрослый и не самостоятельный, причём романтических отношений это тоже касается. Самое страшное, что меня это в какой-то мере устраивает.
Хочется просто ничего не делать и оставаться лежать в кровати, прижимая к себе плюшевую акулу — единственное существо, которое я могу себе позволить обнять.
#article
О том, какой вред для разработчиков несут игроки с токсичным поведением, и о мерах борьбы с ними, которые работают
media-xyz.com/ru/articles/1098-otkuda-berutsia-toksichnye-igroki-i-kak-s-nim
О том, какой вред для разработчиков несут игроки с токсичным поведением, и о мерах борьбы с ними, которые работают
media-xyz.com/ru/articles/1098-otkuda-berutsia-toksichnye-igroki-i-kak-s-nim
О, а нас тут уже 900, клёво! Приятно сознавать, что стольким людям нравится мой канал. Интересно, удастся ли набрать тысячу к юбилею?
Telegram
Блог*
Итак, сегодня 5 декабря. Чем примечателен этот день? Это — день, когда Блог* появился на свет.
Тогда мои амбиции были невелики: я считал, что этот блог будут читать только моя семья и ближайшие знакомые — полтора-два десятка человек максимум. Собственно…
Тогда мои амбиции были невелики: я считал, что этот блог будут читать только моя семья и ближайшие знакомые — полтора-два десятка человек максимум. Собственно…
Блог*
Одна моя знакомая уже какое-то время ведёт свой блог. Почему на него стоит подписаться? Ну, она умная, шарит в программировании и data science, да и в вообще куче (около)айтишных вещей. В отличие от меня, разбирается в политике. А, и ещё она сумела сама переехать…
Советую посмотреть ещё раз, благо там тоже праздник: первая сотня подписчиков