Skip to content

Instantly share code, notes, and snippets.

@AnthonyMikh
AnthonyMikh / path_in_bst_generic.rs
Last active March 22, 2018 15:46
Решение задачи №80 от UniLecs, обобщённое на любой тип, для которого определена операция сравнения
#![feature(slice_patterns)]
fn same_relation<Elem: Ord>(pivot: Elem, arr: &[Elem]) -> bool {
match *arr {
[] => true,
[ref _single] => true,
[ref first, ref rest..] => {
let relation = pivot.cmp(first);
rest.iter().all(|x| pivot.cmp(x) == relation)
},
@AnthonyMikh
AnthonyMikh / prime_factorization.rs
Last active March 26, 2018 19:01
Решение задачи №81 от UniLecs
#![deny(overflowing_literals)]
#[macro_use]
//Библиотека для ленивой инициализации. Позволяет удостовериться,
//что IS_PRIME инициализируется только один раз
extern crate lazy_static;
//Верхняя граница на входные данные
const BOUND: usize = 1_000;
const IS_PRIME_SIZE: usize = BOUND - 2 + 1;
@AnthonyMikh
AnthonyMikh / prime_factorization_pretty.rs
Created March 26, 2018 19:10
Решение задачи №81 от UniLecs с блэкджеком и модулями
#![deny(overflowing_literals)]
#[macro_use]
extern crate lazy_static;
const BOUND: usize = 1_000;
const IS_PRIME_SIZE: usize = BOUND - 2 + 1;
lazy_static! {
static ref IS_PRIME: [bool; IS_PRIME_SIZE] = make_is_prime();
@AnthonyMikh
AnthonyMikh / diophantine_equation.rs
Created March 29, 2018 21:49
Решение задачи №82 от UniLecs
#![feature(range_contains)]
//^Строго говоря, необязательно, но проверку на принадлежность диапозону
//удобнее всего делать с этой фичей
type Coeff = i64;
//Расширенный алгоритм Евклида (рекурсивный вариант)
fn gcd_extended_recursive(a: Coeff, b: Coeff) -> (Coeff, Coeff, Coeff) {
if b == 0 {
(a, 1, 0)
@AnthonyMikh
AnthonyMikh / number_of_solutions.rs
Last active April 9, 2018 19:39
Решение задачи №83 от UniLecs
#![deny(overflowing_literals)]
type Number = u32;
//Верхняя граница на входные данные
const BOUND: Number = 1_000_000_000;
//Вычисляет число делителей квадрата аргумента
fn number_of_divisors_of_square(mut n: Number) -> Number {
let mut acc = 1;
@AnthonyMikh
AnthonyMikh / count_anagrams.rs
Last active April 11, 2018 16:23
Решение задачи №84 от UniLecs
//Превратить переполнение числовых литералов в ошибку компиляции
#![deny(overflowing_literals)]
//Тип для подсчёта значений
type Count = u32;
//Возвращает факториал аргумента
fn factorial(n: Count) -> Count {
(1..=n).product()
}
@AnthonyMikh
AnthonyMikh / unfinished_formula.hs
Last active April 16, 2018 18:32
Решение задачи №85 от UniLecs
solve k =
if k == 0
then 0
else extract . dropWhile (notSameOddity k') . dropWhile (notIncludes k') . enhance $ [0..]
where
k' = abs k
sums = scanl (+) 0 [1..]
enhance = zip3 (cycle [0, 1, 1, 0]) sums
first (x, _, _) = x
second (_, x, _) = x
@AnthonyMikh
AnthonyMikh / score_twice_before_cut_once.rs
Created April 18, 2018 22:29
Решение задачи №86 от UniLecs
//Тип стороны прямоугольника
type RectSide = f64;
//Верхняя граница на стороны прямоугольника
const SIDE_BOUND: RectSide = 1_000_000_000.0;
#[derive(Debug, PartialEq)]
enum MaxSquareSideError { //Тип ошибки при решении задачи:
NonPositive(RectSide), //сторона неположительна,
OutOfBound(RectSide), //сторона слишком большая,
@AnthonyMikh
AnthonyMikh / formation.hs
Created April 21, 2018 22:14
Решение задачи №87 от UniLecs
-- Решение напрямую
data Variant = Chosen | Skipped
deriving (Eq)
type Row = [Variant]
isValid :: Row -> Bool
isValid [] = True
isValid (x:[]) = True
isValid (x:y:ys) = ((x, y) /= (Chosen, Chosen)) && (isValid (y:ys))
@AnthonyMikh
AnthonyMikh / count_choices.rs
Created April 23, 2018 16:41
Решение задачи №87 от UniLecs
extern crate num_bigint;
extern crate num_traits;
use num_bigint::BigUint;
use num_traits::{Zero, One};
type Length = u32;
#[deny(overflowing_literals)]
const BORDER: Length = 1_001;