From 183ce9ac480cecc8621be90c64aacbe093589ed2 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Fri, 8 Mar 2024 12:34:33 +0100 Subject: [PATCH] Add `matching-brackets` exercise --- .../.meta/matching_brackets.example.pl | 18 +++++++++ .../matching-brackets/matching_brackets.pl | 14 +------ .../matching_brackets_tests.plt | 40 +++++++++---------- 3 files changed, 39 insertions(+), 33 deletions(-) diff --git a/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl b/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl index e69de29b..636605d2 100644 --- a/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl +++ b/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl @@ -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), + !. \ No newline at end of file diff --git a/exercises/practice/matching-brackets/matching_brackets.pl b/exercises/practice/matching-brackets/matching_brackets.pl index 26046b37..d0ac4652 100644 --- a/exercises/practice/matching-brackets/matching_brackets.pl +++ b/exercises/practice/matching-brackets/matching_brackets.pl @@ -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). diff --git a/exercises/practice/matching-brackets/matching_brackets_tests.plt b/exercises/practice/matching-brackets/matching_brackets_tests.plt index 30ee032f..6242c5d8 100644 --- a/exercises/practice/matching-brackets/matching_brackets_tests.plt +++ b/exercises/practice/matching-brackets/matching_brackets_tests.plt @@ -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).