Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[New Exercise]: Space Age #244

Merged
merged 1 commit into from
Aug 9, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
10 changes: 10 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,16 @@
"prerequisites": [],
"difficulty": 1
},
{
"slug": "space-age",
"name": "Space Age",
"uuid": "76c5078c-9255-44a6-97dd-aab7a1099907",
"practices": [
"dictionaries"
],
"prerequisites": [],
"difficulty": 1
},
{
"slug": "etl",
"name": "Etl",
Expand Down
25 changes: 25 additions & 0 deletions exercises/practice/space-age/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Instructions

Given an age in seconds, calculate how old someone would be on:

- Mercury: orbital period 0.2408467 Earth years
- Venus: orbital period 0.61519726 Earth years
- Earth: orbital period 1.0 Earth years, 365.25 Earth days, or 31557600 seconds
- Mars: orbital period 1.8808158 Earth years
- Jupiter: orbital period 11.862615 Earth years
- Saturn: orbital period 29.447498 Earth years
- Uranus: orbital period 84.016846 Earth years
- Neptune: orbital period 164.79132 Earth years

So if you were told someone were 1,000,000,000 seconds old, you should
be able to say that they're 31.69 Earth-years old.

If you're wondering why Pluto didn't make the cut, go watch [this YouTube video][pluto-video].

Note: The actual length of one complete orbit of the Earth around the sun is closer to 365.256 days (1 sidereal year).
The Gregorian calendar has, on average, 365.2425 days.
While not entirely accurate, 365.25 is the value used in this exercise.
See [Year on Wikipedia][year] for more ways to measure a year.

[pluto-video]: https://www.youtube.com/watch?v=Z_2gbGXzFbs
[year]: https://en.wikipedia.org/wiki/Year#Summary
40 changes: 40 additions & 0 deletions exercises/practice/space-age/.meta/SpaceAge.example.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
Function Get-SpaceAge() {
<#
.SYNOPSIS
Given an age in seconds, calculate how old someone would be on a planet in the solar system. (RIP Pluto)

.DESCRIPTION
The function takes a positive integer, and return a double (float) to show how old someone is on a specific planet.

.PARAMETER $Seconds
The seconds of a person's age.

.PARAMETER $Planet
The planet to calculate how old the person would be on it.
Note: Since the planets in the solar system is a known shortlist, we can just validate the input with a set of values in the params.
If no planet is specified, it should be default to Earth.

.EXAMPLE
Get-SpaceAge -Seconds 1000000000 -Planet Neptune
Retuns: 0.19
#>
[CmdletBinding()]
Param(
[int]$Seconds,
[ValidateSet("Earth", "Mercury","Venus", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune", ErrorMessage = "Invalid planet")]
[string]$Planet = "Earth"
)

$OrbitalPeriods = @{
'Mercury' = 0.2408467
'Venus' = 0.61519726
'Earth' = 1
'Mars' = 1.8808158
'Jupiter' = 11.862615
'Saturn' = 29.447498
'Uranus' = 84.016846
'Neptune' = 164.79132
}
$EarthAge = $Seconds / 31557600
return [math]::Round($EarthAge / $OrbitalPeriods[$Planet],2)
}
17 changes: 17 additions & 0 deletions exercises/practice/space-age/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
{
"authors": ["glaxxie"],
"files": {
"solution": [
"SpaceAge.ps1"
],
"test": [
"SpaceAge.tests.ps1"
],
"example": [
".meta/SpaceAge.example.ps1"
]
},
"blurb": "Given an age in seconds, calculate how old someone is in terms of a given planet's solar years.",
"source": "Partially inspired by Chapter 1 in Chris Pine's online Learn to Program tutorial.",
"source_url": "https://pine.fm/LearnToProgram/?Chapter=01"
}
37 changes: 37 additions & 0 deletions exercises/practice/space-age/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
# 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.

[84f609af-5a91-4d68-90a3-9e32d8a5cd34]
description = "age on Earth"

[ca20c4e9-6054-458c-9312-79679ffab40b]
description = "age on Mercury"

[502c6529-fd1b-41d3-8fab-65e03082b024]
description = "age on Venus"

[9ceadf5e-a0d5-4388-9d40-2c459227ceb8]
description = "age on Mars"

[42927dc3-fe5e-4f76-a5b5-f737fc19bcde]
description = "age on Jupiter"

[8469b332-7837-4ada-b27c-00ee043ebcad]
description = "age on Saturn"

[999354c1-76f8-4bb5-a672-f317b6436743]
description = "age on Uranus"

[80096d30-a0d4-4449-903e-a381178355d8]
description = "age on Neptune"

[57b96e2a-1178-40b7-b34d-f3c9c34e4bf4]
description = "invalid planet causes error"
28 changes: 28 additions & 0 deletions exercises/practice/space-age/SpaceAge.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
Function Get-SpaceAge() {
<#
.SYNOPSIS
Given an age in seconds, calculate how old someone would be on a planet in the solar system. (RIP Pluto)

.DESCRIPTION
The function takes a positive integer, and return a double (float) to show how old someone is on a specific planet.

.PARAMETER $Seconds
The seconds of a person's age.

.PARAMETER $Planet
The planet to calculate how old the person would be on it.
Note: Since the planets in the solar system is a known shortlist, we can just validate the input with a set of values in the params.
If no planet is specified, it should be default to Earth.

.EXAMPLE
Get-SpaceAge -Seconds 1000000000 -Planet Neptune
Retuns: 0.19
#>
[CmdletBinding()]
Param(
[int]$Seconds,
[ValidateSet]
[string]$Planet
)
Throw "Please implement this function"
}
76 changes: 76 additions & 0 deletions exercises/practice/space-age/SpaceAge.tests.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
BeforeAll {
. "./SpaceAge.ps1"
}

Describe "Space Age test cases" {
Context "passing tests" {
It "age on Earth" {
$got = Get-SpaceAge -Seconds 1000000000 -Planet Earth
$want = 31.69

$got | Should -Be $want
}

It "no planet provided should default to Earth" {
$got = Get-SpaceAge -Seconds 1000000000
$want = 31.69

$got | Should -Be $want
}

It "age on Mercury" {
$got = Get-SpaceAge -Seconds 2134835688 -Planet Mercury
$want = 280.88

$got | Should -Be $want
}

It "age on Venus" {
$got = Get-SpaceAge -Seconds 189839836 -Planet Venus
$want = 9.78

$got | Should -Be $want
}

It "age on Mars" {
$got = Get-SpaceAge -Seconds 2129871239 -Planet Mars
$want = 35.88

$got | Should -Be $want
}

It "age on Jupiter" {
$got = Get-SpaceAge -Seconds 901876382 -Planet Jupiter
$want = 2.41

$got | Should -Be $want
}

It "age on Saturn" {
$got = Get-SpaceAge -Seconds 2000000000 -Planet Saturn
$want = 2.15

$got | Should -Be $want
}

It "age on Uranus" {
$got = Get-SpaceAge -Seconds 1210123456 -Planet Uranus
$want = 0.46

$got | Should -Be $want
}

It "age on Neptune" {
$got = Get-SpaceAge -Seconds 1821023456 -Planet Neptune
$want = 0.35

$got | Should -Be $want
}
}

Context "invalid input" {
It "invalid planet give error" {
{ Get-SpaceAge -Seconds 1000000000 -Planet Pluto } | Should -Throw "Cannot validate argument on parameter 'Planet'. Invalid planet"
}
}
}