diff --git a/config.json b/config.json index cf16a7b..f6561f5 100644 --- a/config.json +++ b/config.json @@ -319,6 +319,14 @@ "practices": [], "prerequisites": [], "difficulty": 1 + }, + { + "slug": "reverse-string", + "name": "Reverse String", + "uuid": "a6a5838c-f35c-4fd2-ab80-62d6a61dd6b3", + "practices": [], + "prerequisites": [], + "difficulty": 2 } ] }, diff --git a/exercises/practice/reverse-string/.docs/instructions.md b/exercises/practice/reverse-string/.docs/instructions.md new file mode 100644 index 0000000..0ff4198 --- /dev/null +++ b/exercises/practice/reverse-string/.docs/instructions.md @@ -0,0 +1,9 @@ +# Instructions + +Your task is to reverse a given string. + +Some examples: + +- Turn `"stressed"` into `"desserts"`. +- Turn `"strops"` into `"sports"`. +- Turn `"racecar"` into `"racecar"`. diff --git a/exercises/practice/reverse-string/.docs/introduction.md b/exercises/practice/reverse-string/.docs/introduction.md new file mode 100644 index 0000000..02233e0 --- /dev/null +++ b/exercises/practice/reverse-string/.docs/introduction.md @@ -0,0 +1,5 @@ +# Introduction + +Reversing strings (reading them from right to left, rather than from left to right) is a surprisingly common task in programming. + +For example, in bioinformatics, reversing the sequence of DNA or RNA strings is often important for various analyses, such as finding complementary strands or identifying palindromic sequences that have biological significance. diff --git a/exercises/practice/reverse-string/.gitignore b/exercises/practice/reverse-string/.gitignore new file mode 100644 index 0000000..6dd20ff --- /dev/null +++ b/exercises/practice/reverse-string/.gitignore @@ -0,0 +1,11 @@ +## -*- conf -*- +.rebar3 +_build/ +ebin/ +erl_crash.dump +rebar3.crashdump + +tmp +bin/configlet +bin/configlet.exe +CHECKLIST diff --git a/exercises/practice/reverse-string/.meta/config.json b/exercises/practice/reverse-string/.meta/config.json new file mode 100644 index 0000000..06e2f95 --- /dev/null +++ b/exercises/practice/reverse-string/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "src/reverse-string.lfe" + ], + "test": [ + "test/reverse-string-tests.lfe" + ], + "example": [ + ".meta/example.lfe" + ] + }, + "blurb": "Reverse a given string.", + "source": "Introductory challenge to reverse an input string", + "source_url": "https://medium.freecodecamp.org/how-to-reverse-a-string-in-javascript-in-3-different-ways-75e4763c68cb" +} diff --git a/exercises/practice/reverse-string/.meta/example.lfe b/exercises/practice/reverse-string/.meta/example.lfe new file mode 100644 index 0000000..1c6e796 --- /dev/null +++ b/exercises/practice/reverse-string/.meta/example.lfe @@ -0,0 +1,5 @@ +(defmodule reverse-string + (export (reverse 1))) + +(defun reverse (str) + (lists:reverse str)) \ No newline at end of file diff --git a/exercises/practice/reverse-string/.meta/tests.toml b/exercises/practice/reverse-string/.meta/tests.toml new file mode 100644 index 0000000..1125df5 --- /dev/null +++ b/exercises/practice/reverse-string/.meta/tests.toml @@ -0,0 +1,40 @@ +# 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. + +[c3b7d806-dced-49ee-8543-933fd1719b1c] +description = "an empty string" + +[01ebf55b-bebb-414e-9dec-06f7bb0bee3c] +description = "a word" + +[0f7c07e4-efd1-4aaa-a07a-90b49ce0b746] +description = "a capitalized word" + +[71854b9c-f200-4469-9f5c-1e8e5eff5614] +description = "a sentence with punctuation" + +[1f8ed2f3-56f3-459b-8f3e-6d8d654a1f6c] +description = "a palindrome" + +[b9e7dec1-c6df-40bd-9fa3-cd7ded010c4c] +description = "an even-sized word" + +[1bed0f8a-13b0-4bd3-9d59-3d0593326fa2] +description = "wide characters" +include = false + +[93d7e1b8-f60f-4f3c-9559-4056e10d2ead] +description = "grapheme cluster with pre-combined form" +include = false + +[1028b2c1-6763-4459-8540-2da47ca512d9] +description = "grapheme clusters" +include = false \ No newline at end of file diff --git a/exercises/practice/reverse-string/Makefile b/exercises/practice/reverse-string/Makefile new file mode 100644 index 0000000..fbb5a7d --- /dev/null +++ b/exercises/practice/reverse-string/Makefile @@ -0,0 +1,21 @@ +ERL := $(shell which erl) +REBAR3 := $(shell which rebar3) + +null := +space := $(null) # +comma := , + +ifeq ($(ERL),) + $(error Can't find Erlang executable 'erl') +else ifeq ($(REBAR3),) + $(error Can't find rebar3) +endif + +compile: ; $(REBAR3) compile + +clean: ; $(REBAR3) clean + +.PHONY: test +test: + $(REBAR3) eunit \ + -m $(subst $(space),$(comma),$(basename $(notdir $(wildcard test/*.lfe)))) diff --git a/exercises/practice/reverse-string/rebar.config b/exercises/practice/reverse-string/rebar.config new file mode 100644 index 0000000..d53487a --- /dev/null +++ b/exercises/practice/reverse-string/rebar.config @@ -0,0 +1,11 @@ +{plugins, [{rebar3_lfe, "0.4.3"}]}. + +{provider_hooks, [{post, [{compile, {lfe, compile}}]}]}. + +{deps, [{lfe, "2.1.1"}]}. + +{profiles, + [{test, + [{eunit_compile_opts, [{src_dirs, ["src", "test"]}]}, + {deps, + [{ltest, "0.13.3"}]}]}]}. diff --git a/exercises/practice/reverse-string/rebar.lock b/exercises/practice/reverse-string/rebar.lock new file mode 100644 index 0000000..d5a6b3b --- /dev/null +++ b/exercises/practice/reverse-string/rebar.lock @@ -0,0 +1,8 @@ +{"1.2.0", +[{<<"lfe">>,{pkg,<<"lfe">>,<<"2.1.1">>},0}]}. +[ +{pkg_hash,[ + {<<"lfe">>, <<"4A888B26172D198DC7A5AFEB897E8248AF7D56E1638D9C8249AAF933AE811B96">>}]}, +{pkg_hash_ext,[ + {<<"lfe">>, <<"C484D3B655D40DED58BC41B17B22F173711C681BF36063A234A9BAA9506947E1">>}]} +]. diff --git a/exercises/practice/reverse-string/src/reverse-string.app.src b/exercises/practice/reverse-string/src/reverse-string.app.src new file mode 100644 index 0000000..33f2a0c --- /dev/null +++ b/exercises/practice/reverse-string/src/reverse-string.app.src @@ -0,0 +1,11 @@ +%% -*- erlang -*- +{application, 'reverse-string', + [{description, ""}, + {vsn, "0.0.1"}, + {modules, + [reverse]}, + {registered, []}, + {applications, + [kernel, stdlib]}, + {included_applications, []}, + {env, []}]}. diff --git a/exercises/practice/reverse-string/src/reverse-string.lfe b/exercises/practice/reverse-string/src/reverse-string.lfe new file mode 100644 index 0000000..1c6e796 --- /dev/null +++ b/exercises/practice/reverse-string/src/reverse-string.lfe @@ -0,0 +1,5 @@ +(defmodule reverse-string + (export (reverse 1))) + +(defun reverse (str) + (lists:reverse str)) \ No newline at end of file diff --git a/exercises/practice/reverse-string/test/reverse-string-tests.lfe b/exercises/practice/reverse-string/test/reverse-string-tests.lfe new file mode 100644 index 0000000..43f50c8 --- /dev/null +++ b/exercises/practice/reverse-string/test/reverse-string-tests.lfe @@ -0,0 +1,25 @@ +(defmodule reverse-string-tests + (behaviour ltest-unit) + (export all)) + +(include-lib "ltest/include/ltest-macros.lfe") + +(deftest reverses-empty-string + (is-equal "" + (reverse-string:reverse ""))) + +(deftest reverses-a-word + (is-equal "tobor" + (reverse-string:reverse "robot"))) + +(deftest reverses-a-capitalized-word + (is-equal "nemaR" + (reverse-string:reverse "Ramen"))) + +(deftest reverses-a-palindrome + (is-equal "racecar" + (reverse-string:reverse "racecar"))) + +(deftest reverses-an-even-sized-word + (is-equal "reward" + (reverse-string:reverse "drawer")))