Skip to content

Commit

Permalink
Add Eliuds Eggs exercise
Browse files Browse the repository at this point in the history
  • Loading branch information
homersimpsons committed Feb 25, 2024
1 parent 2efa3a3 commit b2d7f72
Show file tree
Hide file tree
Showing 9 changed files with 234 additions and 0 deletions.
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -1227,6 +1227,14 @@
"practices": [],
"prerequisites": [],
"difficulty": 5
},
{
"slug": "eliuds-eggs",
"name": "Eliud's Eggs",
"uuid": "9a8df843-8805-4287-b863-b8123defc266",
"practices": [],
"prerequisites": [],
"difficulty": 5
}
]
},
Expand Down
13 changes: 13 additions & 0 deletions exercises/practice/eliuds-eggs/.docs/instructions.append.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
## Bitwise operators

In PHP there are [bitwise operators](https://www.php.net/manual/en/language.operators.bitwise.php).

For example, the "bitwise and" operator (`&`) can be used to check that a bit of a number is defined:
```php
$number = 89; // 0b01011001
$mask16 = 16; // 0b00010000
$mask32 = 32; // 0b00100000

$isMask16 = ($number & $mask16) > 0; // 0b00010000 > 0 => TRUE
$isMask32 = ($number & $mask32) > 0; // 0b00000000 > 0 => FALSE
```
8 changes: 8 additions & 0 deletions exercises/practice/eliuds-eggs/.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/eliuds-eggs/.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
```
19 changes: 19 additions & 0 deletions exercises/practice/eliuds-eggs/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"homersimpsons"
],
"files": {
"solution": [
"EliudsEggs.php"
],
"test": [
"EliudsEggsTest.php"
],
"example": [
".meta/example.php"
]
},
"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"
}
15 changes: 15 additions & 0 deletions exercises/practice/eliuds-eggs/.meta/example.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

class EliudsEggs
{
public function eggCount(int $displayValue): int
{
if ($displayValue === 0) {
return 0;
}

return ($displayValue & 1) + $this->eggCount($displayValue >> 1);
}
}
22 changes: 22 additions & 0 deletions exercises/practice/eliuds-eggs/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -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"
33 changes: 33 additions & 0 deletions exercises/practice/eliuds-eggs/EliudsEggs.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

/*
* By adding type hints and enabling strict type checking, code can become
* easier to read, self-documenting and reduce the number of potential bugs.
* By default, type declarations are non-strict, which means they will attempt
* to change the original type to match the type specified by the
* type-declaration.
*
* In other words, if you pass a string to a function requiring a float,
* it will attempt to convert the string value to a float.
*
* To enable strict mode, a single declare directive must be placed at the top
* of the file.
* This means that the strictness of typing is configured on a per-file basis.
* This directive not only affects the type declarations of parameters, but also
* a function's return type.
*
* For more info review the Concept on strict type checking in the PHP track
* <link>.
*
* To disable strict typing, comment out the directive below.
*/

declare(strict_types=1);

class EliudsEggs
{
public function eggCount(int $displayValue): int
{
throw new \BadMethodCallException("Implement the eggCount function");
}
}
69 changes: 69 additions & 0 deletions exercises/practice/eliuds-eggs/EliudsEggsTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
<?php

/*
* By adding type hints and enabling strict type checking, code can become
* easier to read, self-documenting and reduce the number of potential bugs.
* By default, type declarations are non-strict, which means they will attempt
* to change the original type to match the type specified by the
* type-declaration.
*
* In other words, if you pass a string to a function requiring a float,
* it will attempt to convert the string value to a float.
*
* To enable strict mode, a single declare directive must be placed at the top
* of the file.
* This means that the strictness of typing is configured on a per-file basis.
* This directive not only affects the type declarations of parameters, but also
* a function's return type.
*
* For more info review the Concept on strict type checking in the PHP track
* <link>.
*
* To disable strict typing, comment out the directive below.
*/

declare(strict_types=1);

class EliudsEggsTest extends PHPUnit\Framework\TestCase
{
public static function setUpBeforeClass(): void
{
require_once 'EliudsEggs.php';
}

/**
* @testdox 0 eggs
*/
public function test0Eggs()
{
$eliudsEggs = new EliudsEggs();
$this->assertEquals(0, $eliudsEggs->eggCount(0));
}

/**
* @testdox 1 eggs
*/
public function test1Eggs()
{
$eliudsEggs = new EliudsEggs();
$this->assertEquals(1, $eliudsEggs->eggCount(16));
}

/**
* @testdox 4 eggs
*/
public function test4Eggs()
{
$eliudsEggs = new EliudsEggs();
$this->assertEquals(4, $eliudsEggs->eggCount(89));
}

/**
* @testdox 13 eggs
*/
public function test13Eggs()
{
$eliudsEggs = new EliudsEggs();
$this->assertEquals(13, $eliudsEggs->eggCount(2000000000));
}
}

0 comments on commit b2d7f72

Please sign in to comment.