Skip to content

Commit

Permalink
Add Pop Count practice exercise
Browse files Browse the repository at this point in the history
  • Loading branch information
kahgoh committed Oct 27, 2023
1 parent 0d81870 commit aefb29d
Show file tree
Hide file tree
Showing 12 changed files with 216 additions and 0 deletions.
12 changes: 12 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -1701,6 +1701,18 @@
],
"difficulty": 3
},
{
"slug": "pop-count",
"name": "Pop Count",
"uuid": "8a9d6e1e-9188-44c9-8681-ade84d340dd0",
"practices": [
"bit-manipulation"
],
"prerequisites": [
"bit-manipulation"
],
"difficulty": 3
},
{
"slug": "word-count",
"name": "Word Count",
Expand Down
8 changes: 8 additions & 0 deletions exercises/practice/pop-count/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -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.
47 changes: 47 additions & 0 deletions exercises/practice/pop-count/.docs/introduction.md
Original file line number Diff line number Diff line change
@@ -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
```
4 changes: 4 additions & 0 deletions exercises/practice/pop-count/.formatter.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# Used by "mix format"
[
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
]
24 changes: 24 additions & 0 deletions exercises/practice/pop-count/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# The directory Mix will write compiled artifacts to.
/_build/

# If you run "mix test --cover", coverage assets end up here.
/cover/

# The directory Mix downloads your dependencies sources to.
/deps/

# Where third-party dependencies like ExDoc output generated docs.
/doc/

# Ignore .fetch files in case you like to edit your project deps locally.
/.fetch

# If the VM crashes, it generates a dump, let's ignore it too.
erl_crash.dump

# Also ignore archive artifacts (built via "mix archive.build").
*.ez

# Ignore package tarball (built via "mix hex.build").
isogram-*.tar

19 changes: 19 additions & 0 deletions exercises/practice/pop-count/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"kahgoh"
],
"files": {
"solution": [
"lib/pop_count.ex"
],
"test": [
"test/pop_count_test.exs"
],
"example": [
".meta/example.ex"
]
},
"blurb": "Count the 1 bits in a number",
"source": "Christian Willner, Eric Willigers",
"source_url": "https://forum.exercism.org/t/new-exercise-suggestion-pop-count/7632/5"
}
17 changes: 17 additions & 0 deletions exercises/practice/pop-count/.meta/example.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import Bitwise

defmodule PopCount do
@doc """
Given the number, count the number of eggs.
"""
@spec eggCount(number :: integer()) :: non_neg_integer()
def eggCount(number) do
do_count(number, 0)
end

defp do_count(0, acc), do: acc

defp do_count(number, acc) when number > 0 do
do_count(number >>> 1, acc + (number &&& 1))
end
end
23 changes: 23 additions & 0 deletions exercises/practice/pop-count/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# 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"
include = false

[97223282-f71e-490c-92f0-b3ec9e275aba]
description = "1 egg"

[1f8fd18f-26e9-4144-9a0e-57cdfc4f4ff5]
description = "4 eggs"

[0c18be92-a498-4ef2-bcbb-28ac4b06cb81]
description = "13 eggs"
8 changes: 8 additions & 0 deletions exercises/practice/pop-count/lib/pop_count.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
defmodule PopCount do
@doc """
Given the number, count the number of eggs.
"""
@spec eggCount(number :: integer()) :: non_neg_integer()
def eggCount(number) do
end
end
28 changes: 28 additions & 0 deletions exercises/practice/pop-count/mix.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
defmodule PopCount.MixProject do
use Mix.Project

def project do
[
app: :pop_count,
version: "0.1.0",
# elixir: "~> 1.8",
start_permanent: Mix.env() == :prod,
deps: deps()
]
end

# Run "mix help compile.app" to learn about applications.
def application do
[
extra_applications: [:logger]
]
end

# Run "mix help deps" to learn about dependencies.
defp deps do
[
# {:dep_from_hexpm, "~> 0.3.0"},
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
]
end
end
24 changes: 24 additions & 0 deletions exercises/practice/pop-count/test/pop_count_test.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
defmodule PopCountTest do
use ExUnit.Case

describe "egg count" do
test "0 eggs" do
assert PopCount.eggCount(0) == 0
end

@tag :pending
test "1 egg" do
assert PopCount.eggCount(16) == 1
end

@tag :pending
test "4 eggs" do
assert PopCount.eggCount(89) == 4
end

@tag :pending
test "13 eggs" do
assert PopCount.eggCount(2_000_000_000) == 13
end
end
end
2 changes: 2 additions & 0 deletions exercises/practice/pop-count/test/test_helper.exs
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ExUnit.start()
ExUnit.configure(exclude: :pending, trace: true)

0 comments on commit aefb29d

Please sign in to comment.