From f4128fd388a5f07a4c800306f362f7c1b17a3566 Mon Sep 17 00:00:00 2001 From: Minseong Jang Date: Wed, 19 Oct 2022 17:09:23 +0900 Subject: [PATCH] Add assignment 7 --- scripts/grade-07.sh | 33 +++++++++++++++++++++++++++ src/assignments/assignment07.rs | 29 +++++++++++++++++++++++ src/assignments/assignment07_grade.rs | 27 ++++++++++++++++++++++ src/assignments/mod.rs | 2 ++ 4 files changed, 91 insertions(+) create mode 100755 scripts/grade-07.sh create mode 100644 src/assignments/assignment07.rs create mode 100644 src/assignments/assignment07_grade.rs diff --git a/scripts/grade-07.sh b/scripts/grade-07.sh new file mode 100755 index 0000000..e323e09 --- /dev/null +++ b/scripts/grade-07.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env bash + +set -e +set -uo pipefail +IFS=$'\n\t' + +# Imports library. +BASEDIR=$(dirname "$0") +source $BASEDIR/grade-utils.sh + +RUNNERS=( + "cargo" + "cargo --release" + "cargo_asan" + "cargo_asan --release" + "cargo_tsan" + "cargo_tsan --release" +) + +# Lints. +run_linters || exit 1 + +# Executes test for each runner. +for RUNNER in "${RUNNERS[@]}"; do + echo "Running with $RUNNER..." + + TESTS=("--lib assignment07_grade") + if [ $(run_tests) -ne 0 ]; then + exit 1 + fi +done + +exit 0 diff --git a/src/assignments/assignment07.rs b/src/assignments/assignment07.rs new file mode 100644 index 0000000..e1e4753 --- /dev/null +++ b/src/assignments/assignment07.rs @@ -0,0 +1,29 @@ +//! Assignment 7: Mastering advanced types (2/2). +//! +//! The primary goal of this assignment is to understand generics, traits, and lifetimes. +//! +//! You should fill out the `todo!()` placeholders in such a way that `/scripts/grade-07.sh` works fine. +//! See `assignment07_grade.rs` and `/scripts/grade-07.sh` for the test script. + +struct FindIter<'s, T: Eq> { + query: &'s [T], + base: &'s [T], + curr: usize, +} + +impl Iterator for FindIter<'_, T> { + type Item = usize; + + fn next(&mut self) -> Option { + todo!() + } +} + +/// Returns an iterator over substring query indexes in the base. +pub fn find<'s, T: Eq>(query: &'s [T], base: &'s [T]) -> impl 's + Iterator { + FindIter { + query, + base, + curr: 0, + } +} diff --git a/src/assignments/assignment07_grade.rs b/src/assignments/assignment07_grade.rs new file mode 100644 index 0000000..e000572 --- /dev/null +++ b/src/assignments/assignment07_grade.rs @@ -0,0 +1,27 @@ +#[cfg(test)] +mod test { + use super::super::assignment07::*; + + #[test] + fn test_find() { + assert_eq!( + find("abc".as_bytes(), "abcdabcd".as_bytes()).collect::>(), + vec![0, 4] + ); + + assert_eq!( + find("aaba".as_bytes(), "aabaacaadaabaaba".as_bytes()).collect::>(), + vec![0, 9, 12] + ); + + assert_eq!( + find("ababac".as_bytes(), "abababcabababcabababc".as_bytes()).collect::>(), + vec![] + ); + + assert_eq!( + find("ababc".as_bytes(), "abc".as_bytes()).collect::>(), + vec![] + ); + } +} diff --git a/src/assignments/mod.rs b/src/assignments/mod.rs index e2c01b7..5a663d6 100644 --- a/src/assignments/mod.rs +++ b/src/assignments/mod.rs @@ -13,3 +13,5 @@ pub mod assignment04; mod assignment04_grade; pub mod assignment06; mod assignment06_grade; +pub mod assignment07; +mod assignment07_grade;