Skip to content

Instantly share code, notes, and snippets.

@AnthonyMikh
AnthonyMikh / polygon_area2.hs
Created January 27, 2018 21:20
Решение задачи №65 от Unilecs (вариант с массивами)
import qualified Data.Vector.Unboxed as V
import Control.Arrow ((***), (&&&))
(&) = flip ($)
infixl 0 &
shiftedZipWith f vec =
enumFromTo 0 (len-1)
& map index &&& map (index . (`rem` len) . (+1))
@AnthonyMikh
AnthonyMikh / find_power.rs
Last active January 31, 2018 09:41
Решение задачи №66 от Unilecs
extern crate num; //В Rust нет нативной длинной арифметики
#[derive(Debug, PartialEq)]
enum POTError<'a> {
NoCoincide(&'a str),
EmptyString,
PowerIsTooLarge,
}
type BoundType = u32; //Если впоследствие верхняя граница поменяется,
@AnthonyMikh
AnthonyMikh / integer_points.rs
Last active February 3, 2018 21:14
Решение задачи №67 от UniLecs
type BaseCoord = i32;
type DeltaCoord = u32;
type InputPoint = (BaseCoord, BaseCoord);
//gcd - greatest common divisor
//Считает НОД аргументов по алгоритму Евклида
//В случае, если один из аргументов равен нулю,
//возвращает второй
fn gcd(a: DeltaCoord, b: DeltaCoord) -> DeltaCoord {
if a < b { gcd(b, a) }
@AnthonyMikh
AnthonyMikh / comparison.hs
Created February 6, 2018 21:36
Обоснование решения задачи №68 от UniLecs
type Seq = String
type Solution = [Seq]
seed :: Solution
seed = ["44", "47", "74", "77"]
extendSeq :: Seq -> [Seq]
extendSeq base@(x:y:ys) =
case (x, y) of
('4', '4') -> ['7':base]
@AnthonyMikh
AnthonyMikh / two_digits.hs
Created February 6, 2018 21:45
Решение задачи №68 от UniLecs
fibs = 1 : 1 : zipWith (+) fibs (tail fibs)
fibs2 = map (*2) fibs
solution n = fibs2 !! n
main = print $ solution 8
-- > 68
@AnthonyMikh
AnthonyMikh / two_digits.rs
Last active February 9, 2018 10:40
Решение задачи №68 от UniLecs на Rust
//Постоянный пересчёт чисел Фибоначчи слишком неэффективен,
//поэтому заведём отдельный буфер для хранения уже вычисленных
//чисел, а чтобы не испортить случайно значения, заведём для
//буфера отдельный модуль
mod fib {
//Тип числа, в котором хранятся вычисленные значения.
//Выбирается исходя из критерия F(INDEX_BOUND+1) <= Base::max_value(),
//где F(n) - n-ое число Фибоначчи
pub type Base = u32;
pub struct FibAccum { //Буфер вычисленных значений.
@AnthonyMikh
AnthonyMikh / factorial_zeroes.hs
Last active February 12, 2018 15:15
Решение задачи №69 от UniLecs
import Data.Word (Word64)
power5 = iterate (*5) 5
factorialZeroes n = sum . takeWhile (/=0) . zipWith (flip div) power5' . repeat $ n
where
takeWhilePlusOne cond x =
let (first, s:econd) = span cond x
in first ++ [s]
power5' = takeWhilePlusOne (<= (n `div` 5)) power5
@AnthonyMikh
AnthonyMikh / count_right_angles.rs
Last active February 16, 2018 15:10
Решение задачи №70 от UniLecs
type Coord = i16;
type Point = (Coord, Coord); //Тип входных данных
type VectorCoord = i32;
struct Vector2(VectorCoord, VectorCoord); //Тип вектора на плоскости
impl Vector2 {
//Конструирует вектор от точки from до точки to
fn from_points(from: &Point, to: &Point) -> Self {
Self{
@AnthonyMikh
AnthonyMikh / treeWater.hs
Created February 16, 2018 18:40
Решение задачи №71
--Считает сумму первых n членов арифметической прогрессии
--с разностью d и первым членом n0
ariphmSum d n0 n = ((2*n0 + d*(n-1))*n) `div` 2
treeWater = (+top) . ariphmSum tierDiff initLeaves
where
top = 1
tierDiff = 2
initLeaves = 2
@AnthonyMikh
AnthonyMikh / modpow.rs
Last active February 22, 2018 13:57
Решение задачи №72 от UniLecs
type Base = u64;
//Тип возможной ошибки при вычислении степени
#[derive(Debug, PartialEq)]
enum ModPowErr {
ZeroModulus, //Деление на ноль не определено
ZeroPowerOfZero //Выражение 0^0 не определено
}
//Считает x ≡ init^power (mod modulus).