diff --git a/config.json b/config.json index 8d9fcfc..8310842 100644 --- a/config.json +++ b/config.json @@ -291,6 +291,16 @@ "prerequisites": [], "difficulty": 3 }, + { + "slug": "pop-count", + "name": "Pop Count", + "uuid": "ebfaddfb-d094-4471-8771-fc09cf14274f", + "practices": [ + "numbers" + ], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "protein-translation", "name": "Protein Translation", diff --git a/exercises/practice/pop-count/.docs/instructions.md b/exercises/practice/pop-count/.docs/instructions.md new file mode 100644 index 0000000..b0c2df5 --- /dev/null +++ b/exercises/practice/pop-count/.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/pop-count/.docs/introduction.md b/exercises/practice/pop-count/.docs/introduction.md new file mode 100644 index 0000000..49eaffd --- /dev/null +++ b/exercises/practice/pop-count/.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/pop-count/.meta/config.json b/exercises/practice/pop-count/.meta/config.json new file mode 100644 index 0000000..46133c9 --- /dev/null +++ b/exercises/practice/pop-count/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "pop-count.arr" + ], + "test": [ + "pop-count-test.arr" + ], + "example": [ + ".meta/example.arr" + ] + }, + "blurb": "Count the 1 bits in a number", + "source": "Christian Willner, Eric Willigers", + "source_url": "https://forum.exercism.org/t/new-exercise-suggestion-pop-count/7632/5" +} diff --git a/exercises/practice/pop-count/.meta/example.arr b/exercises/practice/pop-count/.meta/example.arr new file mode 100644 index 0000000..ed14b41 --- /dev/null +++ b/exercises/practice/pop-count/.meta/example.arr @@ -0,0 +1,17 @@ +use context essentials2020 + +provide: egg-count end + +fun egg-count(n): + fun recurse(val, eggs): + if val == 0: + eggs + else if num-is-positive(num-modulo(val, 2)): + recurse(num-truncate(val / 2), eggs + 1) + else: + recurse(num-truncate(val / 2), eggs) + end + end + + recurse(n, 0) +end diff --git a/exercises/practice/pop-count/.meta/tests.toml b/exercises/practice/pop-count/.meta/tests.toml new file mode 100644 index 0000000..e11683c --- /dev/null +++ b/exercises/practice/pop-count/.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/pop-count/pop-count-test.arr b/exercises/practice/pop-count/pop-count-test.arr new file mode 100644 index 0000000..dc22ee1 --- /dev/null +++ b/exercises/practice/pop-count/pop-count-test.arr @@ -0,0 +1,48 @@ +use context essentials2020 + +include file("pop-count.arr") + +#| + When working offline, all tests except the first one are skipped by default. + Once you get the first test running, unskip the next one until all tests pass locally. + Check the block comment below for further details. +|# + +fun zero-eggs(): + check "0 eggs": + egg-count(0) is 0 + end +end + +fun one-egg(): + check "1 egg": + egg-count(16) is 1 + end +end + +fun four-eggs(): + check "4 eggs": + egg-count(89) is 4 + end +end + +fun thirteen-eggs(): + check "13 eggs": + egg-count(2000000000) is 13 + end +end + +#| + Code to run each test. Each line corresponds to a test above and whether it should be run. + To mark a test to be run, replace `false` with `true` on that same line after the comma. + test(test-a, true) will be run. test(test-a, false) will be skipped. +|# + +data TestRun: test(run, active) end + +[list: + test(zero-eggs, true), + test(one-egg, false), + test(four-eggs, false), + test(thirteen-eggs, false) +].each(lam(t): when t.active: t.run() end end) diff --git a/exercises/practice/pop-count/pop-count.arr b/exercises/practice/pop-count/pop-count.arr new file mode 100644 index 0000000..7965c12 --- /dev/null +++ b/exercises/practice/pop-count/pop-count.arr @@ -0,0 +1,7 @@ +use context essentials2020 # Don't delete this line when using Pyret on Exercism + +provide: egg-count end + +fun egg-count(n): + raise("Please implement the egg-count function") +end