Skip to content

Instantly share code, notes, and snippets.

@ahsio
Created April 3, 2025 22:36
Show Gist options
  • Select an option

  • Save ahsio/e25a8aa8d6666a62b93a4b931995b8aa to your computer and use it in GitHub Desktop.

Select an option

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.
<?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)
*/
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