From 6018a36ba39c772b412d4b43fd79b749b1a31bd0 Mon Sep 17 00:00:00 2001 From: Kah Goh Date: Sat, 2 Nov 2024 22:32:07 +0800 Subject: [PATCH] Add Eliuds Eggs exercise --- config.json | 8 ++++ .../eliuds-eggs/.docs/instructions.md | 8 ++++ .../eliuds-eggs/.docs/introduction.md | 47 +++++++++++++++++++ .../practice/eliuds-eggs/.meta/config.json | 19 ++++++++ .../practice/eliuds-eggs/.meta/example.ml | 6 +++ .../practice/eliuds-eggs/.meta/tests.toml | 22 +++++++++ exercises/practice/eliuds-eggs/Makefile | 9 ++++ exercises/practice/eliuds-eggs/dune | 16 +++++++ exercises/practice/eliuds-eggs/dune-project | 1 + exercises/practice/eliuds-eggs/eliuds_eggs.ml | 2 + .../practice/eliuds-eggs/eliuds_eggs.mli | 1 + exercises/practice/eliuds-eggs/test.ml | 19 ++++++++ templates/eliuds-eggs/dune-project.tpl | 1 + templates/eliuds-eggs/test.ml.tpl | 15 ++++++ 14 files changed, 174 insertions(+) create mode 100644 exercises/practice/eliuds-eggs/.docs/instructions.md create mode 100644 exercises/practice/eliuds-eggs/.docs/introduction.md create mode 100644 exercises/practice/eliuds-eggs/.meta/config.json create mode 100644 exercises/practice/eliuds-eggs/.meta/example.ml create mode 100644 exercises/practice/eliuds-eggs/.meta/tests.toml create mode 100644 exercises/practice/eliuds-eggs/Makefile create mode 100644 exercises/practice/eliuds-eggs/dune create mode 100644 exercises/practice/eliuds-eggs/dune-project create mode 100644 exercises/practice/eliuds-eggs/eliuds_eggs.ml create mode 100644 exercises/practice/eliuds-eggs/eliuds_eggs.mli create mode 100644 exercises/practice/eliuds-eggs/test.ml create mode 100644 templates/eliuds-eggs/dune-project.tpl create mode 100644 templates/eliuds-eggs/test.ml.tpl diff --git a/config.json b/config.json index 18cf750fa2..7ad9a4d951 100644 --- a/config.json +++ b/config.json @@ -557,6 +557,14 @@ "practices": [], "prerequisites": [], "difficulty": 4 + }, + { + "slug": "eliuds-eggs", + "name": "Eliud's Eggs", + "uuid": "c25941d2-87cb-4558-a605-7d49829a1fc4", + "practices": [], + "prerequisites": [], + "difficulty": 2 } ] }, diff --git a/exercises/practice/eliuds-eggs/.docs/instructions.md b/exercises/practice/eliuds-eggs/.docs/instructions.md new file mode 100644 index 0000000000..b0c2df593c --- /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 0000000000..49eaffd8bc --- /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/.meta/config.json b/exercises/practice/eliuds-eggs/.meta/config.json new file mode 100644 index 0000000000..7eb8fbfbb5 --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "kahgoh" + ], + "files": { + "solution": [ + "eliuds_eggs.ml" + ], + "test": [ + "test.ml" + ], + "example": [ + ".meta/example.ml" + ] + }, + "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.ml b/exercises/practice/eliuds-eggs/.meta/example.ml new file mode 100644 index 0000000000..7d0796e247 --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/example.ml @@ -0,0 +1,6 @@ +let egg_count number = + let rec do_count number acc = + if number = 0 then acc + else do_count (number lsr 1) (acc + (number land 1)) + in + do_count number 0 diff --git a/exercises/practice/eliuds-eggs/.meta/tests.toml b/exercises/practice/eliuds-eggs/.meta/tests.toml new file mode 100644 index 0000000000..e11683c2ef --- /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 0000000000..71989846c5 --- /dev/null +++ b/exercises/practice/eliuds-eggs/Makefile @@ -0,0 +1,9 @@ +default: clean test + +test: + dune runtest + +clean: + dune clean + +.PHONY: clean diff --git a/exercises/practice/eliuds-eggs/dune b/exercises/practice/eliuds-eggs/dune new file mode 100644 index 0000000000..b2c1ed6458 --- /dev/null +++ b/exercises/practice/eliuds-eggs/dune @@ -0,0 +1,16 @@ +(executable + (name test) + (libraries base ounit2)) + +(alias + (name runtest) + (deps (:x test.exe)) + (action (run %{x}))) + +(alias + (name buildtest) + (deps (:x test.exe))) + +(env + (dev + (flags (:standard -warn-error -A)))) diff --git a/exercises/practice/eliuds-eggs/dune-project b/exercises/practice/eliuds-eggs/dune-project new file mode 100644 index 0000000000..7655de0773 --- /dev/null +++ b/exercises/practice/eliuds-eggs/dune-project @@ -0,0 +1 @@ +(lang dune 1.1) diff --git a/exercises/practice/eliuds-eggs/eliuds_eggs.ml b/exercises/practice/eliuds-eggs/eliuds_eggs.ml new file mode 100644 index 0000000000..ca558a1823 --- /dev/null +++ b/exercises/practice/eliuds-eggs/eliuds_eggs.ml @@ -0,0 +1,2 @@ +let egg_count number = + failwith "Please implement 'maximum_value'" diff --git a/exercises/practice/eliuds-eggs/eliuds_eggs.mli b/exercises/practice/eliuds-eggs/eliuds_eggs.mli new file mode 100644 index 0000000000..07592f9b7b --- /dev/null +++ b/exercises/practice/eliuds-eggs/eliuds_eggs.mli @@ -0,0 +1 @@ +val egg_count : int -> int diff --git a/exercises/practice/eliuds-eggs/test.ml b/exercises/practice/eliuds-eggs/test.ml new file mode 100644 index 0000000000..4021a595eb --- /dev/null +++ b/exercises/practice/eliuds-eggs/test.ml @@ -0,0 +1,19 @@ +open OUnit2 +open Eliuds_eggs + +let ae exp got _test_ctxt = + assert_equal exp got ~printer:string_of_int + +let tests = [ + "0 eggs" >:: + ae 0 (egg_count 0); + "1 egg" >:: + ae 1 (egg_count 16); + "4 eggs" >:: + ae 4 (egg_count 89); + "13 eggs" >:: + ae 13 (egg_count 2000000000); +] + +let () = + run_test_tt_main ("eliuds-eggs tests" >::: tests) diff --git a/templates/eliuds-eggs/dune-project.tpl b/templates/eliuds-eggs/dune-project.tpl new file mode 100644 index 0000000000..7655de0773 --- /dev/null +++ b/templates/eliuds-eggs/dune-project.tpl @@ -0,0 +1 @@ +(lang dune 1.1) diff --git a/templates/eliuds-eggs/test.ml.tpl b/templates/eliuds-eggs/test.ml.tpl new file mode 100644 index 0000000000..b9949e4ba5 --- /dev/null +++ b/templates/eliuds-eggs/test.ml.tpl @@ -0,0 +1,15 @@ +open OUnit2 +open Eliuds_eggs + +let ae exp got _test_ctxt = + assert_equal exp got ~printer:string_of_int + +let tests = [ +{{#cases}} + "{{description}}" >:: + ae {{#input}}{{expected}} (egg_count {{number}}){{/input}}; +{{/cases}} +] + +let () = + run_test_tt_main ("eliuds-eggs tests" >::: tests)