Skip to content

Commit

Permalink
[gleam] complete matching-brackets
Browse files Browse the repository at this point in the history
  • Loading branch information
joaofnds committed Apr 10, 2024
1 parent a70f5e1 commit fa1535e
Show file tree
Hide file tree
Showing 7 changed files with 214 additions and 0 deletions.
4 changes: 4 additions & 0 deletions gleam/matching-brackets/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
*.beam
*.ez
build
erl_crash.dump
32 changes: 32 additions & 0 deletions gleam/matching-brackets/HELP.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
# Help

## Running the tests

To run the tests, run the command `gleam test` from within the exercise directory.

## Submitting your solution

You can submit your solution using the `exercism submit src/matching_brackets.gleam` command.
This command will upload your solution to the Exercism website and print the solution page's URL.

It's possible to submit an incomplete solution which allows you to:

- See how others have completed the exercise
- Request help from a mentor

## Need to get help?

If you'd like help solving the exercise, check the following pages:

- The [Gleam track's documentation](https://exercism.org/docs/tracks/gleam)
- The [Gleam track's programming category on the forum](https://forum.exercism.org/c/programming/gleam)
- [Exercism's programming category on the forum](https://forum.exercism.org/c/programming/5)
- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)

Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.

To get help if you're having trouble, you can use one of the following resources:

- [gleam.run](https://gleam.run/documentation/) is the gleam official documentation.
- [Discord](https://discord.gg/Fm8Pwmy) is the discord channel.
- [StackOverflow](https://stackoverflow.com/questions/tagged/gleam) can be used to search for your problem and see if it has been answered already. You can also ask and answer questions.
19 changes: 19 additions & 0 deletions gleam/matching-brackets/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Matching Brackets

Welcome to Matching Brackets on Exercism's Gleam Track.
If you need help running the tests or submitting your code, check out `HELP.md`.

## 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.

## Source

### Created by

- @jiegillet

### Based on

Ginna Baker
12 changes: 12 additions & 0 deletions gleam/matching-brackets/gleam.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
name = "matching_brackets"
version = "0.1.0"

[dependencies]
gleam_bitwise = "~> 1.2"
gleam_otp = "~> 0.7 or ~> 1.0"
gleam_stdlib = "~> 0.32 or ~> 1.0"
simplifile = "~> 1.0"
gleam_erlang = ">= 0.25.0 and < 1.0.0"

[dev-dependencies]
exercism_test_runner = "~> 1.4"
27 changes: 27 additions & 0 deletions gleam/matching-brackets/manifest.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# This file was generated by Gleam
# You typically do not need to edit this file

packages = [
{ name = "argv", version = "1.0.1", build_tools = ["gleam"], requirements = [], otp_app = "argv", source = "hex", outer_checksum = "A6E9009E50BBE863EB37D963E4315398D41A3D87D0075480FC244125808F964A" },
{ name = "exercism_test_runner", version = "1.7.0", build_tools = ["gleam"], requirements = ["argv", "gap", "glance", "gleam_community_ansi", "gleam_erlang", "gleam_json", "gleam_stdlib", "simplifile"], otp_app = "exercism_test_runner", source = "hex", outer_checksum = "2FC1BADB19BEC2AE77BFD2D3A606A014C85412A7B874CAFC4BA8CF04B0B257CD" },
{ name = "gap", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_stdlib"], otp_app = "gap", source = "hex", outer_checksum = "2EE1B0A17E85CF73A0C1D29DA315A2699117A8F549C8E8D89FA8261BE41EDEB1" },
{ name = "glance", version = "0.8.2", build_tools = ["gleam"], requirements = ["gleam_stdlib", "glexer"], otp_app = "glance", source = "hex", outer_checksum = "ACF09457E8B564AD7A0D823DAFDD326F58263C01ACB0D432A9BEFDEDD1DA8E73" },
{ name = "gleam_bitwise", version = "1.3.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_bitwise", source = "hex", outer_checksum = "B36E1D3188D7F594C7FD4F43D0D2CE17561DE896202017548578B16FE1FE9EFC" },
{ name = "gleam_community_ansi", version = "1.4.0", build_tools = ["gleam"], requirements = ["gleam_community_colour", "gleam_stdlib"], otp_app = "gleam_community_ansi", source = "hex", outer_checksum = "FE79E08BF97009729259B6357EC058315B6FBB916FAD1C2FF9355115FEB0D3A4" },
{ name = "gleam_community_colour", version = "1.3.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_community_colour", source = "hex", outer_checksum = "A49A5E3AE8B637A5ACBA80ECB9B1AFE89FD3D5351FF6410A42B84F666D40D7D5" },
{ name = "gleam_erlang", version = "0.25.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_erlang", source = "hex", outer_checksum = "054D571A7092D2A9727B3E5D183B7507DAB0DA41556EC9133606F09C15497373" },
{ name = "gleam_json", version = "1.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib", "thoas"], otp_app = "gleam_json", source = "hex", outer_checksum = "8B197DD5D578EA6AC2C0D4BDC634C71A5BCA8E7DB5F47091C263ECB411A60DF3" },
{ name = "gleam_otp", version = "0.10.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "0B04FE915ACECE539B317F9652CAADBBC0F000184D586AAAF2D94C100945D72B" },
{ name = "gleam_stdlib", version = "0.36.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "C0D14D807FEC6F8A08A7C9EF8DFDE6AE5C10E40E21325B2B29365965D82EB3D4" },
{ name = "glexer", version = "0.7.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glexer", source = "hex", outer_checksum = "4484942A465482A0A100936E1E5F12314DB4B5AC0D87575A7B9E9062090B96BE" },
{ name = "simplifile", version = "1.5.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "EB9AA8E65E5C1E3E0FDCFC81BC363FD433CB122D7D062750FFDF24DE4AC40116" },
{ name = "thoas", version = "0.4.1", build_tools = ["rebar3"], requirements = [], otp_app = "thoas", source = "hex", outer_checksum = "4918D50026C073C4AB1388437132C77A6F6F7C8AC43C60C13758CC0ADCE2134E" },
]

[requirements]
exercism_test_runner = { version = "~> 1.4" }
gleam_bitwise = { version = "~> 1.2" }
gleam_erlang = { version = ">= 0.25.0 and < 1.0.0"}
gleam_otp = { version = "~> 0.7 or ~> 1.0" }
gleam_stdlib = { version = "~> 0.32 or ~> 1.0" }
simplifile = { version = "~> 1.0" }
30 changes: 30 additions & 0 deletions gleam/matching-brackets/src/matching_brackets.gleam
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import gleam/string
import gleam/bool
import gleam/list

pub fn is_paired(input: String) -> Bool {
input
|> string.to_graphemes
|> list.filter(string.contains("([{}])", _))
|> is_paired_iter([])
}

fn is_paired_iter(input: List(String), stack: List(String)) -> Bool {
use <- bool.guard(
when: list.is_empty(input) && list.is_empty(stack),
return: True,
)
use <- bool.guard(when: list.is_empty(input), return: False)

let assert [char, ..rem_input] = input
case char {
"{" | "(" | "[" -> is_paired_iter(rem_input, [char, ..stack])
_ ->
case char, stack {
"}", ["{", ..rem_stack] -> is_paired_iter(rem_input, rem_stack)
")", ["(", ..rem_stack] -> is_paired_iter(rem_input, rem_stack)
"]", ["[", ..rem_stack] -> is_paired_iter(rem_input, rem_stack)
_, _ -> False
}
}
}
90 changes: 90 additions & 0 deletions gleam/matching-brackets/test/matching_brackets_test.gleam
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import exercism/test_runner
import matching_brackets

pub fn main() {
test_runner.main()
}

pub fn paired_square_brackets_test() {
let assert True = matching_brackets.is_paired("[]")
}

pub fn empty_string_test() {
let assert True = matching_brackets.is_paired("")
}

pub fn unpaired_brackets_test() {
let assert False = matching_brackets.is_paired("[[")
}

pub fn wrong_ordered_brackets_test() {
let assert False = matching_brackets.is_paired("}{")
}

pub fn wrong_closing_bracket_test() {
let assert False = matching_brackets.is_paired("{]")
}

pub fn paired_with_whitespace_test() {
let assert True = matching_brackets.is_paired("{ }")
}

pub fn partially_paired_brackets_test() {
let assert False = matching_brackets.is_paired("{[])")
}

pub fn simple_nested_brackets_test() {
let assert True = matching_brackets.is_paired("{[]}")
}

pub fn several_paired_brackets_test() {
let assert True = matching_brackets.is_paired("{}[]")
}

pub fn paired_and_nested_brackets_test() {
let assert True = matching_brackets.is_paired("([{}({}[])])")
}

pub fn unopened_closing_brackets_test() {
let assert False = matching_brackets.is_paired("{[)][]}")
}

pub fn unpaired_and_nested_brackets_test() {
let assert False = matching_brackets.is_paired("([{])")
}

pub fn paired_and_wrong_nested_brackets_test() {
let assert False = matching_brackets.is_paired("[({]})")
}

pub fn paired_and_wrong_nested_brackets_but_innermost_are_correct_test() {
let assert False = matching_brackets.is_paired("[({}])")
}

pub fn paired_and_incomplete_brackets_test() {
let assert False = matching_brackets.is_paired("{}[")
}

pub fn too_many_closing_brackets_test() {
let assert False = matching_brackets.is_paired("[]]")
}

pub fn early_unexpected_brackets_test() {
let assert False = matching_brackets.is_paired(")()")
}

pub fn early_mismatched_brackets_test() {
let assert False = matching_brackets.is_paired("{)()")
}

pub fn math_expression_test() {
let assert True =
matching_brackets.is_paired("(((185 + 223.85) * 15) - 543)/2")
}

pub fn complex_latex_expression_test() {
let assert True =
matching_brackets.is_paired(
"\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)",
)
}

0 comments on commit fa1535e

Please sign in to comment.