#1 Created base repo ready to start solving some problems.
This commit is contained in:
parent
bbca87646a
commit
2318361bfc
7
Cargo.toml
Normal file
7
Cargo.toml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
[package]
|
||||||
|
name = "OxidisedLeetCode"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
tokio = { version = "1.38.0", features = ["full"] }
|
0
src/input/0_test1
Normal file
0
src/input/0_test1
Normal file
0
src/input/0_test2
Normal file
0
src/input/0_test2
Normal file
0
src/input/0_test3
Normal file
0
src/input/0_test3
Normal file
40
src/main.rs
Normal file
40
src/main.rs
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
mod solutions;
|
||||||
|
mod utils;
|
||||||
|
|
||||||
|
use std::{error::Error, time::SystemTime};
|
||||||
|
|
||||||
|
use solutions::*;
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<(), Box<dyn Error>> {
|
||||||
|
let problems: Vec<Box<dyn Solution + Sync>> = vec![Box::new(xx::XX {})];
|
||||||
|
|
||||||
|
let mut t = vec![];
|
||||||
|
|
||||||
|
// Run through and generate solutions
|
||||||
|
for problem in problems.leak() {
|
||||||
|
let task = tokio::spawn(async { problem.run().unwrap() });
|
||||||
|
t.push(task);
|
||||||
|
}
|
||||||
|
|
||||||
|
let start_time = SystemTime::now();
|
||||||
|
|
||||||
|
let mut problems = vec![];
|
||||||
|
for thread in t {
|
||||||
|
problems.push(thread.await?);
|
||||||
|
}
|
||||||
|
|
||||||
|
for problem in problems {
|
||||||
|
println!("========= Problem {} ==========", problem.id);
|
||||||
|
println!("Test1 Result: {}", problem.test1);
|
||||||
|
println!("Test2 Result: {}", problem.test2);
|
||||||
|
println!("Test3 Result: {}", problem.test3);
|
||||||
|
println!("========= {}ms =========\n", problem.time.as_millis());
|
||||||
|
}
|
||||||
|
|
||||||
|
println!(
|
||||||
|
"Ran LeetCode in {}ms",
|
||||||
|
SystemTime::now().duration_since(start_time)?.as_millis()
|
||||||
|
);
|
||||||
|
Ok(())
|
||||||
|
}
|
35
src/solutions/mod.rs
Normal file
35
src/solutions/mod.rs
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
use crate::utils::{self, get_input};
|
||||||
|
use std::{error::Error, fmt::Display, time::SystemTime};
|
||||||
|
|
||||||
|
pub mod xx;
|
||||||
|
|
||||||
|
pub trait Solution {
|
||||||
|
// Run and return the solution to the problem
|
||||||
|
fn solution(&self, input: &mut Vec<String>) -> Result<Box<dyn Display + Sync>, Box<dyn Error>>;
|
||||||
|
|
||||||
|
// Get the id of the problem in question
|
||||||
|
fn get_id(&self) -> u8;
|
||||||
|
|
||||||
|
fn run(&self) -> Result<Run, Box<dyn std::error::Error>> {
|
||||||
|
let start_time = SystemTime::now();
|
||||||
|
|
||||||
|
let run = Run {
|
||||||
|
test1: self.solution(get_input(self.get_id(), utils::InputType::Test1)?.as_mut())?,
|
||||||
|
test2: self.solution(get_input(self.get_id(), utils::InputType::Test2)?.as_mut())?,
|
||||||
|
test3: self.solution(get_input(self.get_id(), utils::InputType::Test3)?.as_mut())?,
|
||||||
|
id: self.get_id(),
|
||||||
|
time: SystemTime::now().duration_since(start_time)?,
|
||||||
|
};
|
||||||
|
Ok(run)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct Run {
|
||||||
|
pub test1: Box<dyn Display + Sync>,
|
||||||
|
pub test2: Box<dyn Display + Sync>,
|
||||||
|
pub test3: Box<dyn Display + Sync>,
|
||||||
|
pub id: u8,
|
||||||
|
pub time: core::time::Duration,
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe impl Send for Run {}
|
59
src/solutions/xx.rs
Normal file
59
src/solutions/xx.rs
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
use super::Solution;
|
||||||
|
|
||||||
|
pub struct XX {}
|
||||||
|
|
||||||
|
impl Solution for XX {
|
||||||
|
fn solution(
|
||||||
|
&self,
|
||||||
|
_input: &mut Vec<String>,
|
||||||
|
) -> Result<Box<dyn std::fmt::Display + Sync>, Box<dyn std::error::Error>> {
|
||||||
|
Ok(Box::new("Ready"))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_id(&self) -> u8 {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl XX {}
|
||||||
|
|
||||||
|
/// Test from puzzle input
|
||||||
|
#[cfg(test)]
|
||||||
|
mod test {
|
||||||
|
use super::*;
|
||||||
|
use crate::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test1() {
|
||||||
|
let solution = xx::XX {};
|
||||||
|
|
||||||
|
//Complete the Challenge
|
||||||
|
let answer = solution
|
||||||
|
.solution(
|
||||||
|
utils::get_input(solution.get_id(), utils::InputType::Test1)
|
||||||
|
.unwrap()
|
||||||
|
.as_mut(),
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
.to_string();
|
||||||
|
|
||||||
|
assert_eq!(answer, "Ready");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test2() {
|
||||||
|
let solution = xx::XX {};
|
||||||
|
|
||||||
|
//Complete the Challenge
|
||||||
|
let answer = solution
|
||||||
|
.solution(
|
||||||
|
utils::get_input(solution.get_id(), utils::InputType::Test2)
|
||||||
|
.unwrap()
|
||||||
|
.as_mut(),
|
||||||
|
)
|
||||||
|
.unwrap()
|
||||||
|
.to_string();
|
||||||
|
|
||||||
|
assert_eq!(answer, "Ready");
|
||||||
|
}
|
||||||
|
}
|
65
src/utils.rs
Normal file
65
src/utils.rs
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
use std::{
|
||||||
|
error::Error,
|
||||||
|
fs::File,
|
||||||
|
io::{prelude::*, BufReader},
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Enum used to specify input
|
||||||
|
#[allow(unused)]
|
||||||
|
pub enum InputType {
|
||||||
|
Test1,
|
||||||
|
Test2,
|
||||||
|
Test3,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Function to get the input for a given leetcode problem
|
||||||
|
pub fn get_input(id: u8, input: InputType) -> Result<Vec<String>, Box<dyn Error>> {
|
||||||
|
// Find Input File Name
|
||||||
|
let file_name = match input {
|
||||||
|
InputType::Test1 => format!("src/input/{}_test1", id),
|
||||||
|
InputType::Test2 => format!("src/input/{}_test2", id),
|
||||||
|
InputType::Test3 => format!("src/input/{}_test3", id),
|
||||||
|
};
|
||||||
|
|
||||||
|
// Read file into buffer
|
||||||
|
let file = File::open(file_name)?;
|
||||||
|
let reader = BufReader::new(file);
|
||||||
|
|
||||||
|
// Convert itterate buffer and return string vec
|
||||||
|
let data = reader
|
||||||
|
.lines()
|
||||||
|
.map(|s| s.unwrap_or(String::from("")))
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
Ok(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Below this line are a series of utils that can be re-used
|
||||||
|
// for any of the problems identified
|
||||||
|
#[allow(unused)]
|
||||||
|
//
|
||||||
|
///=========================================================
|
||||||
|
//
|
||||||
|
|
||||||
|
pub fn lcm(first: u64, second: u64) -> u64 {
|
||||||
|
first * second / gcd(first, second)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn gcd(first: u64, second: u64) -> u64 {
|
||||||
|
let mut max = first;
|
||||||
|
let mut min = second;
|
||||||
|
if min > max {
|
||||||
|
std::mem::swap(&mut max, &mut min);
|
||||||
|
}
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let res = max % min;
|
||||||
|
if res == 0 {
|
||||||
|
return min;
|
||||||
|
}
|
||||||
|
|
||||||
|
max = min;
|
||||||
|
min = res;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user