From 31416d21a9707cb7f1678367a9c8c1b723258f8e Mon Sep 17 00:00:00 2001 From: Kah Goh Date: Thu, 31 Oct 2024 22:06:37 +0800 Subject: [PATCH] Add Eliud's 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.lisp | 14 ++++++ .../practice/eliuds-eggs/.meta/tests.toml | 15 ++++++ .../eliuds-eggs/eliuds-eggs-test.lisp | 36 ++++++++++++++ .../practice/eliuds-eggs/eliuds-eggs.lisp | 7 +++ 8 files changed, 154 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.lisp create mode 100644 exercises/practice/eliuds-eggs/.meta/tests.toml create mode 100644 exercises/practice/eliuds-eggs/eliuds-eggs-test.lisp create mode 100644 exercises/practice/eliuds-eggs/eliuds-eggs.lisp diff --git a/config.json b/config.json index 4541fe1e..b575b69b 100644 --- a/config.json +++ b/config.json @@ -535,6 +535,14 @@ "difficulty": 4, "status": "beta" }, + { + "slug": "eliuds-eggs", + "name": "Eliud's Eggs", + "uuid": "683068c2-97df-430d-a713-b4fca940c12d", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "gigasecond", "name": "Gigasecond", 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/.meta/config.json b/exercises/practice/eliuds-eggs/.meta/config.json new file mode 100644 index 00000000..1375427d --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "kahgoh" + ], + "files": { + "solution": [ + "eliuds-eggs.lisp" + ], + "test": [ + "eliuds-eggs-test.lisp" + ], + "example": [ + ".meta/example.lisp" + ] + }, + "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.lisp b/exercises/practice/eliuds-eggs/.meta/example.lisp new file mode 100644 index 00000000..10e13e38 --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/example.lisp @@ -0,0 +1,14 @@ +(defpackage :eliuds-eggs + (:use :cl) + (:export :egg-count)) + +(in-package :eliuds-eggs) + +(defun do-egg-count (number &optional (acc 0)) + (if (= number 0) + acc + (multiple-value-bind (quot rem) (floor number 2) + (do-egg-count quot (+ acc rem))))) + +(defun egg-count (number) + (do-egg-count number)) diff --git a/exercises/practice/eliuds-eggs/.meta/tests.toml b/exercises/practice/eliuds-eggs/.meta/tests.toml new file mode 100644 index 00000000..ad7b5787 --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/tests.toml @@ -0,0 +1,15 @@ +# This is an auto-generated file. Regular comments will be removed when this +# file is regenerated. Regenerating will not touch any manually added keys, +# so comments can be added in 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/eliuds-eggs-test.lisp b/exercises/practice/eliuds-eggs/eliuds-eggs-test.lisp new file mode 100644 index 00000000..6f8b7171 --- /dev/null +++ b/exercises/practice/eliuds-eggs/eliuds-eggs-test.lisp @@ -0,0 +1,36 @@ +;; Ensures that eliuds-eggs.lisp and the testing library are always loaded +(eval-when (:compile-toplevel :load-toplevel :execute) + (load "eliuds-eggs") + (quicklisp-client:quickload :fiveam)) + +;; Defines the testing package with symbols from eliuds-eggs and FiveAM in scope +;; The `run-tests` function is exported for use by both the user and test-runner +(defpackage :eliuds-eggs-test + (:use :cl :fiveam) + (:export :run-tests)) + +;; Enter the testing package +(in-package :eliuds-eggs-test) + +;; Define and enter a new FiveAM test-suite +(def-suite* eliuds-eggs-suite) + +(test 0-eggs + (let ((number 0)) + (is (= 0 (eliuds-eggs:egg-count number))))) + +(test 1-egg + (let ((number 16)) + (is (= 1 (eliuds-eggs:egg-count number))))) + +(test 4-eggs + (let ((number 89)) + (is (= 4 (eliuds-eggs:egg-count number))))) + +(test 13-eggs + (let ((number 2000000000)) + (is (= 13 (eliuds-eggs:egg-count number))))) + +(defun run-tests (&optional (test-or-suite 'eliuds-eggs-suite)) + "Provides human readable results of test run. Default to entire suite." + (run! test-or-suite)) diff --git a/exercises/practice/eliuds-eggs/eliuds-eggs.lisp b/exercises/practice/eliuds-eggs/eliuds-eggs.lisp new file mode 100644 index 00000000..c56964bb --- /dev/null +++ b/exercises/practice/eliuds-eggs/eliuds-eggs.lisp @@ -0,0 +1,7 @@ +(defpackage :eliuds-eggs + (:use :cl) + (:export :egg-count)) + +(in-package :eliuds-eggs) + +(defun egg-count (number))