Skip to content

Instantly share code, notes, and snippets.

@AnthonyMikh
AnthonyMikh / count_squares.rs
Created December 23, 2017 22:42
Решение задачи №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;
@AnthonyMikh
AnthonyMikh / count_places.rs
Created December 28, 2017 22:30
Решение задачи UniLecs №57
fn count_places(street: &str) -> usize {
let mut free = vec![true; street.len()]; //заводим вектор, в котором будем писать, свободно ли место
//и инициализируем его истинными значениями
for (i, a) in street.bytes().enumerate() { //перебираем символы вместе с индексами
match a { //смотрим, что за символ
b'E' => free[i] = false, //если выезд - помечаем соответсвующее место как занятое
b'S' => { //если остановка - помечаем как занятое
free[i] = false; //текущее место...
free[i.saturating_sub(1)] = false; //...предыдущее...
free[i.saturating_sub(2)] = false; //...и предпредыдущее
fn count_profit1(time: usize, orders: &[u32]) -> u32 {
if time == 0 || orders.len() == 0 { //микрооптимизация: если длина массива или время
return 0 //нулевое, то сразу возвращаем нуль
}
let mut sorted = orders.to_vec(); //инициализируем временный буфер
sorted.sort_unstable_by(|a, b| b.cmp(a)); //сортируем буфер по убыванию
sorted.into_iter().take(time).sum() //берём time первых элементов и суммируем
}
fn count_profit2(time: usize, orders: &[u32]) -> u32 {
@AnthonyMikh
AnthonyMikh / ListNum.hs
Created January 10, 2018 15:44
Решение задачи №60 от UniLecs
-- Вспомогательная функция, разделяющая число
-- на младший разряд и все остальные
base10 x = (x `quot` 10, x `rem` 10)
-- Конструирует список из числа
mkListNum x = case base10 x of
(0, digit) -> [digit]
(rest, digit) -> (digit : mkListNum rest)
-- Переводит список обратно в число
@AnthonyMikh
AnthonyMikh / calculate_cleanup_time.rs
Last active January 16, 2018 14:07
Решение задачи №61 от Unilecs
const SPEED_REGULAR_KMPH: i64 = 50;
const SPEED_CLEANUP_KMPH: i64 = 20;
type Point = (i64, i64);
struct Segment {
start: Point,
end: Point,
}
@AnthonyMikh
AnthonyMikh / oranges.hs
Created January 18, 2018 08:31
Решение задачи №62 от UniLecs
import Data.List (foldl')
solution = flip (-) 1 . foldl' lcm 1 . enumFromTo 1
main = putStrLn . show $ solution 4
@AnthonyMikh
AnthonyMikh / least_common_divisor.hs
Created January 20, 2018 10:17
Решение задачи №63 от UniLecs
--gcd=greatest common divisor
gcd' x y
| x < y = gcd' y x
| x == y = x
| otherwise = let x' = x - y in x' `seq` gcd' x' y
--lcm=least common divisor
lcm' x y =
let prod = x*y
in prod `seq` prod `div` gcd' x y
@AnthonyMikh
AnthonyMikh / least_common_multiple_of_array_of_ints.hs
Created January 22, 2018 19:50
Решение задачи №63 от UniLecs (на этот раз верное)
import qualified Data.Vector.Unboxed as V
--gcd=greatest common divisor
gcd' x y
| x < y = gcd' y x
| x == y = x
| otherwise = let x' = x - y in x' `seq` gcd' x' y
--lcm=least common multiple
lcm' x y =
@AnthonyMikh
AnthonyMikh / max_complement.rs
Last active January 25, 2018 21:14
Решение задачи UniLecs №64
const COORD_BOUND: usize = 100; //Максимально воможное по модулю значение координат
type CoordBase = i16; //Тип координат. Выбирается так, чтобы включал в
type Coord = (CoordBase, CoordBase); //диапазон [-COORD_BOUND, COORD_BOUND]
struct View2d { //Вспомогательная структура для более удобной
side: usize, //индексации
inner: Vec<usize>,
}
impl View2d {
@AnthonyMikh
AnthonyMikh / polygon_area.hs
Created January 26, 2018 18:26
Решение задачи №65 от UniLecs (вариант со списками)
import Control.Arrow ((***), (&&&))
shift = go
where
go [] = []
go (x:xs) = xs ++ [x]
shiftedZipWith f = uncurry (zipWith f) . (&&&) id shift
shiftedSum = shiftedZipWith (+)
shiftedFSub = shiftedZipWith (flip (-))