Created
April 3, 2025 22:36
-
-
Save ahsio/e25a8aa8d6666a62b93a4b931995b8aa to your computer and use it in GitHub Desktop.
Exercise2 - Skill level ordered by the number of people, with the skill that most people have coming first.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| <?php | |
| $input = [ | |
| [ | |
| "id"=> 1, | |
| "name"=> "Teri Dalby", | |
| "skill"=> "Mountainbiking", | |
| "skillLevel"=> 10 | |
| ], | |
| [ | |
| "id"=> 2, | |
| "name"=> "Briana Durham", | |
| "skill"=> "Mountainbiking", | |
| "skillLevel"=> 3 | |
| ], | |
| [ | |
| "id"=> 3, | |
| "name"=> "Ellie Choi", | |
| "skill"=> "Skiing", | |
| "skillLevel"=> 7 | |
| ], | |
| [ | |
| "id"=> 4, | |
| "name"=> "Teri Dalby", | |
| "skill"=> "Paragliding", | |
| "skillLevel"=> 6 | |
| ], | |
| [ | |
| "id"=> 5, | |
| "name"=> "Briana Durham", | |
| "skill"=> "Paragliding", | |
| "skillLevel"=> 5 | |
| ], | |
| [ | |
| "id"=> 6, | |
| "name"=> "Cian Galert", | |
| "skill"=> "Mountainbiking", | |
| "skillLevel"=> 5 | |
| ] | |
| ]; | |
| function printTopLevelSkills(array $input) { | |
| $results = []; | |
| foreach ($input as $entry) { | |
| if (! array_key_exists($entry['skill'], $results)) { | |
| // bootstrap | |
| $results[$entry['skill']] = ['people' => 0, 'level' => 0]; | |
| } | |
| // populate | |
| $results[$entry['skill']] = [ | |
| 'people' => $results[$entry['skill']]['people'] + 1, | |
| 'level' => $results[$entry['skill']]['level'] + $entry['skillLevel'] | |
| ]; | |
| } | |
| // compute average | |
| $average = array_map(function ($result, $key) { | |
| return ['skill' => $key, 'people' => $result['people'], 'average' => $result['level'] / $result['people']]; | |
| }, $results, array_keys($results)); | |
| // sort | |
| usort($average, function ($a, $b) { | |
| return $a['people'] < $b['people']; | |
| }); | |
| return $average; | |
| } | |
| $results = printTopLevelSkills($input); | |
| // display results | |
| foreach ($results as $result) { | |
| echo sprintf( | |
| "%s (%s=>%d, %s=> %d)\n", | |
| $result['skill'], | |
| 'people', | |
| $result['people'], | |
| 'average level', | |
| $result['average'] | |
| ); | |
| } | |
| /** | |
| Expected output=> | |
| Mountainbiking (people=> 3, average level=> 6) | |
| Paragliding (people=> 2, average level=> 5.5) | |
| Skiing (people=> 1, average level=> 7) | |
| */ |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| const input = [ | |
| { | |
| "id": 1, | |
| "name": "Teri Dalby", | |
| "skill": "Mountainbiking", | |
| "skillLevel": 10 | |
| }, | |
| { | |
| "id": 2, | |
| "name": "Briana Durham", | |
| "skill": "Mountainbiking", | |
| "skillLevel": 3 | |
| }, | |
| { | |
| "id": 3, | |
| "name": "Ellie Choi", | |
| "skill": "Skiing", | |
| "skillLevel": 7 | |
| }, | |
| { | |
| "id": 4, | |
| "name": "Teri Dalby", | |
| "skill": "Paragliding", | |
| "skillLevel": 6 | |
| }, | |
| { | |
| "id": 5, | |
| "name": "Briana Durham", | |
| "skill": "Paragliding", | |
| "skillLevel": 5 | |
| }, | |
| { | |
| "id": 6, | |
| "name": "Cian Galert", | |
| "skill": "Mountainbiking", | |
| "skillLevel": 5 | |
| } | |
| ] as const; | |
| type Person = { | |
| id: number; | |
| name: string; | |
| skill: string; | |
| skillLevel: number; | |
| }; | |
| type SkillSummary = { | |
| skill: string; | |
| people: number; | |
| average: number; | |
| }; | |
| function printTopLevelSkills(input: Person[]): SkillSummary[] { | |
| const results: Record<string, { people: number; level: number }> = {}; | |
| input.forEach(entry => { | |
| if (!results[entry.skill]) { | |
| results[entry.skill] = { people: 0, level: 0 }; | |
| } | |
| results[entry.skill].people += 1; | |
| results[entry.skill].level += entry.skillLevel; | |
| }); | |
| const average: SkillSummary[] = Object.keys(results).map(skill => ({ | |
| skill, | |
| people: results[skill].people, | |
| average: results[skill].level / results[skill].people | |
| })); | |
| // Sort by number of people descending | |
| average.sort((a, b) => b.people - a.people); | |
| return average; | |
| } | |
| const results = printTopLevelSkills(input); | |
| // Display results | |
| results.forEach(result => { | |
| console.log(`${result.skill} (people=> ${result.people}, average level=> ${result.average})`); | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment