Skip to content

Instantly share code, notes, and snippets.

@AnthonyMikh
Created December 23, 2017 22:42
Show Gist options
  • Save AnthonyMikh/a80b23bbf476126780aa95dee74d44e4 to your computer and use it in GitHub Desktop.
Save AnthonyMikh/a80b23bbf476126780aa95dee74d44e4 to your computer and use it in GitHub Desktop.
Решение задачи №55 от UniLecs
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