From 20a892a264de9ed739f8d7b0d04c30bbe6ed08fb Mon Sep 17 00:00:00 2001 From: woojin Date: Mon, 21 Aug 2023 19:43:04 +0900 Subject: [PATCH] apply comments --- scripts/grade-01.sh | 2 +- scripts/grade-08.sh | 2 +- scripts/grade-13.sh | 2 +- .../{assignment01.rs => assignment01/mod.rs} | 13 +- .../assignment01/small_problems.rs | 12 + .../small_problems_grade.rs} | 2 +- .../assignment06/semiring_grade.rs | 2 +- .../assignment06/square_matrix_grade.rs | 2 +- .../symbolic_differentiation_grade.rs | 2 +- .../assignment07/generator_grade.rs | 2 +- src/assignments/assignment07/hubo_grade.rs | 2 +- .../assignment07/my_itertools_grade.rs | 2 +- .../assignment07/small_exercises_grade.rs | 2 +- .../assignment07/transform_grade.rs | 2 +- src/assignments/assignment08/mod.rs | 9 + .../small_problems.rs} | 7 +- .../small_problems_grade.rs} | 2 +- src/assignments/assignment09/bigint_grade.rs | 2 +- src/assignments/assignment09/matmul.rs | 6 + .../assignment09/small_exercises_grade.rs | 2 +- .../assignment10/labyrinth_grade.rs | 2 +- .../assignment10/small_exercises_grade.rs | 2 +- src/assignments/assignment11/bst.rs | 202 ------------ src/assignments/assignment11/bst_grade.rs | 53 --- .../assignment11/doubly_linked_list_grade.rs | 2 +- src/assignments/assignment11/graph_grade.rs | 2 +- src/assignments/assignment11/linked_list.rs | 140 -------- .../assignment11/linked_list_grade.rs | 122 ------- .../assignment11/mock_storage_grade.rs | 2 +- src/assignments/assignment11/mod.rs | 12 - src/assignments/assignment11/peano_nat.rs | 56 ---- .../assignment11/peano_nat_grade.rs | 38 --- .../assignment11/turing_machine.rs | 139 -------- .../assignment11/turing_machine_grade.rs | 309 ------------------ src/assignments/assignment11/tv_room_grade.rs | 2 +- src/assignments/assignment12/card_grade.rs | 3 +- src/assignments/assignment12/demux_grade.rs | 2 +- src/assignments/assignment12/funnel_grade.rs | 2 +- .../assignment12/small_exercises_grade.rs | 2 +- src/assignments/assignment13/mod.rs | 10 + .../small_problems.rs} | 13 +- .../small_problems_grade.rs} | 4 +- src/assignments/mod.rs | 3 - 43 files changed, 77 insertions(+), 1122 deletions(-) rename src/assignments/{assignment01.rs => assignment01/mod.rs} (58%) create mode 100644 src/assignments/assignment01/small_problems.rs rename src/assignments/{assignment01_grade.rs => assignment01/small_problems_grade.rs} (86%) create mode 100644 src/assignments/assignment08/mod.rs rename src/assignments/{assignment08.rs => assignment08/small_problems.rs} (85%) rename src/assignments/{assignment08_grade.rs => assignment08/small_problems_grade.rs} (95%) delete mode 100644 src/assignments/assignment11/bst.rs delete mode 100644 src/assignments/assignment11/bst_grade.rs delete mode 100644 src/assignments/assignment11/linked_list.rs delete mode 100644 src/assignments/assignment11/linked_list_grade.rs delete mode 100644 src/assignments/assignment11/peano_nat.rs delete mode 100644 src/assignments/assignment11/peano_nat_grade.rs delete mode 100644 src/assignments/assignment11/turing_machine.rs delete mode 100644 src/assignments/assignment11/turing_machine_grade.rs create mode 100644 src/assignments/assignment13/mod.rs rename src/assignments/{assignment13.rs => assignment13/small_problems.rs} (87%) rename src/assignments/{assignment13_grade.rs => assignment13/small_problems_grade.rs} (98%) diff --git a/scripts/grade-01.sh b/scripts/grade-01.sh index 5579366..4add88a 100755 --- a/scripts/grade-01.sh +++ b/scripts/grade-01.sh @@ -24,7 +24,7 @@ run_linters || exit 1 for RUNNER in "${RUNNERS[@]}"; do echo "Running with $RUNNER..." - TESTS=("--lib assignment01_grade") + TESTS=("--lib assignment01") if [ $(run_tests) -ne 0 ]; then exit 1 fi diff --git a/scripts/grade-08.sh b/scripts/grade-08.sh index 99b7b27..815f90d 100755 --- a/scripts/grade-08.sh +++ b/scripts/grade-08.sh @@ -24,7 +24,7 @@ run_linters || exit 1 for RUNNER in "${RUNNERS[@]}"; do echo "Running with $RUNNER..." - TESTS=("--lib assignment08_grade") + TESTS=("--lib assignment08") if [ $(run_tests) -ne 0 ]; then exit 1 fi diff --git a/scripts/grade-13.sh b/scripts/grade-13.sh index 6c180d4..c490775 100755 --- a/scripts/grade-13.sh +++ b/scripts/grade-13.sh @@ -24,7 +24,7 @@ run_linters || exit 1 for RUNNER in "${RUNNERS[@]}"; do echo "Running with $RUNNER..." - TESTS=("--lib assignment13_grade") + TESTS=("--lib assignment13") if [ $(run_tests) -ne 0 ]; then exit 1 fi diff --git a/src/assignments/assignment01.rs b/src/assignments/assignment01/mod.rs similarity index 58% rename from src/assignments/assignment01.rs rename to src/assignments/assignment01/mod.rs index 058e21a..9a022d3 100644 --- a/src/assignments/assignment01.rs +++ b/src/assignments/assignment01/mod.rs @@ -4,16 +4,9 @@ //! Please make sure you're comfortable with developing Rust programs before moving on to the next assignments. //! //! You should fill out `add()` and `sub()` function bodies in such a way that `/scripts/grade-01.sh` works fine. -//! See `assignment01_grade.rs` and `/scripts/grade-01.sh` for the test script. +//! See `small_problems_grade.rs` and `/scripts/grade-01.sh` for the test script. //! //! Hint: -/// Adds two unsigned words. If overflow happens, just wrap around. -pub fn add(lhs: usize, rhs: usize) -> usize { - todo!() -} - -/// Subtracts two unsigned words. If overflow happens, just wrap around. -pub fn sub(lhs: usize, rhs: usize) -> usize { - todo!() -} +pub mod small_problems; +mod small_problems_grade; diff --git a/src/assignments/assignment01/small_problems.rs b/src/assignments/assignment01/small_problems.rs new file mode 100644 index 0000000..aaf3727 --- /dev/null +++ b/src/assignments/assignment01/small_problems.rs @@ -0,0 +1,12 @@ +//! Assignment 1: Preparing Rust Development Environment. +//! Welcome to the CS220 course! + +/// Adds two unsigned words. If overflow happens, just wrap around. +pub fn add(lhs: usize, rhs: usize) -> usize { + todo!() +} + +/// Subtracts two unsigned words. If overflow happens, just wrap around. +pub fn sub(lhs: usize, rhs: usize) -> usize { + todo!() +} diff --git a/src/assignments/assignment01_grade.rs b/src/assignments/assignment01/small_problems_grade.rs similarity index 86% rename from src/assignments/assignment01_grade.rs rename to src/assignments/assignment01/small_problems_grade.rs index 3580df9..dbdd99e 100644 --- a/src/assignments/assignment01_grade.rs +++ b/src/assignments/assignment01/small_problems_grade.rs @@ -1,6 +1,6 @@ #[cfg(test)] mod test { - use super::super::assignment01::*; + use crate::assignments::assignment01::small_problems::*; #[test] fn test_add_7_3() { diff --git a/src/assignments/assignment06/semiring_grade.rs b/src/assignments/assignment06/semiring_grade.rs index bca3278..3b553a6 100644 --- a/src/assignments/assignment06/semiring_grade.rs +++ b/src/assignments/assignment06/semiring_grade.rs @@ -1,6 +1,6 @@ #[cfg(test)] mod test { - use super::super::semiring::*; + use crate::assignments::assignment06::semiring::*; use ntest::assert_about_eq; fn test_from_str(s: &str, f: impl Fn(i64) -> i64) { diff --git a/src/assignments/assignment06/square_matrix_grade.rs b/src/assignments/assignment06/square_matrix_grade.rs index 7270c73..2ca244c 100644 --- a/src/assignments/assignment06/square_matrix_grade.rs +++ b/src/assignments/assignment06/square_matrix_grade.rs @@ -1,6 +1,6 @@ #[cfg(test)] mod test { - use super::super::square_matrix::*; + use crate::assignments::assignment06::square_matrix::*; use ntest::assert_about_eq; #[test] diff --git a/src/assignments/assignment06/symbolic_differentiation_grade.rs b/src/assignments/assignment06/symbolic_differentiation_grade.rs index 0526219..26ce172 100644 --- a/src/assignments/assignment06/symbolic_differentiation_grade.rs +++ b/src/assignments/assignment06/symbolic_differentiation_grade.rs @@ -1,6 +1,6 @@ #[cfg(test)] mod test { - use super::super::symbolic_differentiation::*; + use crate::assignments::assignment06::symbolic_differentiation::*; use ntest::assert_about_eq; // Constant rationals to use diff --git a/src/assignments/assignment07/generator_grade.rs b/src/assignments/assignment07/generator_grade.rs index 5ff51d7..6ac4323 100644 --- a/src/assignments/assignment07/generator_grade.rs +++ b/src/assignments/assignment07/generator_grade.rs @@ -3,7 +3,7 @@ mod test { use itertools::Itertools; use ntest::assert_about_eq; - use super::super::generator::*; + use crate::assignments::assignment07::generator::*; #[test] fn test_generator() { diff --git a/src/assignments/assignment07/hubo_grade.rs b/src/assignments/assignment07/hubo_grade.rs index 50a636a..e67fec3 100644 --- a/src/assignments/assignment07/hubo_grade.rs +++ b/src/assignments/assignment07/hubo_grade.rs @@ -3,7 +3,7 @@ mod test { use itertools::Itertools; use ntest::assert_about_eq; - use super::super::hubo::*; + use crate::assignments::assignment07::hubo::*; #[test] fn test_hubo_dir4_movement() { diff --git a/src/assignments/assignment07/my_itertools_grade.rs b/src/assignments/assignment07/my_itertools_grade.rs index 9e9e061..d6e5111 100644 --- a/src/assignments/assignment07/my_itertools_grade.rs +++ b/src/assignments/assignment07/my_itertools_grade.rs @@ -3,7 +3,7 @@ mod test { use itertools::Itertools; use ntest::assert_about_eq; - use super::super::my_itertools::*; + use crate::assignments::assignment07::my_itertools::*; #[test] fn test_itertools() { diff --git a/src/assignments/assignment07/small_exercises_grade.rs b/src/assignments/assignment07/small_exercises_grade.rs index fced451..841d811 100644 --- a/src/assignments/assignment07/small_exercises_grade.rs +++ b/src/assignments/assignment07/small_exercises_grade.rs @@ -3,7 +3,7 @@ mod test { use itertools::Itertools; use ntest::assert_about_eq; - use super::super::small_exercises::*; + use crate::assignments::assignment07::small_exercises::*; #[test] fn test_find() { diff --git a/src/assignments/assignment07/transform_grade.rs b/src/assignments/assignment07/transform_grade.rs index 7fb7870..4355964 100644 --- a/src/assignments/assignment07/transform_grade.rs +++ b/src/assignments/assignment07/transform_grade.rs @@ -3,7 +3,7 @@ mod test { use itertools::Itertools; use ntest::assert_about_eq; - use super::super::transform::*; + use crate::assignments::assignment07::transform::*; #[test] fn test_transform_identity() { diff --git a/src/assignments/assignment08/mod.rs b/src/assignments/assignment08/mod.rs new file mode 100644 index 0000000..8bf6f8c --- /dev/null +++ b/src/assignments/assignment08/mod.rs @@ -0,0 +1,9 @@ +//! Assignment 8: First-class functions. +//! +//! The primary goal of this assignment is to get used to first-class functions. +//! +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-08.sh` works fine. +//! See `small_problems_grade.rs` and `/scripts/grade-08.sh` for the test script. + +pub mod small_problems; +mod small_problems_grade; diff --git a/src/assignments/assignment08.rs b/src/assignments/assignment08/small_problems.rs similarity index 85% rename from src/assignments/assignment08.rs rename to src/assignments/assignment08/small_problems.rs index d6ce58d..829d5a7 100644 --- a/src/assignments/assignment08.rs +++ b/src/assignments/assignment08/small_problems.rs @@ -1,9 +1,4 @@ -//! Assignment 8: First-class functions. -//! -//! The primary goal of this assignment is to get used to first-class functions. -//! -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-08.sh` works fine. -//! See `assignment08_grade.rs` and `/scripts/grade-08.sh` for the test script. +//! Assignment 08: First-class functions. /// Repeat /// diff --git a/src/assignments/assignment08_grade.rs b/src/assignments/assignment08/small_problems_grade.rs similarity index 95% rename from src/assignments/assignment08_grade.rs rename to src/assignments/assignment08/small_problems_grade.rs index bce3398..2549b0c 100644 --- a/src/assignments/assignment08_grade.rs +++ b/src/assignments/assignment08/small_problems_grade.rs @@ -1,6 +1,6 @@ #[cfg(test)] mod test { - use super::super::assignment08::*; + use crate::assignments::assignment08::small_problems::*; #[test] fn test_repeat() { diff --git a/src/assignments/assignment09/bigint_grade.rs b/src/assignments/assignment09/bigint_grade.rs index a707026..02be492 100644 --- a/src/assignments/assignment09/bigint_grade.rs +++ b/src/assignments/assignment09/bigint_grade.rs @@ -3,7 +3,7 @@ mod test { use ntest::{assert_false, assert_true}; - use super::super::bigint::*; + use crate::assignments::assignment09::bigint::*; #[test] fn test_inf_prec_simple() { diff --git a/src/assignments/assignment09/matmul.rs b/src/assignments/assignment09/matmul.rs index 273742b..dd21a25 100644 --- a/src/assignments/assignment09/matmul.rs +++ b/src/assignments/assignment09/matmul.rs @@ -20,6 +20,9 @@ pub fn vec_add(lhs: &[f64], rhs: &[f64]) -> Vec { /// dot product of two arrays /// +/// You don't know how to calculate dot product? +/// See +/// /// # Exmaple /// /// ``` @@ -37,6 +40,9 @@ pub fn dot_product(lhs: &[f64], rhs: &[f64]) -> f64 { /// Matrix multiplication /// +/// You don't know how to multiply matrix? +/// Quite simple! See +/// /// Assume rhs is transposed /// - lhs: (m, n) /// - rhs: (p, n) diff --git a/src/assignments/assignment09/small_exercises_grade.rs b/src/assignments/assignment09/small_exercises_grade.rs index efeeb10..be4e085 100644 --- a/src/assignments/assignment09/small_exercises_grade.rs +++ b/src/assignments/assignment09/small_exercises_grade.rs @@ -3,7 +3,7 @@ mod test { use ntest::{assert_false, assert_true}; - use super::super::small_exercises::*; + use crate::assignments::assignment09::small_exercises::*; #[test] fn test_is_fibonacci() { diff --git a/src/assignments/assignment10/labyrinth_grade.rs b/src/assignments/assignment10/labyrinth_grade.rs index a7fa5a1..934e5ae 100644 --- a/src/assignments/assignment10/labyrinth_grade.rs +++ b/src/assignments/assignment10/labyrinth_grade.rs @@ -3,7 +3,7 @@ mod test { use rand::seq::SliceRandom; use rand::thread_rng; - use super::super::labyrinth::*; + use crate::assignments::assignment10::labyrinth::*; type Wife = usize; type Rooms = Vec; diff --git a/src/assignments/assignment10/small_exercises_grade.rs b/src/assignments/assignment10/small_exercises_grade.rs index e1d1e54..8cbc96f 100644 --- a/src/assignments/assignment10/small_exercises_grade.rs +++ b/src/assignments/assignment10/small_exercises_grade.rs @@ -2,7 +2,7 @@ mod test { use std::collections::HashSet; - use super::super::small_exercises::*; + use crate::assignments::assignment10::small_exercises::*; #[test] fn test_inversion() { diff --git a/src/assignments/assignment11/bst.rs b/src/assignments/assignment11/bst.rs deleted file mode 100644 index 8d78a57..0000000 --- a/src/assignments/assignment11/bst.rs +++ /dev/null @@ -1,202 +0,0 @@ -//! Binary Search Tree -//! -//! Refer `bst_grade.rs` for test cases. - -use std::cell::RefCell; -use std::cmp::Ordering; -use std::fmt::Debug; -use std::ops::Deref; -use std::rc::{Rc, Weak}; - -/// Node struct of tree -#[derive(Debug, Clone)] -struct Node -where - T: Ord, -{ - value: T, - parent: Option>>>, - left: Option>>>, - right: Option>>>, -} - -impl Node -where - T: Ord, -{ - fn new(value: T) -> Rc>> { - Rc::new(RefCell::new(Node { - value, - parent: None, - left: None, - right: None, - })) - } - - fn with_parent(value: T, parent: Weak>>) -> Rc>> { - Rc::new(RefCell::new(Node { - value, - parent: Some(parent), - left: None, - right: None, - })) - } - - /// Minimum node starting from cursor - fn min_node(mut cursor: Rc>>) -> Rc>> { - todo!(); - } - - /// Upgraded parent node. - /// `None` if the node has no parent. - fn parent(&self) -> Option>>> { - self.parent.as_ref().and_then(|p| p.upgrade()) - } -} - -/// Binary Search Tree -#[derive(Debug)] -pub struct Tree -where - T: Ord, -{ - root: Option>>>, - len: usize, -} - -impl Default for Tree { - fn default() -> Self { - Self::new() - } -} - -impl Tree -where - T: Ord, -{ - /// New tree - pub fn new() -> Tree { - Tree { root: None, len: 0 } - } - - /// Length of the tree - pub fn len(&self) -> usize { - self.len - } - - /// Check if the tree is empty. - pub fn is_empty(&self) -> bool { - self.len == 0 - } - - /// Check if the tree contains the value. - pub fn contains(&self, value: &T) -> bool { - if let Some(mut cursor) = self.root.clone() { - todo!(); - } else { - false - } - } - - /// Insert the value into the tree. - /// If there was no equal value in the tree, it returns `true`. - /// Otherwise, it returns `false`. - pub fn insert(&mut self, value: T) -> bool { - self.len += 1; - if let Some(mut cursor) = self.root.clone() { - todo!(); - } else { - self.root = Some(Node::new(value)); - true - } - } - - /// Remove the node from the tree. - /// Returns the value of the removed node. - fn remove_node(&mut self, mut node: Rc>>) -> T { - todo!(); - } - - /// Remove the value from the tree. - /// If there is an equal value in the tree, it returns `true`. - /// Otherwise, it returns `false`. - pub fn remove(&mut self, value: &T) -> Option { - let res = if let Some(root) = self.root.clone() { - let mut cursor = root; - - loop { - let mut cursor_ref = cursor.deref().borrow_mut(); - let child = match value.cmp(&cursor_ref.value) { - Ordering::Less => cursor_ref.left.clone(), - Ordering::Greater => cursor_ref.right.clone(), - Ordering::Equal => { - drop(cursor_ref); - break Some(self.remove_node(cursor)); - } - }; - - if let Some(child) = child { - drop(cursor_ref); - cursor = child; - } else { - break None; - } - } - } else { - None - }; - - self.len -= res.is_some() as usize; - res - } -} - -impl Clone for Tree -where - T: Ord + Clone, -{ - fn clone(&self) -> Self { - Tree { - root: self.root.clone(), - len: self.len, - } - } -} - -/// IntoIterator for Tree -#[derive(Debug)] -pub struct IntoIter -where - T: Ord, -{ - tree: Tree, - len: usize, -} - -impl IntoIterator for Tree -where - T: Ord, -{ - type Item = T; - type IntoIter = IntoIter; - - fn into_iter(self) -> Self::IntoIter { - let len = self.len; - IntoIter { tree: self, len } - } -} - -impl Iterator for IntoIter -where - T: Ord, -{ - type Item = T; - - fn next(&mut self) -> Option { - todo!(); - } - - fn size_hint(&self) -> (usize, Option) { - (self.len, Some(self.len)) - } -} diff --git a/src/assignments/assignment11/bst_grade.rs b/src/assignments/assignment11/bst_grade.rs deleted file mode 100644 index 40b82cb..0000000 --- a/src/assignments/assignment11/bst_grade.rs +++ /dev/null @@ -1,53 +0,0 @@ -//! Test cases for assignment11/bst.rs - -#[cfg(test)] -mod test_bst { - use super::super::bst::*; - - #[test] - fn bst_insert_test() { - let mut tree = Tree::new(); - - let _ = tree.insert(1); - let _ = tree.insert(5); - let _ = tree.insert(3); - let _ = tree.insert(7); - - assert_eq!(tree.into_iter().collect::>(), vec![1, 3, 5, 7]); - } - - #[test] - fn bst_remove_test() { - let mut tree = Tree::new(); - - let _ = tree.insert(1); - let _ = tree.insert(5); - let _ = tree.insert(3); - let _ = tree.insert(7); - let _ = tree.remove(&7); - - assert_eq!(tree.into_iter().collect::>(), vec![1, 3, 5]); - } - - #[test] - fn bst_complex_test() { - let mut tree = Tree::new(); - - let _ = tree.insert(1); - let _ = tree.insert(5); - let _ = tree.insert(3); - let _ = tree.insert(7); - let _ = tree.remove(&7); - let _ = tree.insert(7); - let _ = tree.insert(6); - let _ = tree.insert(8); - let _ = tree.remove(&5); - let _ = tree.remove(&1); - let _ = tree.remove(&3); - let _ = tree.remove(&7); - let _ = tree.remove(&6); - let _ = tree.remove(&8); - - assert_eq!(tree.into_iter().collect::>(), vec![]); - } -} diff --git a/src/assignments/assignment11/doubly_linked_list_grade.rs b/src/assignments/assignment11/doubly_linked_list_grade.rs index 0827f11..ebdc19a 100644 --- a/src/assignments/assignment11/doubly_linked_list_grade.rs +++ b/src/assignments/assignment11/doubly_linked_list_grade.rs @@ -2,7 +2,7 @@ #[cfg(test)] mod test_doubly_linked_list { - use super::super::doubly_linked_list::*; + use crate::assignments::assignment11::doubly_linked_list::*; #[test] fn test_works() { diff --git a/src/assignments/assignment11/graph_grade.rs b/src/assignments/assignment11/graph_grade.rs index fcdac3b..4949ea4 100644 --- a/src/assignments/assignment11/graph_grade.rs +++ b/src/assignments/assignment11/graph_grade.rs @@ -2,7 +2,7 @@ #[cfg(test)] mod test_graph { - use super::super::graph::*; + use crate::assignments::assignment11::graph::*; #[test] fn test_graph() { diff --git a/src/assignments/assignment11/linked_list.rs b/src/assignments/assignment11/linked_list.rs deleted file mode 100644 index 161a7a4..0000000 --- a/src/assignments/assignment11/linked_list.rs +++ /dev/null @@ -1,140 +0,0 @@ -//! Singly linked list. -//! -//! Consult . - -use std::fmt::Debug; - -/// Node of the list. -#[derive(Debug)] -pub struct Node { - /// Value of current node. - pub value: T, - - /// Pointer to the next node. If it is `None`, there is no next node. - pub next: Option>>, -} - -impl Node { - /// Creates a new node. - pub fn new(value: T) -> Self { - Self { value, next: None } - } -} - -/// A singly-linked list. -#[derive(Debug)] -pub struct SinglyLinkedList { - /// Head node of the list. If it is `None`, the list is empty. - head: Option>, -} - -impl Default for SinglyLinkedList { - fn default() -> Self { - Self::new() - } -} - -impl SinglyLinkedList { - /// Creates a new list. - pub fn new() -> Self { - Self { head: None } - } - - /// Adds the given node to the front of the list. - pub fn push_front(&mut self, value: T) { - todo!() - } - - /// Adds the given node to the back of the list. - pub fn push_back(&mut self, value: T) { - todo!() - } - - /// Removes and returns the node at the front of the list. - pub fn pop_front(&mut self) -> Option { - todo!() - } - - /// Removes and returns the node at the back of the list. - pub fn pop_back(&mut self) -> Option { - todo!() - } - - /// Create a new list from the given vector `vec`. - pub fn from_vec(vec: Vec) -> Self { - todo!() - } - - /// Convert the current list into a vector. - pub fn as_vec(&self) -> Vec { - todo!() - } - - /// Return the length (i.e., number of nodes) of the list. - pub fn length(&self) -> usize { - todo!() - } - - /// Apply function `f` on every element of the list. - /// - /// # Examples - /// - /// `self`: `[1, 2]`, `f`: `|x| x + 1` ==> `[2, 3]` - pub fn map T>(&mut self, f: F) { - todo!() - } - - /// Insert given list `another` at the specified index `idx`. - /// If `idx` is out-of-bound of `self`, append `another` at the end of `self`. - /// - /// # Examples - /// - /// `self`: `[1, 2]`, `another`: `[3, 4]`, `idx`: `1` ==> `[1, 3, 4, 2]` - /// `self`: `[1, 2]`, `another`: `[3, 4]`, `idx`: `5` ==> `[1, 2, 3, 4]` - pub fn insert(&mut self, another: &Self, idx: usize) { - todo!() - } - - /// Reverse the list in a chunk of size `n`. - /// If `n == 0`, do nothing. - /// - /// # Examples - /// - /// `self`: `[1, 2, 3, 4, 5, 6, 7, 8, 9]`, `n`: `3` - /// // each chunk of size `3`: `[1, 2, 3]`, `[4, 5, 6]`, `[7, 8, 9]` - /// // reversed sequence of chunks: `[7, 8, 9]`, `[4, 5, 6]`, `[1, 2, 3]` - /// ==> `[7, 8, 9, 4, 5, 6, 1, 2, 3]`, - /// - /// `self`: `[1, 2, 3, 4, 5, 6, 7, 8, 9]`, `n`: `4` - /// // each chunk of size `4`: `[1, 2, 3, 4]`, `[5, 6, 7, 8]`, `[9]` - /// // reversed sequence of chunks: `[9]`, `[5, 6, 7, 8]`, `[1, 2, 3, 4]` - /// ==> `[9, 5, 6, 7, 8, 1, 2, 3, 4]` - pub fn chunk_reverse(&mut self, n: usize) { - todo!() - } - - /// Apply given function `f` for each adjacent pair of elements in the list. - /// If `self.length() < 2`, do nothing. - /// - /// # Examples - /// - /// `self`: `[1, 2, 3, 4]`, `f`: `|x, y| x + y` - /// // each adjacent pair of elements: `(1, 2)`, `(2, 3)`, `(3, 4)` - /// // apply `f` to each pair: `f(1, 2) == 3`, `f(2, 3) == 5`, `f(3, 4) == 7` - /// ==> `[3, 5, 7]` - pub fn pair_map T>(&mut self, f: F) { - todo!() - } -} - -// A list of lists. -impl SinglyLinkedList> { - /// Flatten the list of lists into a single list. - /// - /// # Examples - /// `self`: `[[1, 2, 3], [4, 5, 6], [7, 8]]` - /// ==> `[1, 2, 3, 4, 5, 6, 7, 8]` - pub fn flatten(self) -> SinglyLinkedList { - todo!() - } -} diff --git a/src/assignments/assignment11/linked_list_grade.rs b/src/assignments/assignment11/linked_list_grade.rs deleted file mode 100644 index 6805972..0000000 --- a/src/assignments/assignment11/linked_list_grade.rs +++ /dev/null @@ -1,122 +0,0 @@ -#[cfg(test)] -mod test_linked_list { - use crate::assignments::assignment11::linked_list::*; - - #[derive(Debug, PartialEq, Eq)] - struct V(usize); - - #[test] - fn test_push_pop() { - let mut list = SinglyLinkedList::new(); - list.push_back(V(3)); - list.push_front(V(2)); - list.push_back(V(4)); - list.push_front(V(1)); - list.push_back(V(5)); - - assert_eq!(list.pop_front(), Some(V(1))); - assert_eq!(list.pop_back(), Some(V(5))); - assert_eq!(list.pop_front(), Some(V(2))); - assert_eq!(list.pop_back(), Some(V(4))); - assert_eq!(list.pop_front(), Some(V(3))); - assert_eq!(list.pop_back(), None); - assert_eq!(list.pop_front(), None); - } - - #[test] - fn test_from_as_vec() { - assert_eq!(SinglyLinkedList::::new().as_vec(), vec![]); - assert_eq!( - SinglyLinkedList::from_vec(vec![1, 2, 3]).as_vec(), - vec![1, 2, 3] - ); - } - - #[test] - fn test_length() { - let list = SinglyLinkedList::from_vec(vec![1, 2, 3]); - assert_eq!(list.length(), 3); - } - - #[test] - fn test_map() { - let mut list = SinglyLinkedList::from_vec(vec![1, 2, 3]); - let incr = |x: i32| x + 1; - list.map(incr); - assert_eq!(list.as_vec(), vec![2, 3, 4]); - } - - #[test] - fn test_insert() { - let mut list1 = SinglyLinkedList::from_vec(vec![1, 2, 3]); - let mut list2 = SinglyLinkedList::from_vec(vec![1, 2, 3]); - let mut list3 = SinglyLinkedList::from_vec(vec![1, 2, 3]); - let list4 = SinglyLinkedList::from_vec(vec![4, 5, 6]); - - list1.insert(&list4, 0); - assert_eq!(list1.as_vec(), vec![4, 5, 6, 1, 2, 3]); - - list2.insert(&list4, 1); - assert_eq!(list2.as_vec(), vec![1, 4, 5, 6, 2, 3]); - - list3.insert(&list4, 4); - assert_eq!(list3.as_vec(), vec![1, 2, 3, 4, 5, 6]); - } - - #[test] - fn test_chunk_reverse() { - let mut list1 = SinglyLinkedList::from_vec(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]); - list1.chunk_reverse(3); - assert_eq!(list1.as_vec(), vec![7, 8, 9, 3, 4, 5, 1, 2, 3]); - - let mut list2 = SinglyLinkedList::from_vec(vec![1, 2, 3, 4, 5, 6, 7, 8]); - list2.chunk_reverse(3); - assert_eq!(list2.as_vec(), vec![7, 8, 4, 5, 6, 1, 2, 3]); - - let mut list3 = SinglyLinkedList::from_vec(vec![1, 2, 3]); - list3.chunk_reverse(4); - assert_eq!(list3.as_vec(), vec![1, 2, 3]); - - let mut list4 = SinglyLinkedList::from_vec(vec![1, 2, 3, 4]); - list4.chunk_reverse(1); - assert_eq!(list4.as_vec(), vec![4, 3, 2, 1]); - - let mut list5 = SinglyLinkedList::from_vec(vec![1, 2, 3, 4]); - list4.chunk_reverse(0); - assert_eq!(list4.as_vec(), vec![1, 2, 3, 4]); - } - - #[test] - fn test_pair_map() { - let mut list = SinglyLinkedList::from_vec(vec![1, 2, 3, 4, 5, 6, 7, 8, 9]); - let add = |x: i32, y: i32| x + y; - - list.pair_map(add); - assert_eq!(list.as_vec(), vec![3, 5, 7, 9, 11, 13, 15, 17]); - - list.pair_map(add); - assert_eq!(list.as_vec(), vec![8, 12, 16, 20, 24, 28, 32]); - - list.pair_map(add); - assert_eq!(list.as_vec(), vec![20, 28, 36, 44, 52, 60]); - - list.pair_map(add); - assert_eq!(list.as_vec(), vec![48, 64, 80, 96, 112]); - } - - #[test] - fn test_flatten() { - let list1 = SinglyLinkedList::from_vec(vec![1, 2]); - let list2 = SinglyLinkedList::from_vec(vec![3]); - let list3 = SinglyLinkedList::from_vec(vec![4, 5, 6, 7]); - let list4 = SinglyLinkedList::::new(); - let list5 = SinglyLinkedList::from_vec(vec![8, 9, 10]); - - let list_list = SinglyLinkedList::from_vec(vec![list1, list2, list3, list4, list5]); - - assert_eq!( - list_list.flatten().as_vec(), - vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10] - ); - } -} diff --git a/src/assignments/assignment11/mock_storage_grade.rs b/src/assignments/assignment11/mock_storage_grade.rs index b8e62d3..97d05aa 100644 --- a/src/assignments/assignment11/mock_storage_grade.rs +++ b/src/assignments/assignment11/mock_storage_grade.rs @@ -2,7 +2,7 @@ #[cfg(test)] mod test_mock_storage { - use super::super::mock_storage::*; + use crate::assignments::assignment11::mock_storage::*; #[test] fn test_mock_storage() { diff --git a/src/assignments/assignment11/mod.rs b/src/assignments/assignment11/mod.rs index 53dacb5..be8f452 100644 --- a/src/assignments/assignment11/mod.rs +++ b/src/assignments/assignment11/mod.rs @@ -4,15 +4,6 @@ //! See `assignment11_grade.rs` and `/scripts/grade-11.sh` for the test script. //! Run `/scripts/prepare-submissions.sh` and submit `/target/assignment11.zip` to . -pub mod linked_list; -mod linked_list_grade; - -pub mod peano_nat; -mod peano_nat_grade; - -pub mod bst; -mod bst_grade; - pub mod doubly_linked_list; mod doubly_linked_list_grade; @@ -24,6 +15,3 @@ pub mod mock_storage_grade; pub mod tv_room; pub mod tv_room_grade; - -pub mod turing_machine; -pub mod turing_machine_grade; diff --git a/src/assignments/assignment11/peano_nat.rs b/src/assignments/assignment11/peano_nat.rs deleted file mode 100644 index c79ab3c..0000000 --- a/src/assignments/assignment11/peano_nat.rs +++ /dev/null @@ -1,56 +0,0 @@ -//! Peano natural number. - -/// We can represent any natural number using only two symbols: 0 and S. -/// -/// E.g. -/// O == 0 -/// S(O) == 1 -/// S(S(O)) == 2 -/// ... so on. -#[derive(Debug, Clone, PartialEq)] -pub enum Nat { - /// Zero - O, - /// Plus one - S(Box), -} - -impl Nat { - /// Create `Nat` from `usize` - pub fn from_usize(n: usize) -> Nat { - todo!() - } - - /// Convert `Nat` into nonnegative integer - pub fn as_usize(&self) -> usize { - todo!() - } -} - -// Implement `Add` operator (i.e. `+`) for `Nat`. -impl std::ops::Add for Nat { - type Output = Nat; - - fn add(self, rhs: Self) -> Self::Output { - todo!() - } -} - -// Implement `Sub` operator (i.e. `-`) for `Nat`. -// If the result is negative, return `Nat::O`. -impl std::ops::Sub for Nat { - type Output = Nat; - - fn sub(self, rhs: Self) -> Self::Output { - todo!() - } -} - -// Implement `Mul` operator (i.e. `*`) for `Nat`. -impl std::ops::Mul for Nat { - type Output = Nat; - - fn mul(self, rhs: Self) -> Self::Output { - todo!() - } -} diff --git a/src/assignments/assignment11/peano_nat_grade.rs b/src/assignments/assignment11/peano_nat_grade.rs deleted file mode 100644 index edada7f..0000000 --- a/src/assignments/assignment11/peano_nat_grade.rs +++ /dev/null @@ -1,38 +0,0 @@ -#[cfg(test)] -mod test_peano_nat { - use crate::assignments::assignment11::peano_nat::*; - - #[test] - fn test_from_as_usize() { - assert_eq!(Nat::from_usize(0), Nat::O); - assert_eq!( - Nat::from_usize(2), - Nat::S(Box::new(Nat::S(Box::new(Nat::O)))) - ); - - for n in 0..100 { - assert_eq!(Nat::from_usize(n).as_usize(), n); - } - } - - fn safe_sub(i: usize, j: usize) -> usize { - if i > j { - i - j - } else { - 0 - } - } - - #[test] - fn test_add_sub_mul() { - for i in 0..30 { - let n = Nat::from_usize(i); - for j in 0..30 { - let m = Nat::from_usize(j); - assert_eq!((n.clone() + m.clone()).as_usize(), i + j); - assert_eq!((n.clone() - m.clone()).as_usize(), safe_sub(i, j)); - assert_eq!((n.clone() * m.clone()).as_usize(), i * j); - } - } - } -} diff --git a/src/assignments/assignment11/turing_machine.rs b/src/assignments/assignment11/turing_machine.rs deleted file mode 100644 index 438f30a..0000000 --- a/src/assignments/assignment11/turing_machine.rs +++ /dev/null @@ -1,139 +0,0 @@ -//! Simple Turing machien emulator -//! -//! Simple One-head, One-tape turing machine -//! See that describes what turing machine is. -//! See `test_turing_machine` module in `assignment11_grade.rs` for examples. -//! -//! Goal: To be accustomed with `RefCell`, `HashMap` -//! -//! Refer `turing_machine.rs` for test cases. - -use std::cell::RefCell; -use std::collections::HashMap; -use std::fmt::{self, Formatter}; -use thiserror::Error; - -/// Error type for Turing machine -/// -#[derive(Debug, Error, PartialEq, Eq)] -pub enum TuringMachineError { - /// Invalid movement - /// You can't move left from the leftmost location - /// or move right from the rightmost location. - #[error("Invalid movement")] - InvalidMovement, - - /// Exceeded maximum steps - #[error("Exceeded maximum steps")] - ExceedMaxSteps, - - /// Invalid state or value - /// Occurs when you cannot find instruction for the current state and value - #[error("Invalid state or value")] - InvalidStateOrValue, -} - -/// Turing Machine implementation -#[derive(Debug)] -pub struct TuringMachine -where - TMState: Default + Eq + PartialEq + std::hash::Hash + Clone, - TMValue: Eq + PartialEq + std::hash::Hash + Clone, -{ - /// Number of steps taken by the Turing machine - pub steps: RefCell, - - /// Table of instructions for the Turing machine - pub table: HashMap<(TMState, TMValue), (TMState, Move, TMValue)>, - - /// Tape of the Turing machine. Finite length - pub tape: Vec>, -} - -/// Implementation of the movement instructions of the head of the tape. -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub enum Move { - /// Move Left - L, - /// Move Right - R, - /// Don't move - N, -} - -/// Cursor for Turing machine -#[derive(Debug)] -pub struct Cursor<'a, TMState, TMValue> -where - TMState: Default + Eq + PartialEq + std::hash::Hash + Clone, - TMValue: Eq + PartialEq + std::hash::Hash + Clone, -{ - // Turing mahcine - tm: &'a TuringMachine, - // Index of the tape - index: usize, - // Current state of the Turing machine - state: TMState, -} - -impl<'a, TMState, TMValue> Cursor<'a, TMState, TMValue> -where - TMState: Default + Eq + PartialEq + std::hash::Hash + Clone, - TMValue: Eq + PartialEq + std::hash::Hash + Clone, -{ - /// Generate new cursor - pub fn new(tm: &'a TuringMachine, state: TMState, index: usize) -> Self { - Cursor { tm, index, state } - } - - /// Run the Turing machine until it halts (if it halts). Print every step of that. - pub fn run(&mut self, max_step: usize) -> Result<(TMValue, usize), TuringMachineError> { - let mut steps = self.tm.steps.borrow_mut(); - while self.state != TMState::default() { - *steps += 1; - if *steps > max_step { - return Err(TuringMachineError::ExceedMaxSteps); - } - self.step()?; - // println!("{}", self); - } - Ok((self.get(), *steps)) - } - - /// Set tape value at the current index with `value` - /// You may need this function for `mov` function - fn set(&mut self, value: TMValue) -> TMValue { - todo!(); - } - - /// Step the Turing machine - /// Look at the `run` function to see how this function is used. - fn step(&mut self) -> Result<(), TuringMachineError> { - todo!(); - } - - /// Move the cursor while setting the value of the current index - fn mov(&mut self, new_value: TMValue, movement: &Move) -> Result<(), TuringMachineError> { - todo!(); - } - - /// Get the value of the current index - /// Look at the `run` function to see how this function is used. - fn get(&self) -> TMValue { - todo!(); - } -} - -impl TuringMachine -where - TMState: Default + Eq + PartialEq + std::hash::Hash + Clone, - TMValue: Eq + PartialEq + std::hash::Hash + Clone, -{ - /// Generate new Turing machine - pub fn new( - table: HashMap<(TMState, TMValue), (TMState, Move, TMValue)>, - tape: Vec>, - ) -> Self { - todo!() - } -} diff --git a/src/assignments/assignment11/turing_machine_grade.rs b/src/assignments/assignment11/turing_machine_grade.rs deleted file mode 100644 index 89b617b..0000000 --- a/src/assignments/assignment11/turing_machine_grade.rs +++ /dev/null @@ -1,309 +0,0 @@ -//! Test cases for assignment11/turing_machine.rs - -#[cfg(test)] -mod test_turing_machine { - use super::super::turing_machine::*; - use std::cell::RefCell; - use std::collections::HashMap; - - #[test] - fn test_invalid_movement() { - /// Cell value of the tape - #[derive(Debug, Clone, Hash, Eq, PartialEq)] - enum TMValue { - /// Zero - Zero, - - /// One - One, - } - - /// State for Turing machine - /// TODO: Modify this so that users can implement their own state - #[derive(Default, Debug, Eq, PartialEq, Hash, Clone)] - enum TMState { - /// Halt - #[default] - Halt, - - /// A - A, - - /// B - B, - } - - let tape: Vec> = vec![ - TMValue::One, - TMValue::Zero, - TMValue::One, - TMValue::One, - TMValue::One, - TMValue::Zero, - TMValue::One, - ] - .into_iter() - .map(|x| RefCell::new(x)) - .collect(); - - let instr = HashMap::from([ - ( - (TMState::A, TMValue::Zero), - (TMState::B, Move::R, TMValue::One), - ), - ( - (TMState::A, TMValue::One), - (TMState::B, Move::L, TMValue::Zero), - ), - ( - (TMState::B, TMValue::Zero), - (TMState::A, Move::L, TMValue::One), - ), - ( - (TMState::B, TMValue::One), - (TMState::A, Move::R, TMValue::Zero), - ), - ]); - - let mut tm = TuringMachine::new(instr, tape); - let mut cursor = Cursor::new(&tm, TMState::A, 0); - - let result = cursor.run(1000); - assert_eq!(result, Err(TuringMachineError::InvalidMovement)); - } - - #[test] - fn test_write_15_fail_move() { - /// Cell value of the tape - #[derive(Debug, Clone, Hash, Eq, PartialEq)] - enum TMValue { - /// Zero - Zero, - - /// One - One, - } - - /// State for Turing machine - /// TODO: Modify this so that users can implement their own state - #[derive(Default, Debug, Eq, PartialEq, Hash, Clone)] - enum TMState { - /// Halt - #[default] - Halt, - - /// A - A, - - /// B - B, - } - - let tape: Vec> = vec![TMValue::Zero; 10] - .into_iter() - .map(|x| RefCell::new(x)) - .collect(); - - let instr = HashMap::from([ - ( - (TMState::A, TMValue::Zero), - (TMState::B, Move::R, TMValue::One), - ), - ( - (TMState::A, TMValue::One), - (TMState::B, Move::L, TMValue::One), - ), - ( - (TMState::B, TMValue::Zero), - (TMState::A, Move::L, TMValue::One), - ), - ( - (TMState::B, TMValue::One), - (TMState::Halt, Move::R, TMValue::One), - ), - ]); - - let mut tm = TuringMachine::new(instr, tape); - let mut cursor = Cursor::new(&tm, TMState::A, 0); - - let result = cursor.run(1000); - assert_eq!(result, Err(TuringMachineError::InvalidMovement)); - } - - #[test] - fn test_write_15_pass() { - /// Cell value of the tape - #[derive(Debug, Clone, Hash, Eq, PartialEq)] - enum TMValue { - /// Zero - Zero, - - /// One - One, - } - - /// State for Turing machine - /// TODO: Modify this so that users can implement their own state - #[derive(Default, Debug, Eq, PartialEq, Hash, Clone)] - enum TMState { - /// Halt - #[default] - Halt, - - /// A - A, - - /// B - B, - } - - let tape: Vec> = vec![TMValue::Zero; 10] - .into_iter() - .map(|x| RefCell::new(x)) - .collect(); - - let instr = HashMap::from([ - ( - (TMState::A, TMValue::Zero), - (TMState::B, Move::R, TMValue::One), - ), - ( - (TMState::A, TMValue::One), - (TMState::B, Move::L, TMValue::One), - ), - ( - (TMState::B, TMValue::Zero), - (TMState::A, Move::L, TMValue::One), - ), - ( - (TMState::B, TMValue::One), - (TMState::Halt, Move::R, TMValue::One), - ), - ]); - - let mut tm = TuringMachine::new(instr, tape); - let mut cursor = Cursor::new(&tm, TMState::A, 2); - - let result = cursor.run(1000); - for (idx, val) in tm.tape.iter().enumerate() { - if idx < 4 { - assert_eq!(*val.borrow(), TMValue::One); - } else { - assert_eq!(*val.borrow(), TMValue::Zero); - } - } - } - - #[test] - fn test_write_zero_ones_fail_step() { - /// Cell value of the tape - #[derive(Debug, Clone, Hash, Eq, PartialEq)] - enum TMValue { - /// Empty - Empty, - - /// Zero - Zero, - - /// One - One, - } - - /// State for Turing machine - /// TODO: Modify this so that users can implement their own state - #[derive(Default, Debug, Eq, PartialEq, Hash, Clone)] - enum TMState { - /// Halt - #[default] - Halt, - - /// A - A, - - /// B - B, - } - - let tape: Vec> = vec![TMValue::Empty; 100] - .into_iter() - .map(|x| RefCell::new(x)) - .collect(); - - let instr = HashMap::from([ - ( - (TMState::A, TMValue::Empty), - (TMState::B, Move::R, TMValue::Zero), - ), - ( - (TMState::B, TMValue::Empty), - (TMState::A, Move::R, TMValue::One), - ), - ]); - - let mut tm = TuringMachine::new(instr, tape); - let mut cursor = Cursor::new(&tm, TMState::A, 0); - - let result = cursor.run(10); - assert_eq!(result, Err(TuringMachineError::ExceedMaxSteps)); - } - - #[test] - fn test_write_zero_ones() { - /// Cell value of the tape - #[derive(Debug, Clone, Hash, Eq, PartialEq)] - enum TMValue { - /// Empty - Empty, - - /// Zero - Zero, - - /// One - One, - } - - /// State for Turing machine - /// TODO: Modify this so that users can implement their own state - #[derive(Default, Debug, Eq, PartialEq, Hash, Clone)] - enum TMState { - /// Halt - #[default] - Halt, - - /// A - A, - - /// B - B, - } - - let tape: Vec> = vec![TMValue::Empty; 100] - .into_iter() - .map(|x| RefCell::new(x)) - .collect(); - - let instr = HashMap::from([ - ( - (TMState::A, TMValue::Empty), - (TMState::B, Move::R, TMValue::Zero), - ), - ( - (TMState::B, TMValue::Empty), - (TMState::A, Move::R, TMValue::One), - ), - ]); - - let mut tm = TuringMachine::new(instr, tape); - let mut cursor = Cursor::new(&tm, TMState::A, 0); - - let result = cursor.run(1000); - assert_eq!(result, Err(TuringMachineError::InvalidMovement)); - for (idx, val) in tm.tape.iter().enumerate() { - if idx % 2 == 0 { - assert_eq!(*val.borrow(), TMValue::Zero); - } else { - assert_eq!(*val.borrow(), TMValue::One); - } - } - } -} diff --git a/src/assignments/assignment11/tv_room_grade.rs b/src/assignments/assignment11/tv_room_grade.rs index 63495eb..9500e1c 100644 --- a/src/assignments/assignment11/tv_room_grade.rs +++ b/src/assignments/assignment11/tv_room_grade.rs @@ -2,7 +2,7 @@ #[cfg(test)] mod test_tv_room { - use super::super::tv_room::*; + use crate::assignments::assignment11::tv_room::*; #[test] fn test_tv_room() { diff --git a/src/assignments/assignment12/card_grade.rs b/src/assignments/assignment12/card_grade.rs index 4f3ec84..f74d435 100644 --- a/src/assignments/assignment12/card_grade.rs +++ b/src/assignments/assignment12/card_grade.rs @@ -2,7 +2,8 @@ #[cfg(test)] mod test_card { - use super::super::card::*; + use crate::assignments::assignment12::card::*; + use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Barrier, Mutex}; use std::thread; diff --git a/src/assignments/assignment12/demux_grade.rs b/src/assignments/assignment12/demux_grade.rs index 66e11f7..145ff0e 100644 --- a/src/assignments/assignment12/demux_grade.rs +++ b/src/assignments/assignment12/demux_grade.rs @@ -2,7 +2,7 @@ #[cfg(test)] mod test_demux { - use super::super::demux::*; + use crate::assignments::assignment12::demux::*; use ntest::timeout; use std::sync::mpsc::channel; diff --git a/src/assignments/assignment12/funnel_grade.rs b/src/assignments/assignment12/funnel_grade.rs index 8de4b99..6672419 100644 --- a/src/assignments/assignment12/funnel_grade.rs +++ b/src/assignments/assignment12/funnel_grade.rs @@ -2,7 +2,7 @@ #[cfg(test)] mod test_funnel { - use super::super::funnel::*; + use crate::assignments::assignment12::funnel::*; use ntest::timeout; use std::sync::mpsc::channel; diff --git a/src/assignments/assignment12/small_exercises_grade.rs b/src/assignments/assignment12/small_exercises_grade.rs index e043ace..b9f59e8 100644 --- a/src/assignments/assignment12/small_exercises_grade.rs +++ b/src/assignments/assignment12/small_exercises_grade.rs @@ -2,7 +2,7 @@ #[cfg(test)] mod test_pingpong { - use super::super::small_exercises::*; + use crate::assignments::assignment12::small_exercises::*; use ntest::timeout; use std::sync::mpsc::channel; diff --git a/src/assignments/assignment13/mod.rs b/src/assignments/assignment13/mod.rs new file mode 100644 index 0000000..34b3587 --- /dev/null +++ b/src/assignments/assignment13/mod.rs @@ -0,0 +1,10 @@ +//! Assignment 13: Parallelism. +//! +//! The primary goal of this assignment is to get used to data parallelism. +//! +//! Refer to your solution for assignment 09. You will implement the parallelized version of assignment 09. +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-13.sh` works fine. +//! See `assignment13_grade.rs` and `/scripts/grade-13.sh` for the test script. + +pub mod small_problems; +mod small_problems_grade; diff --git a/src/assignments/assignment13.rs b/src/assignments/assignment13/small_problems.rs similarity index 87% rename from src/assignments/assignment13.rs rename to src/assignments/assignment13/small_problems.rs index 1ee00f0..893bba0 100644 --- a/src/assignments/assignment13.rs +++ b/src/assignments/assignment13/small_problems.rs @@ -1,10 +1,7 @@ //! Assignment 13: Parallelism. //! -//! The primary goal of this assignment is to get used to data parallelism. -//! -//! Refer to your solution for assignment 09. You will implement the parallelized version of assignment 09. -//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-13.sh` works fine. -//! See `assignment13_grade.rs` and `/scripts/grade-13.sh` for the test script. +//! If you did well on assignment 09, you will do well on this assignment. +//! Take it easy! use rayon::prelude::*; @@ -65,6 +62,9 @@ pub fn vec_add_par(lhs: &[f64], rhs: &[f64]) -> Vec { /// Parallel dot product of two arrays /// +/// You don't know how to calculate dot product? +/// See +/// /// # Exmaple /// /// ``` @@ -82,6 +82,9 @@ pub fn dot_product_par(lhs: &[f64], rhs: &[f64]) -> f64 { /// Parallel Matrix multiplication /// +/// You don't know how to multiply matrix? +/// Quite simple! See +/// /// Assume rhs is transposed /// - lhs: (m, n) /// - rhs: (p, n) diff --git a/src/assignments/assignment13_grade.rs b/src/assignments/assignment13/small_problems_grade.rs similarity index 98% rename from src/assignments/assignment13_grade.rs rename to src/assignments/assignment13/small_problems_grade.rs index 68c75a8..8d315ee 100644 --- a/src/assignments/assignment13_grade.rs +++ b/src/assignments/assignment13/small_problems_grade.rs @@ -1,7 +1,7 @@ #[cfg(test)] mod test { - use super::super::assignment09::matmul::*; - use super::super::assignment13::*; + use crate::assignments::assignment09::matmul::*; + use crate::assignments::assignment13::small_problems::*; use approx::*; use itertools::Itertools; use ndarray::prelude::*; diff --git a/src/assignments/mod.rs b/src/assignments/mod.rs index c490e61..93c8839 100644 --- a/src/assignments/mod.rs +++ b/src/assignments/mod.rs @@ -7,17 +7,14 @@ #![allow(unreachable_code)] pub mod assignment01; -mod assignment01_grade; pub mod assignment02; pub mod assignment03; pub mod assignment04; pub mod assignment06; pub mod assignment07; pub mod assignment08; -mod assignment08_grade; pub mod assignment09; pub mod assignment10; pub mod assignment11; pub mod assignment12; pub mod assignment13; -mod assignment13_grade;