From 3b73fe456daafbba9ad01a86a7fa879c798ae092 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Fri, 8 Mar 2024 11:03:19 +0100 Subject: [PATCH 1/3] Add matching brackets --- config.json | 8 +++ .../matching-brackets/.docs/instructions.md | 4 ++ .../matching-brackets/.meta/config.json | 16 +++++ .../.meta/matching_brackets.example.pl | 0 .../matching-brackets/.meta/tests.toml | 70 +++++++++++++++++++ .../matching-brackets/matching_brackets.pl | 13 ++++ .../matching_brackets_tests.plt | 69 ++++++++++++++++++ 7 files changed, 180 insertions(+) create mode 100644 exercises/practice/matching-brackets/.docs/instructions.md create mode 100644 exercises/practice/matching-brackets/.meta/config.json create mode 100644 exercises/practice/matching-brackets/.meta/matching_brackets.example.pl create mode 100644 exercises/practice/matching-brackets/.meta/tests.toml create mode 100644 exercises/practice/matching-brackets/matching_brackets.pl create mode 100644 exercises/practice/matching-brackets/matching_brackets_tests.plt diff --git a/config.json b/config.json index 92893da4..f85cc499 100644 --- a/config.json +++ b/config.json @@ -397,6 +397,14 @@ "practices": [], "prerequisites": [], "difficulty": 1 + }, + { + "slug": "matching-brackets", + "name": "Matching Brackets", + "uuid": "84170102-5a72-45e8-897d-845eebbb9297", + "practices": [], + "prerequisites": [], + "difficulty": 1 } ] }, diff --git a/exercises/practice/matching-brackets/.docs/instructions.md b/exercises/practice/matching-brackets/.docs/instructions.md new file mode 100644 index 00000000..544daa96 --- /dev/null +++ b/exercises/practice/matching-brackets/.docs/instructions.md @@ -0,0 +1,4 @@ +# Instructions + +Given a string containing brackets `[]`, braces `{}`, parentheses `()`, or any combination thereof, verify that any and all pairs are matched and nested correctly. +The string may also contain other characters, which for the purposes of this exercise should be ignored. diff --git a/exercises/practice/matching-brackets/.meta/config.json b/exercises/practice/matching-brackets/.meta/config.json new file mode 100644 index 00000000..d6e72b88 --- /dev/null +++ b/exercises/practice/matching-brackets/.meta/config.json @@ -0,0 +1,16 @@ +{ + "authors": [], + "files": { + "solution": [ + "matching_brackets.pl" + ], + "test": [ + "matching_brackets_tests.plt" + ], + "example": [ + ".meta/matching_brackets.example.pl" + ] + }, + "blurb": "Make sure the brackets and braces all match.", + "source": "Ginna Baker" +} diff --git a/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl b/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl new file mode 100644 index 00000000..e69de29b diff --git a/exercises/practice/matching-brackets/.meta/tests.toml b/exercises/practice/matching-brackets/.meta/tests.toml new file mode 100644 index 00000000..35a98a04 --- /dev/null +++ b/exercises/practice/matching-brackets/.meta/tests.toml @@ -0,0 +1,70 @@ +# This is an auto-generated file. +# +# Regenerating this file via `configlet sync` will: +# - Recreate every `description` key/value pair +# - Recreate every `reimplements` key/value pair, where they exist in problem-specifications +# - Remove any `include = true` key/value pair (an omitted `include` key implies inclusion) +# - Preserve any other key/value pair +# +# As user-added comments (using the # character) will be removed when this file +# is regenerated, comments can be added via a `comment` key. + +[81ec11da-38dd-442a-bcf9-3de7754609a5] +description = "paired square brackets" + +[287f0167-ac60-4b64-8452-a0aa8f4e5238] +description = "empty string" + +[6c3615a3-df01-4130-a731-8ef5f5d78dac] +description = "unpaired brackets" + +[9d414171-9b98-4cac-a4e5-941039a97a77] +description = "wrong ordered brackets" + +[f0f97c94-a149-4736-bc61-f2c5148ffb85] +description = "wrong closing bracket" + +[754468e0-4696-4582-a30e-534d47d69756] +description = "paired with whitespace" + +[ba84f6ee-8164-434a-9c3e-b02c7f8e8545] +description = "partially paired brackets" + +[3c86c897-5ff3-4a2b-ad9b-47ac3a30651d] +description = "simple nested brackets" + +[2d137f2c-a19e-4993-9830-83967a2d4726] +description = "several paired brackets" + +[2e1f7b56-c137-4c92-9781-958638885a44] +description = "paired and nested brackets" + +[84f6233b-e0f7-4077-8966-8085d295c19b] +description = "unopened closing brackets" + +[9b18c67d-7595-4982-b2c5-4cb949745d49] +description = "unpaired and nested brackets" + +[a0205e34-c2ac-49e6-a88a-899508d7d68e] +description = "paired and wrong nested brackets" + +[1d5c093f-fc84-41fb-8c2a-e052f9581602] +description = "paired and wrong nested brackets but innermost are correct" + +[ef47c21b-bcfd-4998-844c-7ad5daad90a8] +description = "paired and incomplete brackets" + +[a4675a40-a8be-4fc2-bc47-2a282ce6edbe] +description = "too many closing brackets" + +[a345a753-d889-4b7e-99ae-34ac85910d1a] +description = "early unexpected brackets" + +[21f81d61-1608-465a-b850-baa44c5def83] +description = "early mismatched brackets" + +[99255f93-261b-4435-a352-02bdecc9bdf2] +description = "math expression" + +[8e357d79-f302-469a-8515-2561877256a1] +description = "complex latex expression" diff --git a/exercises/practice/matching-brackets/matching_brackets.pl b/exercises/practice/matching-brackets/matching_brackets.pl new file mode 100644 index 00000000..26046b37 --- /dev/null +++ b/exercises/practice/matching-brackets/matching_brackets.pl @@ -0,0 +1,13 @@ +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), + !. diff --git a/exercises/practice/matching-brackets/matching_brackets_tests.plt b/exercises/practice/matching-brackets/matching_brackets_tests.plt new file mode 100644 index 00000000..30ee032f --- /dev/null +++ b/exercises/practice/matching-brackets/matching_brackets_tests.plt @@ -0,0 +1,69 @@ +pending :- + current_prolog_flag(argv, ['--all'|_]). +pending :- + write('\nA TEST IS PENDING!\n'), + fail. + +:- begin_tests(matching_brackets). + + test(paired_square_brackets, condition(true)) :- + paired("[]"). + + test(empty_string, condition(true)) :- + paired(""). + + test(unpaired_brackets, [fail, condition(true)]) :- + paired("[["). + + test(wrong_ordered_brackets, [fail, condition(true)]) :- + paired("}{"). + + test(wrong_closing_bracket, [fail, condition(true)]) :- + paired("{]"). + + test(paired_with_whitespace, condition(true)) :- + paired("{ }"). + + test(partially_paired_brackets, [fail, condition(true)]) :- + paired("{[])"). + + test(simple_nested_brackets, condition(true)) :- + paired("{[]}"). + + test(several_paired_brackets, condition(true)) :- + paired("{}[]"). + + test(paired_and_nested_brackets, condition(true)) :- + paired("([{}({}[])])"). + + test(unopened_closing_brackets, [fail, condition(true)]) :- + paired("{[)][]}"). + + test(unpaired_and_nested_brackets, [fail, condition(true)]) :- + paired("([{])"). + + test(paired_and_wrong_nested_brackets, [fail, condition(true)]) :- + paired("[({]})"). + + test(paired_and_wrong_nested_brackets_but_innermost_are_correct, [fail, condition(true)]) :- + paired("[({}])"). + + test(paired_and_incomplete_brackets, [fail, condition(true)]) :- + paired("{}["). + + test(too_many_closing_brackets, [fail, condition(true)]) :- + paired("[]]"). + + test(early_unexpected_brackets, [fail, condition(true)]) :- + paired(")()"). + + test(early_mismatched_brackets, [fail, condition(true)]) :- + paired("{)()"). + + test(math_expression, condition(true)) :- + 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)") + +:- end_tests(matching_brackets). From a59e59add15477dc9ca2a2c6c61c8052a013b30c Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Fri, 8 Mar 2024 12:34:33 +0100 Subject: [PATCH 2/3] Add `matching-brackets` exercise --- .../matching-brackets/.meta/config.json | 4 +- .../.meta/matching_brackets.example.pl | 16 ++++++++ .../matching-brackets/matching_brackets.pl | 14 +------ .../matching_brackets_tests.plt | 40 +++++++++---------- 4 files changed, 40 insertions(+), 34 deletions(-) diff --git a/exercises/practice/matching-brackets/.meta/config.json b/exercises/practice/matching-brackets/.meta/config.json index d6e72b88..daa18911 100644 --- a/exercises/practice/matching-brackets/.meta/config.json +++ b/exercises/practice/matching-brackets/.meta/config.json @@ -1,5 +1,7 @@ { - "authors": [], + "authors": [ + "erikschierboom" + ], "files": { "solution": [ "matching_brackets.pl" diff --git a/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl b/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl index e69de29b..a8fd00a1 100644 --- a/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl +++ b/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl @@ -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), + !. \ 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). From 2e259c310f3761ab1104de4833f70b97d5d5246f Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Fri, 8 Mar 2024 12:45:33 +0100 Subject: [PATCH 3/3] Simnplify --- .../matching-brackets/.meta/matching_brackets.example.pl | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl b/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl index a8fd00a1..f3b8d1ca 100644 --- a/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl +++ b/exercises/practice/matching-brackets/.meta/matching_brackets.example.pl @@ -1,4 +1,5 @@ :- use_module(library(dcg/basics)). +:- set_prolog_flag(double_quotes, chars). parentheses --> "(", balanced, ")". brackets --> "[", balanced, "]". @@ -8,9 +9,9 @@ balanced --> non_bracket, balanced. balanced --> []. -non_bracket --> [C], { string_codes("()[]{}", Codes), \+ member(C, Codes) }. +non_bracket --> [C], { \+ member(C, "()[]{}") }. paired(String) :- - string_codes(String, Codes), - phrase(balanced, Codes), - !. \ No newline at end of file + string_chars(String, Chars), + phrase(balanced, Chars), + !.