Skip to content

Instantly share code, notes, and snippets.

@AnthonyMikh
Created May 25, 2018 21:18
Show Gist options
  • Save AnthonyMikh/db1fa2eb84a009ae4e8f25dbb604463c to your computer and use it in GitHub Desktop.
Save AnthonyMikh/db1fa2eb84a009ae4e8f25dbb604463c to your computer and use it in GitHub Desktop.
Решение задачи №97 от UniLecs (Место в строю)
type Height = u8;
//Ищет индекс lineup, по которому можно разместить person,
//не нарушая упорядочения по убыванию.
//В случае, если в слайсе несколько элементов подряд,
//равных person, возвращается индекс после последнего элемента группы.
//ВНИМАНИЕ: проверка на то, что слайс действительно является
//упорядоченным, не производится
fn index_in_lineup(lineup: &[Height], person: Height) -> usize {
//Ищем person бинарным поиском (учитывая, что
//он упорядочен по убыванию)
match lineup.binary_search_by(|x| person.cmp(x)) {
//Если индекс найден (person есть в слайсе), то
//пропускаем все элементы, равные person,
//и возвращаем индекс элемента после них.
Ok(idx) => {
lineup[idx..]
.iter()
.zip(idx..)
.skip_while(|(&x, _)| x == person)
.next()
.map(|(_, idx)| idx)
//Если индекса нет, значит, мы дошли до конца
//слайса. В этом случае person можно вставить
//в конец
.unwrap_or(lineup.len())
},
//Если индекс не найден, то возвращаем позицию, в которой
//его можно вставить, не нарушая порядка
Err(idx) => idx,
}
}
//Ищет место lineup, по которому можно разместить person,
//не нарушая упорядочения по убыванию.
//В случае, если в слайсе несколько элементов подряд,
//равных person, возвращается номер места после последнего элемента группы.
//ВНИМАНИЕ: проверка на то, что слайс действительно является
//упорядоченным, не производится
fn place_in_lineup(lineup: &[Height], person: Height) -> usize {
index_in_lineup(lineup, person) + 1
}
#[test]
fn some_variants() {
let lineup = [155, 153, 150, 150, 147, 145, 144];
assert_eq!(place_in_lineup(&lineup, 152), 3);
assert_eq!(place_in_lineup(&lineup, 144), 8);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment