Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

brackets: simplify required interface #620

Merged
merged 1 commit into from
Aug 16, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 0 additions & 6 deletions exercises/bracket-push/.meta/hints.md

This file was deleted.

8 changes: 0 additions & 8 deletions exercises/bracket-push/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,6 @@ Given a string containing brackets `[]`, braces `{}`, parentheses `()`,
or any combination thereof, verify that any and all pairs are matched
and nested correctly.

# Bracket Push in Rust

Reading about these Rust topics may help you implement a solution.

- Lifetimes and Structs: https://doc.rust-lang.org/book/second-edition/ch10-03-lifetime-syntax.html#lifetime-annotations-in-method-definitions
- From trait: https://doc.rust-lang.org/std/convert/trait.From.html


## Rust Installation

Refer to the [exercism help page][help-page] for Rust installation and learning
Expand Down
12 changes: 8 additions & 4 deletions exercises/bracket-push/example.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
use std::collections::HashMap;

pub struct Brackets {
pub fn brackets_are_balanced(string: &str) -> bool {
Brackets::from(string).are_balanced()
}

struct Brackets {
raw_brackets: Vec<char>,
pairs: MatchingBrackets,
}
Expand All @@ -12,7 +16,7 @@ impl<'a> From<&'a str> for Brackets {
}

impl Brackets {
pub fn new(s: String, pairs: Option<Vec<(char, char)>>) -> Self {
fn new(s: String, pairs: Option<Vec<(char, char)>>) -> Self {
let p = match pairs {
Some(x) => MatchingBrackets::from(x),
None => MatchingBrackets::from(vec![('[', ']'), ('{', '}'), ('(', ')')]),
Expand All @@ -24,7 +28,7 @@ impl Brackets {
}
}

pub fn are_balanced(&self) -> bool {
fn are_balanced(&self) -> bool {
let mut unclosed: Vec<char> = Vec::new();

for &bracket in self.raw_brackets.iter() {
Expand All @@ -39,7 +43,7 @@ impl Brackets {
}
}

pub struct MatchingBrackets {
struct MatchingBrackets {
collection: HashMap<char, char>,
}

Expand Down
14 changes: 2 additions & 12 deletions exercises/bracket-push/src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,3 @@
pub struct Brackets;

impl<'a> From<&'a str> for Brackets {
fn from(input: &str) -> Self {
unimplemented!("From the '{}' input construct a new Brackets struct", input);
}
}

impl Brackets {
pub fn are_balanced(&self) -> bool {
unimplemented!("Check if your Brackets struct contains balanced brackets");
}
pub fn brackets_are_balanced(string: &str) -> bool {
unimplemented!("Check if the string \"{}\" contains balanced brackets", string);
}
30 changes: 15 additions & 15 deletions exercises/bracket-push/tests/bracket-push.rs
Original file line number Diff line number Diff line change
@@ -1,88 +1,88 @@
extern crate bracket_push;

use bracket_push::*;
use bracket_push::brackets_are_balanced;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

note: If the crate name were brackets, I would have wanted the name to be brackets::are_balanced to avoid repetition. However, looks like we are using bracket_push. So I think brackets_are_balanced has to be the name.

It can be worth a discussion whether to change bracket_push (why is it even called bracket-push??? exercism/problem-specifications#693 ) but this PR does not need to depend on it.


#[test]
fn paired_square_brackets() {
assert!(Brackets::from("[]").are_balanced());
assert!(brackets_are_balanced("[]"));
}

#[test]
#[ignore]
fn empty_string() {
assert!(Brackets::from("").are_balanced());
assert!(brackets_are_balanced(""));
}

#[test]
#[ignore]
fn unpaired_brackets() {
assert!(!Brackets::from("[[").are_balanced());
assert!(!brackets_are_balanced("[["));
}

#[test]
#[ignore]
fn wrong_ordered_brackets() {
assert!(!Brackets::from("}{").are_balanced());
assert!(!brackets_are_balanced("}{"));
}

#[test]
#[ignore]
fn wrong_closing_bracket() {
assert!(!Brackets::from("{]").are_balanced());
assert!(!brackets_are_balanced("{]"));
}

#[test]
#[ignore]
fn paired_with_whitespace() {
assert!(Brackets::from("{ }").are_balanced());
assert!(brackets_are_balanced("{ }"));
}

#[test]
#[ignore]
fn simple_nested_brackets() {
assert!(Brackets::from("{[]}").are_balanced());
assert!(brackets_are_balanced("{[]}"));
}

#[test]
#[ignore]
fn several_paired_brackets() {
assert!(Brackets::from("{}[]").are_balanced());
assert!(brackets_are_balanced("{}[]"));
}

#[test]
#[ignore]
fn paired_and_nested_brackets() {
assert!(Brackets::from("([{}({}[])])").are_balanced());
assert!(brackets_are_balanced("([{}({}[])])"));
}

#[test]
#[ignore]
fn unopened_closing_brackets() {
assert!(!Brackets::from("{[)][]}").are_balanced());
assert!(!brackets_are_balanced("{[)][]}"));
}

#[test]
#[ignore]
fn unpaired_and_nested_brackets() {
assert!(!Brackets::from("([{])").are_balanced());
assert!(!brackets_are_balanced("([{])"));
}

#[test]
#[ignore]
fn paired_and_wrong_nested_brackets() {
assert!(!Brackets::from("[({]})").are_balanced());
assert!(!brackets_are_balanced("[({]})"));
}

#[test]
#[ignore]
fn math_expression() {
assert!(Brackets::from("(((185 + 223.85) * 15) - 543)/2").are_balanced());
assert!(brackets_are_balanced("(((185 + 223.85) * 15) - 543)/2"));
}

#[test]
#[ignore]
fn complex_latex_expression() {
let input = "\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \
\\end{array}\\right)";
assert!(Brackets::from(input).are_balanced());
assert!(brackets_are_balanced(input));
}