Skip to content

Commit

Permalink
Add matching-brackets exercise
Browse files Browse the repository at this point in the history
  • Loading branch information
ErikSchierboom committed Mar 8, 2024
1 parent 3b73fe4 commit a59e59a
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 34 deletions.
4 changes: 3 additions & 1 deletion exercises/practice/matching-brackets/.meta/config.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
{
"authors": [],
"authors": [
"erikschierboom"
],
"files": {
"solution": [
"matching_brackets.pl"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
:- use_module(library(dcg/basics)).

parentheses --> "(", balanced, ")".
brackets --> "[", balanced, "]".
braces --> "{", balanced, "}".

balanced --> (parentheses | brackets | braces), balanced.
balanced --> non_bracket, balanced.
balanced --> [].

non_bracket --> [C], { string_codes("()[]{}", Codes), \+ member(C, Codes) }.

paired(String) :-
string_codes(String, Codes),
phrase(balanced, Codes),
!.
14 changes: 1 addition & 13 deletions exercises/practice/matching-brackets/matching_brackets.pl
Original file line number Diff line number Diff line change
@@ -1,13 +1 @@
paired([], []) :- !.
paired(['['|Chars], Opened) :- paired(Chars, ['['|Opened]).
paired([']'|Chars], ['['|Opened]) :- paired(Chars, Opened).
paired(['('|Chars], Opened) :- paired(Chars, ['('|Opened]).
paired([')'|Chars], ['('|Opened]) :- paired(Chars, Opened).
paired(['{'|Chars], Opened) :- paired(Chars, ['{'|Opened]).
paired(['}'|Chars], ['{'|Opened]) :- paired(Chars, Opened).
% paired([_|Chars], Opened) :- paired(Chars, Opened).

paired(String) :-
string_chars(String, Chars),
paired(Chars, Opened),
!.
paired(String).
40 changes: 20 additions & 20 deletions exercises/practice/matching-brackets/matching_brackets_tests.plt
Original file line number Diff line number Diff line change
Expand Up @@ -9,61 +9,61 @@ pending :-
test(paired_square_brackets, condition(true)) :-
paired("[]").

test(empty_string, condition(true)) :-
test(empty_string, condition(pending)) :-
paired("").

test(unpaired_brackets, [fail, condition(true)]) :-
test(unpaired_brackets, [fail, condition(pending)]) :-
paired("[[").

test(wrong_ordered_brackets, [fail, condition(true)]) :-
test(wrong_ordered_brackets, [fail, condition(pending)]) :-
paired("}{").

test(wrong_closing_bracket, [fail, condition(true)]) :-
test(wrong_closing_bracket, [fail, condition(pending)]) :-
paired("{]").

test(paired_with_whitespace, condition(true)) :-
test(paired_with_whitespace, condition(pending)) :-
paired("{ }").

test(partially_paired_brackets, [fail, condition(true)]) :-
test(partially_paired_brackets, [fail, condition(pending)]) :-
paired("{[])").

test(simple_nested_brackets, condition(true)) :-
test(simple_nested_brackets, condition(pending)) :-
paired("{[]}").

test(several_paired_brackets, condition(true)) :-
test(several_paired_brackets, condition(pending)) :-
paired("{}[]").

test(paired_and_nested_brackets, condition(true)) :-
test(paired_and_nested_brackets, condition(pending)) :-
paired("([{}({}[])])").

test(unopened_closing_brackets, [fail, condition(true)]) :-
test(unopened_closing_brackets, [fail, condition(pending)]) :-
paired("{[)][]}").

test(unpaired_and_nested_brackets, [fail, condition(true)]) :-
test(unpaired_and_nested_brackets, [fail, condition(pending)]) :-
paired("([{])").

test(paired_and_wrong_nested_brackets, [fail, condition(true)]) :-
test(paired_and_wrong_nested_brackets, [fail, condition(pending)]) :-
paired("[({]})").

test(paired_and_wrong_nested_brackets_but_innermost_are_correct, [fail, condition(true)]) :-
test(paired_and_wrong_nested_brackets_but_innermost_are_correct, [fail, condition(pending)]) :-
paired("[({}])").

test(paired_and_incomplete_brackets, [fail, condition(true)]) :-
test(paired_and_incomplete_brackets, [fail, condition(pending)]) :-
paired("{}[").

test(too_many_closing_brackets, [fail, condition(true)]) :-
test(too_many_closing_brackets, [fail, condition(pending)]) :-
paired("[]]").

test(early_unexpected_brackets, [fail, condition(true)]) :-
test(early_unexpected_brackets, [fail, condition(pending)]) :-
paired(")()").

test(early_mismatched_brackets, [fail, condition(true)]) :-
test(early_mismatched_brackets, [fail, condition(pending)]) :-
paired("{)()").

test(math_expression, condition(true)) :-
test(math_expression, condition(pending)) :-
paired("(((185 + 223.85) * 15) - 543)/2").

test(complex_latex_expression, condition(true)) :-
paired("\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)")
test(complex_latex_expression, condition(pending)) :-
paired("\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)").

:- end_tests(matching_brackets).

0 comments on commit a59e59a

Please sign in to comment.