Created
May 25, 2018 21:18
-
-
Save AnthonyMikh/db1fa2eb84a009ae4e8f25dbb604463c to your computer and use it in GitHub Desktop.
Решение задачи №97 от UniLecs (Место в строю)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
Playground: http://play.rust-lang.org/?gist=8a384d2483397c29a9a0084c6e0b6270&version=stable&mode=debug