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 183ce9a
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
:- use_module(library(dcg/basics)).

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

balanced --> parentheses | brackets | braces, balanced.
balanced --> [].

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

paired(String) :-
string_codes(String, Codes),
exclude(non_bracket, Codes, BracketCodes),
phrase(balanced, BracketCodes),
!.
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 183ce9a

Please sign in to comment.