Created
December 23, 2017 22:42
-
-
Save AnthonyMikh/a80b23bbf476126780aa95dee74d44e4 to your computer and use it in GitHub Desktop.
Решение задачи №55 от 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
fn count_squares(arr: &[usize]) -> usize { | |
use std::collections::HashMap; | |
let mut occurs = HashMap::<usize, usize>::new(); //создаём мапу, в которой будем хранить вхождения чисел | |
//перебираем все стороны из массива | |
for &i in arr.iter() { | |
//если такой стороны в мапе ещё нет, вставляем с нулевым количеством вхождений... | |
let count = occurs.entry(i).or_insert(0); | |
//...и инкрементируем | |
*count += 1; | |
} | |
/* occurs.iter() | |
.map(|(_, &x)| x) | |
.fold(0, |acc, x| acc + x/4) */ | |
//^вариант решения в более функциональном стиле | |
//лично мне нравится больше, но новичкам может быть менее понятным | |
let mut sum = 0; | |
//перебираем числа вхождений сохранённых сторон | |
for (_, &x) in occurs.iter() { | |
//прибавляем к аккумулятору число целых четвёрок сторон (=квадратов) | |
sum += x/4; | |
} | |
//возвращаем сумму количества четвёрок | |
sum | |
} | |
fn main() { | |
let arr = [7, 7, 2, 7, 8, 7, 9, 7, 2]; | |
assert_eq!(count_squares(&arr), 1); | |
let arr2 = [33, 4, 44, 33, 99, 33, 33, 4, 6]; | |
assert_eq!(count_squares(&arr2), 1); | |
let arr3 = [1, 1, 1, 1, 1, 1, 1, 1]; | |
assert_eq!(count_squares(&arr3), 2); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment