diff --git a/config.json b/config.json index 7bfef7eb..2eb6667a 100644 --- a/config.json +++ b/config.json @@ -320,6 +320,22 @@ "prerequisites": [], "difficulty": 1 }, + { + "slug": "eliuds-eggs", + "name": "Eliud's Eggs", + "uuid": "e02de36d-defa-495b-8940-6b2a179afc87", + "practices": [], + "prerequisites": [], + "difficulty": 1 + }, + { + "slug": "reverse-string", + "name": "Reverse String", + "uuid": "a6a5838c-f35c-4fd2-ab80-62d6a61dd6b3", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "roman-numerals", "name": "Roman Numerals", diff --git a/exercises/practice/eliuds-eggs/.docs/instructions.md b/exercises/practice/eliuds-eggs/.docs/instructions.md new file mode 100644 index 00000000..b0c2df59 --- /dev/null +++ b/exercises/practice/eliuds-eggs/.docs/instructions.md @@ -0,0 +1,8 @@ +# Instructions + +Your task is to count the number of 1 bits in the binary representation of a number. + +## Restrictions + +Keep your hands off that bit-count functionality provided by your standard library! +Solve this one yourself using other basic tools instead. diff --git a/exercises/practice/eliuds-eggs/.docs/introduction.md b/exercises/practice/eliuds-eggs/.docs/introduction.md new file mode 100644 index 00000000..49eaffd8 --- /dev/null +++ b/exercises/practice/eliuds-eggs/.docs/introduction.md @@ -0,0 +1,47 @@ +# Introduction + +Your friend Eliud inherited a farm from her grandma Tigist. +Her granny was an inventor and had a tendency to build things in an overly complicated manner. +The chicken coop has a digital display showing an encoded number representing the positions of all eggs that could be picked up. + +Eliud is asking you to write a program that shows the actual number of eggs in the coop. + +The position information encoding is calculated as follows: + +1. Scan the potential egg-laying spots and mark down a `1` for an existing egg or a `0` for an empty spot. +2. Convert the number from binary to decimal. +3. Show the result on the display. + +Example 1: + +```text +Chicken Coop: + _ _ _ _ _ _ _ +|E| |E|E| | |E| + +Resulting Binary: + 1 0 1 1 0 0 1 + +Decimal number on the display: +89 + +Actual eggs in the coop: +4 +``` + +Example 2: + +```text +Chicken Coop: + _ _ _ _ _ _ _ _ +| | | |E| | | | | + +Resulting Binary: + 0 0 0 1 0 0 0 0 + +Decimal number on the display: +16 + +Actual eggs in the coop: +1 +``` diff --git a/exercises/practice/eliuds-eggs/.gitignore b/exercises/practice/eliuds-eggs/.gitignore new file mode 100644 index 00000000..6dd20ff0 --- /dev/null +++ b/exercises/practice/eliuds-eggs/.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/eliuds-eggs/.meta/config.json b/exercises/practice/eliuds-eggs/.meta/config.json new file mode 100644 index 00000000..f94db12a --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "src/eliuds-eggs.lfe" + ], + "test": [ + "test/eliuds-eggs-tests.lfe" + ], + "example": [ + ".meta/example.lfe" + ] + }, + "blurb": "Help Eliud count the number of eggs in her chicken coop by counting the number of 1 bits in a binary representation.", + "source": "Christian Willner, Eric Willigers", + "source_url": "https://forum.exercism.org/t/new-exercise-suggestion-pop-count/7632/5" +} diff --git a/exercises/practice/eliuds-eggs/.meta/example.lfe b/exercises/practice/eliuds-eggs/.meta/example.lfe new file mode 100644 index 00000000..51b8a9fa --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/example.lfe @@ -0,0 +1,9 @@ +(defmodule eliuds-eggs + (export (egg-count 1))) + +(defun egg-count (display-value) + (do-count display-value 0)) + +(defun do-count + ((0 steps) steps) + ((number steps) (when (> number 0)) (do-count (bsr number 1) (+ steps (band number 1))))) diff --git a/exercises/practice/eliuds-eggs/.meta/tests.toml b/exercises/practice/eliuds-eggs/.meta/tests.toml new file mode 100644 index 00000000..e11683c2 --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/tests.toml @@ -0,0 +1,22 @@ +# 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. + +[559e789d-07d1-4422-9004-3b699f83bca3] +description = "0 eggs" + +[97223282-f71e-490c-92f0-b3ec9e275aba] +description = "1 egg" + +[1f8fd18f-26e9-4144-9a0e-57cdfc4f4ff5] +description = "4 eggs" + +[0c18be92-a498-4ef2-bcbb-28ac4b06cb81] +description = "13 eggs" diff --git a/exercises/practice/eliuds-eggs/Makefile b/exercises/practice/eliuds-eggs/Makefile new file mode 100644 index 00000000..fbb5a7de --- /dev/null +++ b/exercises/practice/eliuds-eggs/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/eliuds-eggs/rebar.config b/exercises/practice/eliuds-eggs/rebar.config new file mode 100644 index 00000000..d53487ac --- /dev/null +++ b/exercises/practice/eliuds-eggs/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/eliuds-eggs/rebar.lock b/exercises/practice/eliuds-eggs/rebar.lock new file mode 100644 index 00000000..d5a6b3b9 --- /dev/null +++ b/exercises/practice/eliuds-eggs/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/eliuds-eggs/src/eliuds-eggs.app.src b/exercises/practice/eliuds-eggs/src/eliuds-eggs.app.src new file mode 100644 index 00000000..c98d4bf4 --- /dev/null +++ b/exercises/practice/eliuds-eggs/src/eliuds-eggs.app.src @@ -0,0 +1,11 @@ +%% -*- erlang -*- +{application, 'eliuds-eggs', + [{description, ""}, + {vsn, "0.0.1"}, + {modules, + ['eliuds-eggs']}, + {registered, []}, + {applications, + [kernel, stdlib]}, + {included_applications, []}, + {env, []}]}. diff --git a/exercises/practice/eliuds-eggs/src/eliuds-eggs.lfe b/exercises/practice/eliuds-eggs/src/eliuds-eggs.lfe new file mode 100644 index 00000000..54109124 --- /dev/null +++ b/exercises/practice/eliuds-eggs/src/eliuds-eggs.lfe @@ -0,0 +1,4 @@ +(defmodule eliuds-eggs + (export (egg-count 1))) + + ; Please implement the egg-count function. diff --git a/exercises/practice/eliuds-eggs/test/eliuds-eggs-tests.lfe b/exercises/practice/eliuds-eggs/test/eliuds-eggs-tests.lfe new file mode 100644 index 00000000..afb6f91e --- /dev/null +++ b/exercises/practice/eliuds-eggs/test/eliuds-eggs-tests.lfe @@ -0,0 +1,17 @@ +(defmodule eliuds-eggs-tests + (behaviour ltest-unit) + (export all)) + +(include-lib "ltest/include/ltest-macros.lfe") + +(deftest zero-eggs + (is-equal (eliuds-eggs:egg-count 0) 0)) + +(deftest one-egg + (is-equal (eliuds-eggs:egg-count 16) 1)) + +(deftest four-eggs + (is-equal (eliuds-eggs:egg-count 89) 4)) + +(deftest thirteen-eggs + (is-equal (eliuds-eggs:egg-count 2000000000) 13)) diff --git a/exercises/practice/reverse-string/.docs/instructions.md b/exercises/practice/reverse-string/.docs/instructions.md new file mode 100644 index 00000000..0ff4198e --- /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 00000000..02233e07 --- /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 00000000..6dd20ff0 --- /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 00000000..06e2f957 --- /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 00000000..d6a2a53d --- /dev/null +++ b/exercises/practice/reverse-string/.meta/example.lfe @@ -0,0 +1,5 @@ +(defmodule reverse + (export (string 1))) + +(defun string (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 00000000..0b04c4cd --- /dev/null +++ b/exercises/practice/reverse-string/.meta/tests.toml @@ -0,0 +1,28 @@ +# 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" diff --git a/exercises/practice/reverse-string/Makefile b/exercises/practice/reverse-string/Makefile new file mode 100644 index 00000000..fbb5a7de --- /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 00000000..d53487ac --- /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 00000000..d5a6b3b9 --- /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 00000000..33f2a0c4 --- /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 00000000..04b9914e --- /dev/null +++ b/exercises/practice/reverse-string/src/reverse-string.lfe @@ -0,0 +1,4 @@ +(defmodule reverse-string + (export (reverse 1))) + + ; Please implement the `reverse` function. \ 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 00000000..1772e3f2 --- /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 ""))) + +(deftest reverses-a-word + (is-equal "tobor" + (reverse:string "robot"))) + +(deftest reverses-a-capitalized-word + (is-equal "nemaR" + (reverse:string "Ramen"))) + +(deftest reverses-a-palindrome + (is-equal "racecar" + (reverse:string "racecar"))) + +(deftest reverses-an-even-sized-word + (is-equal "reward" + (reverse:string "drawer")))