From 8f85a65fb281718371adcc2c6971833b82e3057b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Fri, 31 May 2024 22:20:29 -0700 Subject: [PATCH] Add space-age --- config.json | 8 +++ .../practice/space-age/.docs/instructions.md | 28 ++++++++++ .../practice/space-age/.docs/introduction.md | 20 +++++++ .../practice/space-age/.meta/config.json | 19 +++++++ .../practice/space-age/.meta/src/example.art | 21 +++++++ exercises/practice/space-age/.meta/tests.toml | 37 ++++++++++++ .../practice/space-age/src/space-age.art | 4 ++ exercises/practice/space-age/tester.art | 3 + .../space-age/tests/test-space-age.art | 56 +++++++++++++++++++ 9 files changed, 196 insertions(+) create mode 100644 exercises/practice/space-age/.docs/instructions.md create mode 100644 exercises/practice/space-age/.docs/introduction.md create mode 100644 exercises/practice/space-age/.meta/config.json create mode 100644 exercises/practice/space-age/.meta/src/example.art create mode 100644 exercises/practice/space-age/.meta/tests.toml create mode 100644 exercises/practice/space-age/src/space-age.art create mode 100644 exercises/practice/space-age/tester.art create mode 100644 exercises/practice/space-age/tests/test-space-age.art diff --git a/config.json b/config.json index f9cb167..b5b0c64 100644 --- a/config.json +++ b/config.json @@ -220,6 +220,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "space-age", + "name": "Space Age", + "uuid": "4566ed23-4c05-4a1a-86b3-536111ac3d13", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "eliuds-eggs", "name": "Eliud's Eggs", diff --git a/exercises/practice/space-age/.docs/instructions.md b/exercises/practice/space-age/.docs/instructions.md new file mode 100644 index 0000000..f23b5e2 --- /dev/null +++ b/exercises/practice/space-age/.docs/instructions.md @@ -0,0 +1,28 @@ +# Instructions + +Given an age in seconds, calculate how old someone would be on a planet in our Solar System. + +One Earth year equals 365.25 Earth days, or 31,557,600 seconds. +If you were told someone was 1,000,000,000 seconds old, their age would be 31.69 Earth-years. + +For the other planets, you have to account for their orbital period in Earth Years: + +| Planet | Orbital period in Earth Years | +| ------- | ----------------------------- | +| Mercury | 0.2408467 | +| Venus | 0.61519726 | +| Earth | 1.0 | +| Mars | 1.8808158 | +| Jupiter | 11.862615 | +| Saturn | 29.447498 | +| Uranus | 84.016846 | +| Neptune | 164.79132 | + +~~~~exercism/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. + +[year]: https://en.wikipedia.org/wiki/Year#Summary +~~~~ diff --git a/exercises/practice/space-age/.docs/introduction.md b/exercises/practice/space-age/.docs/introduction.md new file mode 100644 index 0000000..014d788 --- /dev/null +++ b/exercises/practice/space-age/.docs/introduction.md @@ -0,0 +1,20 @@ +# Introduction + +The year is 2525 and you've just embarked on a journey to visit all planets in the Solar System (Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus and Neptune). +The first stop is Mercury, where customs require you to fill out a form (bureaucracy is apparently _not_ Earth-specific). +As you hand over the form to the customs officer, they scrutinize it and frown. +"Do you _really_ expect me to believe you're just 50 years old? +You must be closer to 200 years old!" + +Amused, you wait for the customs officer to start laughing, but they appear to be dead serious. +You realize that you've entered your age in _Earth years_, but the officer expected it in _Mercury years_! +As Mercury's orbital period around the sun is significantly shorter than Earth, you're actually a lot older in Mercury years. +After some quick calculations, you're able to provide your age in Mercury Years. +The customs officer smiles, satisfied, and waves you through. +You make a mental note to pre-calculate your planet-specific age _before_ future customs checks, to avoid such mix-ups. + +~~~~exercism/note +If you're wondering why Pluto didn't make the cut, go watch [this YouTube video][pluto-video]. + +[pluto-video]: https://www.youtube.com/watch?v=Z_2gbGXzFbs +~~~~ diff --git a/exercises/practice/space-age/.meta/config.json b/exercises/practice/space-age/.meta/config.json new file mode 100644 index 0000000..ef3c037 --- /dev/null +++ b/exercises/practice/space-age/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "src/space-age.art" + ], + "test": [ + "tests/test-space-age.art" + ], + "example": [ + ".meta/src/example.art" + ] + }, + "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" +} diff --git a/exercises/practice/space-age/.meta/src/example.art b/exercises/practice/space-age/.meta/src/example.art new file mode 100644 index 0000000..aa4c32b --- /dev/null +++ b/exercises/practice/space-age/.meta/src/example.art @@ -0,0 +1,21 @@ +earthOrbitLength: 31557600.0 + +orbitRatios: #[ + earth: 1.0 + mercury: 0.2408467 + venus: 0.61519726 + mars: 1.8808158 + jupiter: 11.862615 + saturn: 29.447498 + uranus: 84.016846 + neptune: 164.79132 +] + +ageOn: function [planet seconds][ + planet: lower planet + earthAge: seconds / earthOrbitLength + switch key? orbitRatios planet + -> earthAge / orbitRatios\[planet] + -> null +] + diff --git a/exercises/practice/space-age/.meta/tests.toml b/exercises/practice/space-age/.meta/tests.toml new file mode 100644 index 0000000..7957bb7 --- /dev/null +++ b/exercises/practice/space-age/.meta/tests.toml @@ -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" diff --git a/exercises/practice/space-age/src/space-age.art b/exercises/practice/space-age/src/space-age.art new file mode 100644 index 0000000..5987e14 --- /dev/null +++ b/exercises/practice/space-age/src/space-age.art @@ -0,0 +1,4 @@ +ageOn: function [planet seconds][ + panic "Please implement the ageOn function" +] + diff --git a/exercises/practice/space-age/tester.art b/exercises/practice/space-age/tester.art new file mode 100644 index 0000000..80f4a8f --- /dev/null +++ b/exercises/practice/space-age/tester.art @@ -0,0 +1,3 @@ +import {unitt}! + +runTests.failFast findTests "tests" diff --git a/exercises/practice/space-age/tests/test-space-age.art b/exercises/practice/space-age/tests/test-space-age.art new file mode 100644 index 0000000..dc8306d --- /dev/null +++ b/exercises/practice/space-age/tests/test-space-age.art @@ -0,0 +1,56 @@ +import {unitt}! +import {src/space-age}! + +approximately?: function [value target][ + lower: value - 0.01 + upper: value + 0.01 + + between? target lower upper +] + +suite "Space Age" [ + test "age on Earth" [ + result: ageOn "Earth" 1000000000 + assert -> approximately? result 31.69 + ] + + test.skip "age on Mercury" [ + result: ageOn "Mercury" 2134835688 + assert -> approximately? result 280.88 + ] + + test.skip "age on Venus" [ + result: ageOn "Venus" 189839836 + assert -> approximately? result 9.78 + ] + + test.skip "age on Mars" [ + result: ageOn "Mars" 2129871239 + assert -> approximately? result 35.88 + ] + + test.skip "age on Jupiter" [ + result: ageOn "Jupiter" 901876382 + assert -> approximately? result 2.41 + ] + + test.skip "age on Saturn" [ + result: ageOn "Saturn" 2000000000 + assert -> approximately? result 2.15 + ] + + test.skip "age on Uranus" [ + result: ageOn "Uranus" 1210123456 + assert -> approximately? result 0.46 + ] + + test.skip "age on Neptune" [ + result: ageOn "Neptune" 1821023456 + assert -> approximately? result 0.35 + ] + + test.skip "invalid planet returns null" [ + result: ageOn "Sun" 680804807 + assert -> null? result + ] +]