diff --git a/config.json b/config.json index 016a4219..225ccd98 100644 --- a/config.json +++ b/config.json @@ -244,6 +244,14 @@ "mathematics" ] }, + { + "slug": "bracket-push", + "uuid": "f93f5f18-3e3b-11e8-b467-0ed5f89f718b", + "core": false, + "unlocked_by": null, + "difficulty": 3, + "topics": [] + }, { "slug": "gigasecond", "uuid": "24ae9a43-4e1c-418b-97f6-2c83dbc0e14a", diff --git a/exercises/bracket-push/README.md b/exercises/bracket-push/README.md new file mode 100644 index 00000000..b0724c86 --- /dev/null +++ b/exercises/bracket-push/README.md @@ -0,0 +1,45 @@ +Given a string containing brackets `[]`, braces `{}` and parentheses `()`, +verify that all the pairs are matched and nested correctly. + +## Running tests + +In order to run the tests, issue the following command from the exercise +directory: + +For running the tests provided, `rebar3` is used as it is the official build and +dependency management tool for erlang now. Please refer to [the tracks installation +instructions](http://exercism.io/languages/erlang/installation) on how to do that. + +In order to run the tests, you can issue the following command from the exercise +directory. + +```bash +$ rebar3 eunit +``` + +### Test versioning + +Each problem defines a macro `TEST_VERSION` in the test file and +verifies that the solution defines and exports a function `test_version` +returning that same value. + +To make tests pass, add the following to your solution: + +```erlang +-export([test_version/0]). + +test_version() -> + 1. +``` + +The benefit of this is that reviewers can see against which test version +an iteration was written if, for example, a previously posted solution +does not solve the current problem or passes current tests. + +## Questions? + +For detailed information about the Erlang track, please refer to the +[help page](http://exercism.io/languages/erlang) on the Exercism site. +This covers the basic information on setting up the development +environment expected by the exercises. + diff --git a/exercises/bracket-push/rebar.config b/exercises/bracket-push/rebar.config new file mode 100644 index 00000000..50795809 --- /dev/null +++ b/exercises/bracket-push/rebar.config @@ -0,0 +1,30 @@ +%% Erlang compiler options +{erl_opts, [debug_info]}. + +{deps, [{erl_exercism, "0.1.1"}]}. + +{dialyzer, [ + {warnings, [underspecs, no_return]}, + {get_warnings, true}, + {plt_apps, top_level_deps}, % top_level_deps | all_deps + {plt_extra_apps, []}, + {plt_location, local}, % local | "/my/file/name" + {plt_prefix, "rebar3"}, + {base_plt_apps, [stdlib, kernel, crypto]}, + {base_plt_location, global}, % global | "/my/file/name" + {base_plt_prefix, "rebar3"} +]}. + +%% eunit:test(Tests) +{eunit_tests, []}. +%% Options for eunit:test(Tests, Opts) +{eunit_opts, [verbose]}. + +%% == xref == + +{xref_warnings, true}. + +%% xref checks to run +{xref_checks, [undefined_function_calls, undefined_functions, + locals_not_used, exports_not_used, + deprecated_function_calls, deprecated_functions]}. diff --git a/exercises/bracket-push/src/bracket_push.app.src b/exercises/bracket-push/src/bracket_push.app.src new file mode 100644 index 00000000..1e35fd00 --- /dev/null +++ b/exercises/bracket-push/src/bracket_push.app.src @@ -0,0 +1,9 @@ +{application, bracket_push, + [{description, "exercism.io - bracket-push"}, + {vsn, "0.0.1"}, + {modules, []}, + {registered, []}, + {applications, [kernel, + stdlib]}, + {env, []} +]}. diff --git a/exercises/bracket-push/src/bracket_push.erl b/exercises/bracket-push/src/bracket_push.erl new file mode 100644 index 00000000..70d57e48 --- /dev/null +++ b/exercises/bracket-push/src/bracket_push.erl @@ -0,0 +1,7 @@ +-module(bracket_push). + +-export([is_paired/1, test_version/0]). + +is_paired(Str) -> undefined. + +test_version() -> 1. diff --git a/exercises/bracket-push/src/example.erl b/exercises/bracket-push/src/example.erl new file mode 100644 index 00000000..dea7b2e3 --- /dev/null +++ b/exercises/bracket-push/src/example.erl @@ -0,0 +1,15 @@ +-module(bracket_push). + +-export([is_paired/1, test_version/0]). + +is_paired(Str) -> is_paired(Str, []). + +is_paired([], Stack) -> Stack=:=[]; +is_paired([C|More], Stack) when C=:=${ orelse C=:=$[ orelse C=:=$( -> is_paired(More, [C|Stack]); +is_paired([$}|More], [${|Stack]) -> is_paired(More, Stack); +is_paired([$]|More], [$[|Stack]) -> is_paired(More, Stack); +is_paired([$)|More], [$(|Stack]) -> is_paired(More, Stack); +is_paired([C|_], _) when C=:=$} orelse C=:=$] orelse C=:=$)-> false; +is_paired([_|More], Stack) -> is_paired(More, Stack). + +test_version() -> 1. diff --git a/exercises/bracket-push/test/bracket_push_tests.erl b/exercises/bracket-push/test/bracket_push_tests.erl new file mode 100644 index 00000000..64c7cd56 --- /dev/null +++ b/exercises/bracket-push/test/bracket_push_tests.erl @@ -0,0 +1,55 @@ +% based on canonical data version 1.3.0 +% https://raw.githubusercontent.com/exercism/problem-specifications/master/exercises/bracket-push/canonical-data.json + +-module(bracket_push_tests). + +-include_lib("erl_exercism/include/exercism.hrl"). +-include_lib("eunit/include/eunit.hrl"). + +paired_square_brackets_test() -> + ?assert(bracket_push:is_paired("[]")). + +empty_string_test() -> + ?assert(bracket_push:is_paired("")). + +unpaired_brackets_test() -> + ?assertNot(bracket_push:is_paired("[[")). + +wrong_ordered_brackets_test() -> + ?assertNot(bracket_push:is_paired("}{")). + +wrong_closing_bracket_test() -> + ?assertNot(bracket_push:is_paired("{]")). + +paired_with_whitespace_test() -> + ?assert(bracket_push:is_paired("{ }")). + +partially_paired_brackets_test() -> + ?assertNot(bracket_push:is_paired("{[])")). + +simple_nested_brackets_test() -> + ?assert(bracket_push:is_paired("{[]}")). + +several_paired_brackets_test() -> + ?assert(bracket_push:is_paired("{}[]")). + +paired_and_nested_brackets_test() -> + ?assert(bracket_push:is_paired("([{}({}[])])")). + +unopened_closing_brackets_test() -> + ?assertNot(bracket_push:is_paired("{[)][]}")). + +unpaired_and_nested_brackets_test() -> + ?assertNot(bracket_push:is_paired("([{])")). + +paired_and_wrong_nested_brackets_test() -> + ?assertNot(bracket_push:is_paired("[({]})")). + +math_expression_test() -> + ?assert(bracket_push:is_paired("(((185 + 223.85) * 15) - 543)/2")). + +complex_latex_expression_test() -> + ?assert(bracket_push:is_paired("\\left(\\begin{array}{cc} \\frac{1}{3} & x\\\\ \\mathrm{e}^{x} &... x^2 \\end{array}\\right)")). + +version_test() -> ?assertMatch(1, bracket_push:test_version()). +