mirror of
https://github.com/kmc7468/cs220.git
synced 2025-12-14 22:18:46 +00:00
Assignment 2 Done
This commit is contained in:
@@ -1,23 +1,29 @@
|
|||||||
//! Small problems.
|
//! Small problems.
|
||||||
|
|
||||||
use std::iter;
|
use std::{cmp::min, iter};
|
||||||
|
|
||||||
const FAHRENHEIT_OFFSET: f64 = 32.0;
|
const FAHRENHEIT_OFFSET: f64 = 32.0;
|
||||||
const FAHRENHEIT_SCALE: f64 = 5.0 / 9.0;
|
const FAHRENHEIT_SCALE: f64 = 5.0 / 9.0;
|
||||||
|
|
||||||
/// Converts Fahrenheit to Celsius temperature degree.
|
/// Converts Fahrenheit to Celsius temperature degree.
|
||||||
pub fn fahrenheit_to_celsius(degree: f64) -> f64 {
|
pub fn fahrenheit_to_celsius(degree: f64) -> f64 {
|
||||||
todo!()
|
(degree - 32.0) * 5.0 / 9.0
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Capitalizes English alphabets (leaving the other characters intact).
|
/// Capitalizes English alphabets (leaving the other characters intact).
|
||||||
pub fn capitalize(input: String) -> String {
|
pub fn capitalize(input: String) -> String {
|
||||||
todo!()
|
input.to_ascii_uppercase()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the sum of the given array. (We assume the absence of integer overflow.)
|
/// Returns the sum of the given array. (We assume the absence of integer overflow.)
|
||||||
pub fn sum_array(input: &[u64]) -> u64 {
|
pub fn sum_array(input: &[u64]) -> u64 {
|
||||||
todo!()
|
let mut result = 0;
|
||||||
|
|
||||||
|
for i in input {
|
||||||
|
result += i;
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Given a non-negative integer, say `n`, return the smallest integer of the form `3^m` that's
|
/// Given a non-negative integer, say `n`, return the smallest integer of the form `3^m` that's
|
||||||
@@ -25,13 +31,27 @@ pub fn sum_array(input: &[u64]) -> u64 {
|
|||||||
///
|
///
|
||||||
/// For instance, up3(6) = 9, up3(9) = 9, up3(10) = 27. (We assume the absence of integer overflow.)
|
/// For instance, up3(6) = 9, up3(9) = 9, up3(10) = 27. (We assume the absence of integer overflow.)
|
||||||
pub fn up3(n: u64) -> u64 {
|
pub fn up3(n: u64) -> u64 {
|
||||||
todo!()
|
let mut value = 1;
|
||||||
|
|
||||||
|
while value < n {
|
||||||
|
value *= 3;
|
||||||
|
}
|
||||||
|
|
||||||
|
value
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the greatest common divisor (GCD) of two non-negative integers. (We assume the absence
|
/// Returns the greatest common divisor (GCD) of two non-negative integers. (We assume the absence
|
||||||
/// of integer overflow.)
|
/// of integer overflow.)
|
||||||
pub fn gcd(lhs: u64, rhs: u64) -> u64 {
|
pub fn gcd(lhs: u64, rhs: u64) -> u64 {
|
||||||
todo!()
|
let (mut a, mut b) = if lhs >= rhs { (lhs, rhs) } else { (rhs, lhs) };
|
||||||
|
|
||||||
|
while b != 0 {
|
||||||
|
let r = a % b;
|
||||||
|
a = b;
|
||||||
|
b = r;
|
||||||
|
}
|
||||||
|
|
||||||
|
a
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the array of nC0, nC1, nC2, ..., nCn, where nCk = n! / (k! * (n-k)!). (We assume the
|
/// Returns the array of nC0, nC1, nC2, ..., nCn, where nCk = n! / (k! * (n-k)!). (We assume the
|
||||||
@@ -40,7 +60,24 @@ pub fn gcd(lhs: u64, rhs: u64) -> u64 {
|
|||||||
/// Consult <https://en.wikipedia.org/wiki/Pascal%27s_triangle> for computation of binomial
|
/// Consult <https://en.wikipedia.org/wiki/Pascal%27s_triangle> for computation of binomial
|
||||||
/// coefficients without integer overflow.
|
/// coefficients without integer overflow.
|
||||||
pub fn chooses(n: u64) -> Vec<u64> {
|
pub fn chooses(n: u64) -> Vec<u64> {
|
||||||
todo!()
|
let mut result = vec![1];
|
||||||
|
|
||||||
|
for k in 1..=n {
|
||||||
|
let last = *result.last().unwrap();
|
||||||
|
let numerator = n + 1 - k;
|
||||||
|
|
||||||
|
let new_value = if numerator % k == 0 {
|
||||||
|
last * ((numerator) / k)
|
||||||
|
} else if last % k == 0 {
|
||||||
|
(last / k) * numerator
|
||||||
|
} else {
|
||||||
|
let gcd_last = gcd(last, k);
|
||||||
|
(last / gcd_last) * (numerator / (k / gcd_last))
|
||||||
|
};
|
||||||
|
result.push(new_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the "zip" of two vectors.
|
/// Returns the "zip" of two vectors.
|
||||||
@@ -48,5 +85,12 @@ pub fn chooses(n: u64) -> Vec<u64> {
|
|||||||
/// For instance, `zip(vec![1, 2, 3], vec![4, 5])` equals to `vec![(1, 4), (2, 5)]`. Here, `3` is
|
/// For instance, `zip(vec![1, 2, 3], vec![4, 5])` equals to `vec![(1, 4), (2, 5)]`. Here, `3` is
|
||||||
/// ignored because it doesn't have a partner.
|
/// ignored because it doesn't have a partner.
|
||||||
pub fn zip(lhs: Vec<u64>, rhs: Vec<u64>) -> Vec<(u64, u64)> {
|
pub fn zip(lhs: Vec<u64>, rhs: Vec<u64>) -> Vec<(u64, u64)> {
|
||||||
todo!()
|
let length = min(lhs.len(), rhs.len());
|
||||||
|
let mut result: Vec<(u64, u64)> = Vec::new();
|
||||||
|
|
||||||
|
for i in 0..length {
|
||||||
|
result.push((lhs[i], rhs[i]));
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,12 @@ impl Mul<Mat2> for Mat2 {
|
|||||||
|
|
||||||
/// Consult <https://www.mathsisfun.com/algebra/matrix-multiplying.html>
|
/// Consult <https://www.mathsisfun.com/algebra/matrix-multiplying.html>
|
||||||
fn mul(self, rhs: Mat2) -> Self::Output {
|
fn mul(self, rhs: Mat2) -> Self::Output {
|
||||||
todo!()
|
Mat2 {
|
||||||
|
a: self.a * rhs.a + self.b * rhs.c,
|
||||||
|
b: self.a * rhs.b + self.b * rhs.d,
|
||||||
|
c: self.c * rhs.a + self.d * rhs.c,
|
||||||
|
d: self.c * rhs.b + self.d * rhs.d,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,21 +60,30 @@ impl Mul<Vec2> for Mat2 {
|
|||||||
///
|
///
|
||||||
/// Consult <https://www.mathsisfun.com/algebra/matrix-multiplying.html>
|
/// Consult <https://www.mathsisfun.com/algebra/matrix-multiplying.html>
|
||||||
fn mul(self, rhs: Vec2) -> Self::Output {
|
fn mul(self, rhs: Vec2) -> Self::Output {
|
||||||
todo!()
|
Vec2 {
|
||||||
|
a: self.a * rhs.a + self.b * rhs.b,
|
||||||
|
b: self.c * rhs.a + self.d * rhs.b,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Mat2 {
|
impl Mat2 {
|
||||||
/// Calculates the power of matrix.
|
/// Calculates the power of matrix.
|
||||||
fn power(self, power: u64) -> Mat2 {
|
fn power(self, power: u64) -> Mat2 {
|
||||||
todo!()
|
let mut result = Mat2::new();
|
||||||
|
|
||||||
|
for i in 0..power {
|
||||||
|
result = result * self;
|
||||||
|
}
|
||||||
|
|
||||||
|
result
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Vec2 {
|
impl Vec2 {
|
||||||
/// Gets the upper value of vector.
|
/// Gets the upper value of vector.
|
||||||
fn get_upper(self) -> u64 {
|
fn get_upper(self) -> u64 {
|
||||||
todo!()
|
self.a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -120,7 +134,14 @@ impl FMat2 {
|
|||||||
/// );
|
/// );
|
||||||
/// ```
|
/// ```
|
||||||
pub fn inverse(self) -> Self {
|
pub fn inverse(self) -> Self {
|
||||||
todo!()
|
let det = self.a * self.d - self.b * self.c;
|
||||||
|
|
||||||
|
FMat2 {
|
||||||
|
a: self.d / det,
|
||||||
|
b: -self.b / det,
|
||||||
|
c: -self.c / det,
|
||||||
|
d: self.a / det,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user