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

[matching-brackets] Implementation #625

Merged
merged 8 commits into from Jun 24, 2023
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 10 additions & 1 deletion config.json
Expand Up @@ -544,8 +544,17 @@
"prerequisites": [],
"difficulty": 1,
"topics": []
},
{
"slug": "matching-brackets",
"name": "Matching Brackets",
"uuid": "0236f51e-de30-4922-901f-4c460e8fe17f",
"practices": [],
"prerequisites": [],
"difficulty": 1,
"topics": []
}
]
]
},
"concepts": [],
"key_features": [
Expand Down
4 changes: 4 additions & 0 deletions 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.
19 changes: 19 additions & 0 deletions exercises/practice/matching-brackets/.meta/config.json
@@ -0,0 +1,19 @@
{
"authors": [
"habere-et-dispertire",
"m-dango"
],
"files": {
"solution": [
"MatchingBrackets.rakumod"
],
"test": [
"matching-brackets.rakutest"
],
"example": [
".meta/solutions/MatchingBrackets.rakumod"
]
},
"blurb": "Make sure the brackets and braces all match.",
"source": "Ginna Baker"
}
@@ -0,0 +1,13 @@
unit module MatchingBrackets;

grammar Balanced {
token TOP { <balanced> * }
token balanced { <parentheses> | <brackets> | <braces> | <other> }
token parentheses { '(' ~ ')' <balanced> * }
token brackets { '[' ~ ']' <balanced> * }
token braces { '{' ~ '}' <balanced> * }
token other { <-[()\[\]{}]> + }
}
sub has-matching-brackets ($string) is export {
Balanced.parse($string).so
}
30 changes: 30 additions & 0 deletions exercises/practice/matching-brackets/.meta/template-data.yaml
@@ -0,0 +1,30 @@
unit: module

properties:
isPaired:
test: |-
sprintf(q:to/END/, %case<input><value>, %case<expected>, %case<description>.raku);
cmp-ok(
has-matching-brackets(「%s」),
"eqv",
%s,
%s,
);
END

example: |-
grammar Balanced {
token TOP { <balanced> * }
token balanced { <parentheses> | <brackets> | <braces> | <other> }
token parentheses { '(' ~ ')' <balanced> * }
token brackets { '[' ~ ']' <balanced> * }
token braces { '{' ~ '}' <balanced> * }
token other { <-[()\[\]{}]> + }
}
sub has-matching-brackets ($string) is export {
Balanced.parse($string).so
}

stub: |-
sub has-matching-brackets ($string) is export {
}
70 changes: 70 additions & 0 deletions 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"
4 changes: 4 additions & 0 deletions exercises/practice/matching-brackets/MatchingBrackets.rakumod
@@ -0,0 +1,4 @@
unit module MatchingBrackets;

sub has-matching-brackets ($string) is export {
}
146 changes: 146 additions & 0 deletions exercises/practice/matching-brackets/matching-brackets.rakutest
@@ -0,0 +1,146 @@
#!/usr/bin/env raku
use Test;
use lib $?FILE.IO.dirname;
use MatchingBrackets;

cmp-ok( # begin: 81ec11da-38dd-442a-bcf9-3de7754609a5
has-matching-brackets(「[]」),
"eqv",
True,
"paired square brackets",
); # end: 81ec11da-38dd-442a-bcf9-3de7754609a5

cmp-ok( # begin: 287f0167-ac60-4b64-8452-a0aa8f4e5238
has-matching-brackets(「」),
"eqv",
True,
"empty string",
); # end: 287f0167-ac60-4b64-8452-a0aa8f4e5238

cmp-ok( # begin: 6c3615a3-df01-4130-a731-8ef5f5d78dac
has-matching-brackets(「[[」),
"eqv",
False,
"unpaired brackets",
); # end: 6c3615a3-df01-4130-a731-8ef5f5d78dac

cmp-ok( # begin: 9d414171-9b98-4cac-a4e5-941039a97a77
has-matching-brackets(「}{」),
"eqv",
False,
"wrong ordered brackets",
); # end: 9d414171-9b98-4cac-a4e5-941039a97a77

cmp-ok( # begin: f0f97c94-a149-4736-bc61-f2c5148ffb85
has-matching-brackets(「{]」),
"eqv",
False,
"wrong closing bracket",
); # end: f0f97c94-a149-4736-bc61-f2c5148ffb85

cmp-ok( # begin: 754468e0-4696-4582-a30e-534d47d69756
has-matching-brackets(「{ }」),
"eqv",
True,
"paired with whitespace",
); # end: 754468e0-4696-4582-a30e-534d47d69756

cmp-ok( # begin: ba84f6ee-8164-434a-9c3e-b02c7f8e8545
has-matching-brackets(「{[])」),
"eqv",
False,
"partially paired brackets",
); # end: ba84f6ee-8164-434a-9c3e-b02c7f8e8545

cmp-ok( # begin: 3c86c897-5ff3-4a2b-ad9b-47ac3a30651d
has-matching-brackets(「{[]}」),
"eqv",
True,
"simple nested brackets",
); # end: 3c86c897-5ff3-4a2b-ad9b-47ac3a30651d

cmp-ok( # begin: 2d137f2c-a19e-4993-9830-83967a2d4726
has-matching-brackets(「{}[]」),
"eqv",
True,
"several paired brackets",
); # end: 2d137f2c-a19e-4993-9830-83967a2d4726

cmp-ok( # begin: 2e1f7b56-c137-4c92-9781-958638885a44
has-matching-brackets(「([{}({}[])])」),
"eqv",
True,
"paired and nested brackets",
); # end: 2e1f7b56-c137-4c92-9781-958638885a44

cmp-ok( # begin: 84f6233b-e0f7-4077-8966-8085d295c19b
has-matching-brackets(「{[)][]}」),
"eqv",
False,
"unopened closing brackets",
); # end: 84f6233b-e0f7-4077-8966-8085d295c19b

cmp-ok( # begin: 9b18c67d-7595-4982-b2c5-4cb949745d49
has-matching-brackets(「([{])」),
"eqv",
False,
"unpaired and nested brackets",
); # end: 9b18c67d-7595-4982-b2c5-4cb949745d49

cmp-ok( # begin: a0205e34-c2ac-49e6-a88a-899508d7d68e
has-matching-brackets(「[({]})」),
"eqv",
False,
"paired and wrong nested brackets",
); # end: a0205e34-c2ac-49e6-a88a-899508d7d68e

cmp-ok( # begin: 1d5c093f-fc84-41fb-8c2a-e052f9581602
has-matching-brackets(「[({}])」),
"eqv",
False,
"paired and wrong nested brackets but innermost are correct",
); # end: 1d5c093f-fc84-41fb-8c2a-e052f9581602

cmp-ok( # begin: ef47c21b-bcfd-4998-844c-7ad5daad90a8
has-matching-brackets(「{}[」),
"eqv",
False,
"paired and incomplete brackets",
); # end: ef47c21b-bcfd-4998-844c-7ad5daad90a8

cmp-ok( # begin: a4675a40-a8be-4fc2-bc47-2a282ce6edbe
has-matching-brackets(「[]]」),
"eqv",
False,
"too many closing brackets",
); # end: a4675a40-a8be-4fc2-bc47-2a282ce6edbe

cmp-ok( # begin: a345a753-d889-4b7e-99ae-34ac85910d1a
has-matching-brackets(「)()」),
"eqv",
False,
"early unexpected brackets",
); # end: a345a753-d889-4b7e-99ae-34ac85910d1a

cmp-ok( # begin: 21f81d61-1608-465a-b850-baa44c5def83
has-matching-brackets(「{)()」),
"eqv",
False,
"early mismatched brackets",
); # end: 21f81d61-1608-465a-b850-baa44c5def83

cmp-ok( # begin: 99255f93-261b-4435-a352-02bdecc9bdf2
has-matching-brackets(「(((185 + 223.85) * 15) - 543)/2」),
"eqv",
True,
"math expression",
); # end: 99255f93-261b-4435-a352-02bdecc9bdf2

cmp-ok( # begin: 8e357d79-f302-469a-8515-2561877256a1
has-matching-brackets(「\left(\begin{array}{cc} \frac{1}{3} & x\\ \mathrm{e}^{x} &... x^2 \end{array}\right)」),
"eqv",
True,
"complex latex expression",
); # end: 8e357d79-f302-469a-8515-2561877256a1

done-testing;