Repository: exercism/clojure
Pull request #694 (2024-10-31 09:19:09)

Add Eliud's eggs exercise
This is one of the [48in24 exercises](https://forum.exercism.org/t/48in24-exercise-11-05-eliuds-eggs/12900/3)

tasxatzial: @kahgoh Since the instructions mention a `bit-count` function that doesn’t actually exist, I’ve added a small appendix to ensure there’s no confusion.
tasxatzial: I see, so a solution that looks like so would be considered ok?

```
(defn egg-count [number]
  (->> (Integer/toBinaryString number)
       count
       range
       (map #(bit-test number %))
       (filter true?)
       count))
```

This converts to a binary string, constructs a list from 1 to the number of its digits, maps bit-test over that list to check if the bit at each index is true or false, and finally counts the number of true values.
tasxatzial: Okay, I'll allow the `bit-*` functions for now and re-evaluate once community solutions start coming in.

Patch:
diff --git a/config.json b/config.json
index aacb72e..8081877 100644
--- a/config.json
+++ b/config.json
@@ -349,6 +349,16 @@
           "math"
         ]
       },
+      {
+        "slug": "eliuds-eggs",
+        "name": "Eliud's Eggs",
+        "uuid": "bfe1789f-8388-4285-bed9-26f694e12c70",
+        "practices": [],
+        "prerequisites": [
+          "basics"
+        ],
+        "difficulty": 2
+      },
       {
         "slug": "etl",
         "name": "ETL",
diff --git a/exercises/practice/eliuds-eggs/.docs/instructions.md b/exercises/practice/eliuds-eggs/.docs/instructions.md
new file mode 100644
index 0000000..b0c2df5
--- /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 0000000..49eaffd
--- /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 0000000..b861900
--- /dev/null
+++ b/exercises/practice/eliuds-eggs/.meta/config.json
@@ -0,0 +1,19 @@
+{
+  "authors": [
+    "kahgoh"
+  ],
+  "files": {
+    "solution": [
+      "src/eliuds_eggs.clj"
+    ],
+    "test": [
+      "test/eliuds_eggs_test.clj"
+    ],
+    "example": [
+      ".meta/src/example.clj"
+    ]
+  },
+  "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/src/example.clj b/exercises/practice/eliuds-eggs/.meta/src/example.clj
new file mode 100644
index 0000000..7502808
--- /dev/null
+++ b/exercises/practice/eliuds-eggs/.meta/src/example.clj
@@ -0,0 +1,7 @@
+(ns eliuds-eggs)
+
+(defn egg-count [number]
+  (loop [value number acc 0]
+    (if (= 0 value)
+      acc
+      (recur (quot value 2) (+ acc (rem value 2))))))
\ No newline at end of file
diff --git a/exercises/practice/eliuds-eggs/deps.edn b/exercises/practice/eliuds-eggs/deps.edn
new file mode 100644
index 0000000..561c3e2
--- /dev/null
+++ b/exercises/practice/eliuds-eggs/deps.edn
@@ -0,0 +1,6 @@
+{:aliases {:test {:extra-paths ["test"]
+                 :extra-deps {io.github.cognitect-labs/test-runner 
+                              {:git/url "https://github.com/cognitect-labs/test-runner.git"
+                               :sha "705ad25bbf0228b1c38d0244a36001c2987d7337"}}
+                 :main-opts ["-m" "cognitect.test-runner"]
+                 :exec-fn cognitect.test-runner.api/test}}}
\ No newline at end of file
diff --git a/exercises/practice/eliuds-eggs/project.clj b/exercises/practice/eliuds-eggs/project.clj
new file mode 100644
index 0000000..d73dacf
--- /dev/null
+++ b/exercises/practice/eliuds-eggs/project.clj
@@ -0,0 +1,4 @@
+(defproject eliuds-eggs "0.1.0-SNAPSHOT"
+  :description "eliuds-eggs exercise."
+  :url "https://github.com/exercism/clojure/tree/master/exercises/eliuds-eggs"
+  :dependencies [[org.clojure/clojure "1.10.0"]])
diff --git a/exercises/practice/eliuds-eggs/src/eliuds_eggs.clj b/exercises/practice/eliuds-eggs/src/eliuds_eggs.clj
new file mode 100644
index 0000000..1ade79a
--- /dev/null
+++ b/exercises/practice/eliuds-eggs/src/eliuds_eggs.clj
@@ -0,0 +1,5 @@
+(ns eliuds-eggs)
+
+(defn egg-count [number]
+    ;; your code goes here
+)
\ No newline at end of file


Test patch:
diff --git a/exercises/practice/eliuds-eggs/.meta/tests.toml b/exercises/practice/eliuds-eggs/.meta/tests.toml
new file mode 100644
index 0000000..e11683c
--- /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/test/eliuds_eggs_test.clj b/exercises/practice/eliuds-eggs/test/eliuds_eggs_test.clj
new file mode 100644
index 0000000..e660f18
--- /dev/null
+++ b/exercises/practice/eliuds-eggs/test/eliuds_eggs_test.clj
@@ -0,0 +1,15 @@
+(ns eliuds-eggs-test
+  (:require [clojure.test :refer [deftest is]]
+            eliuds-eggs))
+
+(deftest no-eggs
+  (is (= 0 (eliuds-eggs/egg-count 0))))
+
+(deftest one-egg
+  (is (= 1 (eliuds-eggs/egg-count 16))))
+
+(deftest four-eggs
+  (is (= 4 (eliuds-eggs/egg-count 89))))
+
+(deftest thirteen-eggs
+  (is (= 13 (eliuds-eggs/egg-count 2000000000))))
\ No newline at end of file