From b9201edcc853da7fed0080f4f4cd1437a4711423 Mon Sep 17 00:00:00 2001 From: Kasim Kaizer <155087257+KasimKaizer@users.noreply.github.com> Date: Wed, 1 May 2024 13:57:20 +0400 Subject: [PATCH 1/5] feat(exercise): add testcases, gen.go, metadata, and a stub file for eliud's eggs exercise --- .../eliuds-eggs/.docs/instructions.md | 8 ++++ .../eliuds-eggs/.docs/introduction.md | 47 ++++++++++++++++++ .../practice/eliuds-eggs/.meta/config.json | 17 +++++++ exercises/practice/eliuds-eggs/.meta/gen.go | 48 +++++++++++++++++++ .../practice/eliuds-eggs/.meta/tests.toml | 22 +++++++++ exercises/practice/eliuds-eggs/cases_test.go | 35 ++++++++++++++ exercises/practice/eliuds-eggs/eliuds_eggs.go | 5 ++ .../practice/eliuds-eggs/eliuds_eggs_test.go | 1 + exercises/practice/eliuds-eggs/go.mod | 3 ++ 9 files changed, 186 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/gen.go create mode 100644 exercises/practice/eliuds-eggs/.meta/tests.toml create mode 100644 exercises/practice/eliuds-eggs/cases_test.go create mode 100644 exercises/practice/eliuds-eggs/eliuds_eggs.go create mode 100644 exercises/practice/eliuds-eggs/eliuds_eggs_test.go create mode 100644 exercises/practice/eliuds-eggs/go.mod 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/config.json b/exercises/practice/eliuds-eggs/.meta/config.json new file mode 100644 index 000000000..4a0351469 --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/config.json @@ -0,0 +1,17 @@ +{ + "authors": [], + "files": { + "solution": [ + "eliuds_eggs.go" + ], + "test": [ + "eliuds_eggs_test.go" + ], + "example": [ + ".meta/example.go" + ] + }, + "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/gen.go b/exercises/practice/eliuds-eggs/.meta/gen.go new file mode 100644 index 000000000..28a2443a5 --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/gen.go @@ -0,0 +1,48 @@ +package main + +import ( + "log" + "text/template" + + "go/gen" // "../../../../gen" +) + +func main() { + t, err := template.New("").Parse(tmpl) + if err != nil { + log.Fatal(err) + } + var j = map[string]interface{}{ + "eggCount": &[]testCase{}, + } + if err := gen.Gen("eliuds-eggs", j, t); err != nil { + log.Fatal(err) + } +} + +type testCase struct { + Description string `json:"description"` + Input struct { + Number int `json:"number"` + } `json:"input"` + Expected int `json:"expected"` +} + +// Template to generate various test cases. +var tmpl = `package eliudseggs +{{.Header}} +type testCase struct { + description string + input int + expected int +} + +var testCases = []testCase{ +{{range .J.eggCount}}{ + description: {{printf "%q" .Description}}, + input: {{printf "%d" .Input.Number}}, + expected: {{printf "%d" .Expected}}, + }, +{{end}} +} +` 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/cases_test.go b/exercises/practice/eliuds-eggs/cases_test.go new file mode 100644 index 000000000..ee0111ea3 --- /dev/null +++ b/exercises/practice/eliuds-eggs/cases_test.go @@ -0,0 +1,35 @@ +package eliudseggs + +// This is an auto-generated file. Do not change it manually. Run the generator to update the file. +// See https://github.com/exercism/go#synchronizing-tests-and-instructions +// Source: exercism/problem-specifications +// Commit: 1a96480 Add `eliuds-eggs` exercise (#2382) + +type testCase struct { + description string + input int + expected int +} + +var testCases = []testCase{ + { + description: "0 eggs", + input: 0, + expected: 0, + }, + { + description: "1 egg", + input: 16, + expected: 1, + }, + { + description: "4 eggs", + input: 89, + expected: 4, + }, + { + description: "13 eggs", + input: 2000000000, + expected: 13, + }, +} diff --git a/exercises/practice/eliuds-eggs/eliuds_eggs.go b/exercises/practice/eliuds-eggs/eliuds_eggs.go new file mode 100644 index 000000000..55a67be69 --- /dev/null +++ b/exercises/practice/eliuds-eggs/eliuds_eggs.go @@ -0,0 +1,5 @@ +package eliudseggs + +func EggCount(displayValue int) int { + panic("Please implement the EggCount function") +} diff --git a/exercises/practice/eliuds-eggs/eliuds_eggs_test.go b/exercises/practice/eliuds-eggs/eliuds_eggs_test.go new file mode 100644 index 000000000..64c2e11f9 --- /dev/null +++ b/exercises/practice/eliuds-eggs/eliuds_eggs_test.go @@ -0,0 +1 @@ +package eliudseggs diff --git a/exercises/practice/eliuds-eggs/go.mod b/exercises/practice/eliuds-eggs/go.mod new file mode 100644 index 000000000..3e80b1821 --- /dev/null +++ b/exercises/practice/eliuds-eggs/go.mod @@ -0,0 +1,3 @@ +module eliuds-eggs + +go 1.18 From 497708ac454d8a52193bde5ddcacd0d1ad7d36ef Mon Sep 17 00:00:00 2001 From: Kasim Kaizer <155087257+KasimKaizer@users.noreply.github.com> Date: Wed, 1 May 2024 14:01:15 +0400 Subject: [PATCH 2/5] fix(eliuds-eggs): fix gen.go --- exercises/practice/eliuds-eggs/.meta/gen.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/practice/eliuds-eggs/.meta/gen.go b/exercises/practice/eliuds-eggs/.meta/gen.go index 28a2443a5..5ab0ce068 100644 --- a/exercises/practice/eliuds-eggs/.meta/gen.go +++ b/exercises/practice/eliuds-eggs/.meta/gen.go @@ -4,7 +4,7 @@ import ( "log" "text/template" - "go/gen" // "../../../../gen" + "../../../../gen" ) func main() { From 1c6970cbfbdb875a0a2c44cd98318a87944730fc Mon Sep 17 00:00:00 2001 From: Kasim Kaizer <155087257+KasimKaizer@users.noreply.github.com> Date: Wed, 1 May 2024 14:22:31 +0400 Subject: [PATCH 3/5] update(eliuds-eegs): add test and benchmark for this exercise --- .../practice/eliuds-eggs/eliuds_eggs_test.go | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/exercises/practice/eliuds-eggs/eliuds_eggs_test.go b/exercises/practice/eliuds-eggs/eliuds_eggs_test.go index 64c2e11f9..1231cf117 100644 --- a/exercises/practice/eliuds-eggs/eliuds_eggs_test.go +++ b/exercises/practice/eliuds-eggs/eliuds_eggs_test.go @@ -1 +1,25 @@ package eliudseggs + +import "testing" + +func TestEggCount(t *testing.T) { + for _, tc := range testCases { + t.Run(tc.description, func(t *testing.T) { + got := EggCount(tc.input) + if got != tc.expected { + t.Fatalf("EggCount(%d) = %d, want: %d", tc.input, got, tc.expected) + } + }) + } +} + +func BenchmarkEggCount(b *testing.B) { + if testing.Short() { + b.Skip("skipping benchmark in short mode.") + } + for i := 0; i < b.N; i++ { + for _, tc := range testCases { + EggCount(tc.input) + } + } +} From aa1a4a927d7de71a3a37680cb5145bf152f3179c Mon Sep 17 00:00:00 2001 From: Kasim Kaizer <155087257+KasimKaizer@users.noreply.github.com> Date: Wed, 1 May 2024 14:53:47 +0400 Subject: [PATCH 4/5] update(eliuds-eggs): add example.go and authors --- exercises/practice/eliuds-eggs/.meta/config.json | 6 ++++-- exercises/practice/eliuds-eggs/.meta/example.go | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 exercises/practice/eliuds-eggs/.meta/example.go diff --git a/exercises/practice/eliuds-eggs/.meta/config.json b/exercises/practice/eliuds-eggs/.meta/config.json index 4a0351469..59395080e 100644 --- a/exercises/practice/eliuds-eggs/.meta/config.json +++ b/exercises/practice/eliuds-eggs/.meta/config.json @@ -1,5 +1,7 @@ { - "authors": [], + "authors": [ + "KasimKaizer" + ], "files": { "solution": [ "eliuds_eggs.go" @@ -14,4 +16,4 @@ "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" -} +} \ No newline at end of file diff --git a/exercises/practice/eliuds-eggs/.meta/example.go b/exercises/practice/eliuds-eggs/.meta/example.go new file mode 100644 index 000000000..0a5f05def --- /dev/null +++ b/exercises/practice/eliuds-eggs/.meta/example.go @@ -0,0 +1,14 @@ +// Package eliudseggs contains an example solution for eliuds-eggs exercise. +package eliudseggs + +// EggCount determines the actual egg count from the displayed value. +func EggCount(displayValue int) int { + count := 0 + for displayValue > 0 { + if (displayValue & 1) == 1 { + count++ + } + displayValue >>= 1 + } + return count +} From f4281081372b6479258ce2335e7a5d20eadfca63 Mon Sep 17 00:00:00 2001 From: Kasim Kaizer <155087257+KasimKaizer@users.noreply.github.com> Date: Wed, 1 May 2024 14:56:28 +0400 Subject: [PATCH 5/5] update(config): add eliud's eggs exercise --- config.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/config.json b/config.json index bbf538156..589f8294e 100644 --- a/config.json +++ b/config.json @@ -1325,6 +1325,19 @@ "randomness" ] }, + { + "slug": "eliuds-eggs", + "name": "Eliud's Eggs", + "uuid": "82fb24cc-ac33-4cce-a77a-b59ce3c77832", + "practices": [], + "prerequisites": [], + "difficulty": 4, + "topics": [ + "bitwise_operations", + "integers", + "math" + ] + }, { "slug": "matrix", "name": "Matrix",