From 0a87aa5a7463d3b72fe013ee79a6454fb29eb927 Mon Sep 17 00:00:00 2001 From: Erik Schierboom Date: Mon, 21 Oct 2024 09:11:15 +0200 Subject: [PATCH] Add `eliuds-eggs` exercise (#1290) --- config.json | 8 ++++ exercises/Exercises.sln | 9 ++-- .../eliuds-eggs/.config/dotnet-tools.json | 12 +++++ .../eliuds-eggs/.docs/instructions.md | 8 ++++ .../eliuds-eggs/.docs/introduction.md | 47 +++++++++++++++++++ .../practice/eliuds-eggs/.meta/Example.fs | 9 ++++ .../practice/eliuds-eggs/.meta/config.json | 19 ++++++++ .../practice/eliuds-eggs/.meta/tests.toml | 22 +++++++++ exercises/practice/eliuds-eggs/EliudsEggs.fs | 3 ++ .../practice/eliuds-eggs/EliudsEggs.fsproj | 22 +++++++++ .../practice/eliuds-eggs/EliudsEggsTests.fs | 23 +++++++++ generators/Generators.fs | 3 ++ 12 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 exercises/practice/eliuds-eggs/.config/dotnet-tools.json 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/Example.fs create mode 100644 exercises/practice/eliuds-eggs/.meta/config.json create mode 100644 exercises/practice/eliuds-eggs/.meta/tests.toml create mode 100644 exercises/practice/eliuds-eggs/EliudsEggs.fs create mode 100644 exercises/practice/eliuds-eggs/EliudsEggs.fsproj create mode 100644 exercises/practice/eliuds-eggs/EliudsEggsTests.fs diff --git a/config.json b/config.json index f923b99b2..9ee657724 100644 --- a/config.json +++ b/config.json @@ -2141,6 +2141,14 @@ "practices": [], "prerequisites": [], "difficulty": 1 + }, + { + "slug": "eliuds-eggs", + "name": "Eliud's Eggs", + "uuid": "d5761ed1-a342-45eb-a2b3-95c7bc175046", + "practices": [], + "prerequisites": [], + "difficulty": 2 } ], "foregone": [ diff --git a/exercises/Exercises.sln b/exercises/Exercises.sln index 378b9b917..81002e67b 100644 --- a/exercises/Exercises.sln +++ b/exercises/Exercises.sln @@ -285,6 +285,8 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ResistorColorDuo", "practic EndProject Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "SquareRoot", "practice\square-root\SquareRoot.fsproj", "{C41EB0DE-54C9-4673-8B8B-E9AA43DF3746}" EndProject +Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "EliudsEggs", "practice\eliuds-eggs\EliudsEggs.fsproj", "{9DB2B6C7-E5A4-4AE0-9892-643BEB5F0493}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -848,11 +850,12 @@ Global {D7E215C6-4EE6-41AB-BD80-F126C50A590E}.Release|Any CPU.Build.0 = Release|Any CPU {C41EB0DE-54C9-4673-8B8B-E9AA43DF3746}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C41EB0DE-54C9-4673-8B8B-E9AA43DF3746}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C41EB0DE-54C9-4673-8B8B-E9AA43DF3746}.Release|Any CPU.ActiveCfg = Release|Any CPU {C41EB0DE-54C9-4673-8B8B-E9AA43DF3746}.Release|Any CPU.Build.0 = Release|Any CPU + {9DB2B6C7-E5A4-4AE0-9892-643BEB5F0493}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9DB2B6C7-E5A4-4AE0-9892-643BEB5F0493}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9DB2B6C7-E5A4-4AE0-9892-643BEB5F0493}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution - {9815492D-D8F9-439C-B73C-711693755626} = {9D239135-8242-4AC0-94AE-7CCD8408B531} {5C7A1C6C-25A7-4D4B-89E6-ABE1A3D839B2} = {9D239135-8242-4AC0-94AE-7CCD8408B531} {EAC7B507-0EB0-4D83-9EF0-9421FA2A2A74} = {9D239135-8242-4AC0-94AE-7CCD8408B531} {0F831DDE-1EBF-485D-8517-4EA037EC6FD7} = {9D239135-8242-4AC0-94AE-7CCD8408B531} @@ -991,5 +994,5 @@ Global {6D2CFE86-D6B2-4820-B3D8-62255BF94DCD} = {29984DF2-2734-483C-BC7D-F6D41599DACD} {D7E215C6-4EE6-41AB-BD80-F126C50A590E} = {29984DF2-2734-483C-BC7D-F6D41599DACD} {C41EB0DE-54C9-4673-8B8B-E9AA43DF3746} = {29984DF2-2734-483C-BC7D-F6D41599DACD} + {9DB2B6C7-E5A4-4AE0-9892-643BEB5F0493} = {29984DF2-2734-483C-BC7D-F6D41599DACD} EndGlobalSection -EndGlobal diff --git a/exercises/practice/eliuds-eggs/.config/dotnet-tools.json b/exercises/practice/eliuds-eggs/.config/dotnet-tools.json new file mode 100644 index 000000000..0f7926bad --- /dev/null +++ b/exercises/practice/eliuds-eggs/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "fantomas-tool": { + "version": "4.7.9", + "commands": [ + "fantomas" + ] + } + } +} \ No newline at end of file diff --git a/exercises/practice/eliuds-eggs/.docs/instructions.md b/exercises/practice/eliuds-eggs/.docs/instructions.md new file mode 100644 index 000000000..b0c2df593 --- /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 000000000..49eaffd8b --- /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/Example.fs b/exercises/practice/eliuds-eggs/.meta/Example.fs new file mode 100644 index 000000000..5f685acf2 --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/Example.fs @@ -0,0 +1,9 @@ +module EliudsEggs + +let eggCount n = + let rec loop m count = + match m with + | 0 -> count + | _ -> loop (m >>> 1) (count + if m &&& 1 = 0 then 0 else 1) + + loop n 0 diff --git a/exercises/practice/eliuds-eggs/.meta/config.json b/exercises/practice/eliuds-eggs/.meta/config.json new file mode 100644 index 000000000..d678e78c6 --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "erikschierboom" + ], + "files": { + "solution": [ + "EliudsEggs.fs" + ], + "test": [ + "EliudsEggsTests.fs" + ], + "example": [ + ".meta/Example.fs" + ] + }, + "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/tests.toml b/exercises/practice/eliuds-eggs/.meta/tests.toml new file mode 100644 index 000000000..e11683c2e --- /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/EliudsEggs.fs b/exercises/practice/eliuds-eggs/EliudsEggs.fs new file mode 100644 index 000000000..0cb95bdae --- /dev/null +++ b/exercises/practice/eliuds-eggs/EliudsEggs.fs @@ -0,0 +1,3 @@ +module EliudsEggs + +let eggCount n = failwith "Please implement the 'eggCount' function" diff --git a/exercises/practice/eliuds-eggs/EliudsEggs.fsproj b/exercises/practice/eliuds-eggs/EliudsEggs.fsproj new file mode 100644 index 000000000..13454bf63 --- /dev/null +++ b/exercises/practice/eliuds-eggs/EliudsEggs.fsproj @@ -0,0 +1,22 @@ + + + net8.0 + false + false + true + + + + + + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + \ No newline at end of file diff --git a/exercises/practice/eliuds-eggs/EliudsEggsTests.fs b/exercises/practice/eliuds-eggs/EliudsEggsTests.fs new file mode 100644 index 000000000..3cb015afe --- /dev/null +++ b/exercises/practice/eliuds-eggs/EliudsEggsTests.fs @@ -0,0 +1,23 @@ +module EliudsEggsTests + +open FsUnit.Xunit +open Xunit + +open EliudsEggs + +[] +let ``0 eggs`` () = + eggCount 0 |> should equal 0 + +[] +let ``1 egg`` () = + eggCount 16 |> should equal 1 + +[] +let ``4 eggs`` () = + eggCount 89 |> should equal 4 + +[] +let ``13 eggs`` () = + eggCount 2000000000 |> should equal 13 + diff --git a/generators/Generators.fs b/generators/Generators.fs index c3c5e9928..cdaef5f31 100644 --- a/generators/Generators.fs +++ b/generators/Generators.fs @@ -2038,3 +2038,6 @@ type ResistorColorDuo() = type SquareRoot() = inherit ExerciseGenerator() + +type EliudsEggs() = + inherit ExerciseGenerator()