Skip to content
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.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions config.json
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,14 @@
"prerequisites": [],
"difficulty": 2
},
{
"slug": "space-age",
"name": "Space Age",
"uuid": "09b96007-c782-4b5e-b929-48bab73b5f69",
"practices": [],
"prerequisites": [],
"difficulty": 2
},
{
"slug": "allergies",
"name": "Allergies",
Expand Down
28 changes: 28 additions & 0 deletions exercises/practice/space-age/.docs/instructions.md
Original file line number Diff line number Diff line change
@@ -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
~~~~
20 changes: 20 additions & 0 deletions exercises/practice/space-age/.docs/introduction.md
Original file line number Diff line number Diff line change
@@ -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
~~~~
19 changes: 19 additions & 0 deletions exercises/practice/space-age/.meta/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"authors": [
"jimmytty"
],
"files": {
"solution": [
"space-age.sql"
],
"test": [
"space-age_test.sql"
],
"example": [
".meta/example.sql"
]
},
"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"
}
21 changes: 21 additions & 0 deletions exercises/practice/space-age/.meta/example.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
DROP TABLE IF EXISTS planets;
CREATE TEMPORARY TABLE planets (
name TEXT UNIQUE NOT NULL,
period REAL NOT NULL
);
INSERT INTO planets (name, period)
VALUES ('Mercury', 0.2408467 ),
('Venus' , 0.61519726),
('Earth' , 1.0 ),
('Mars' , 1.8808158 ),
('Jupiter', 11.862615 ),
('Saturn' , 29.447498 ),
('Uranus' , 84.016846 ),
('Neptune', 164.79132 );

UPDATE "space-age"
SET result = ROUND("space-age".seconds / 31557600.0 / planets.period, 2)
FROM planets
WHERE "space-age".planet = planets.name
AND "space-age".result ISNULL
;
39 changes: 39 additions & 0 deletions exercises/practice/space-age/.meta/tests.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# 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"
include = false
comment = "error testing omitted on purpose"
11 changes: 11 additions & 0 deletions exercises/practice/space-age/create_fixture.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
DROP TABLE IF EXISTS "space-age";
CREATE TABLE "space-age" (
planet TEXT NOT NULL,
seconds INTEGER NOT NULL,
result REAL
);

.mode csv
.import ./data.csv "space-age"

UPDATE "space-age" SET result = NULL;
28 changes: 28 additions & 0 deletions exercises/practice/space-age/create_test_table.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
DROP TABLE IF EXISTS tests;
CREATE TABLE IF NOT EXISTS tests (
-- uuid and description are taken from the test.toml file
uuid TEXT PRIMARY KEY,
description TEXT NOT NULL,
-- The following section is needed by the online test-runner
status TEXT DEFAULT 'fail',
message TEXT,
output TEXT,
test_code TEXT,
task_id INTEGER DEFAULT NULL,
-- Here are columns for the actual tests
planet TEXT NOT NULL,
seconds INTEGER NOT NULL,
expected REAL
);

INSERT INTO tests (uuid, description, planet, seconds, expected)
VALUES
('84f609af-5a91-4d68-90a3-9e32d8a5cd34','age on Earth','Earth',1000000000,31.69),
('ca20c4e9-6054-458c-9312-79679ffab40b','age on Mercury','Mercury',2134835688,280.88),
('502c6529-fd1b-41d3-8fab-65e03082b024','age on Venus','Venus',189839836,9.78),
('9ceadf5e-a0d5-4388-9d40-2c459227ceb8','age on Mars','Mars',2129871239,35.88),
('42927dc3-fe5e-4f76-a5b5-f737fc19bcde','age on Jupiter','Jupiter',901876382,2.41),
('8469b332-7837-4ada-b27c-00ee043ebcad','age on Saturn','Saturn',2000000000,2.15),
('999354c1-76f8-4bb5-a672-f317b6436743','age on Uranus','Uranus',1210123456,0.46),
('80096d30-a0d4-4449-903e-a381178355d8','age on Neptune','Neptune',1821023456,0.35);

8 changes: 8 additions & 0 deletions exercises/practice/space-age/data.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
"Earth",1000000000,""
"Mercury",2134835688,""
"Venus",189839836,""
"Mars",2129871239,""
"Jupiter",901876382,""
"Saturn",2000000000,""
"Uranus",1210123456,""
"Neptune",1821023456,""
7 changes: 7 additions & 0 deletions exercises/practice/space-age/space-age.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
-- Schema: CREATE TABLE "space-age" (
-- planet TEXT NOT NULL,
-- seconds INTEGER NOT NULL,
-- result REAL
-- );
-- Task: update the space-age table and set the result based on planet
-- and seconds.
43 changes: 43 additions & 0 deletions exercises/practice/space-age/space-age_test.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
-- Create database:
.read ./create_fixture.sql

-- Read user student solution and save any output as markdown in user_output.md:
.mode markdown
.output user_output.md
.read ./space-age.sql
.output

-- Create a clean testing environment:
.read ./create_test_table.sql

-- Comparison of user input and the tests updates the status for each test:
UPDATE tests
SET status = 'pass'
FROM (SELECT planet, seconds, result FROM "space-age") AS actual
WHERE (actual.planet, actual.seconds, JSON(actual.result)) = (tests.planet, tests.seconds, JSON(tests.expected));

-- Update message for failed tests to give helpful information:
UPDATE tests
SET message = (
'Result for "'
|| JSON_OBJECT(
'planet', tests.planet,
'seconds', tests.seconds
)
|| '"'
|| ' is <' || COALESCE(actual.result, 'NULL')
|| '> but should be <' || tests.expected || '>'
)
FROM (SELECT planet, seconds, result FROM "space-age") AS actual
WHERE (actual.planet, actual.seconds) = (tests.planet, tests.seconds) AND tests.status = 'fail';

-- Save results to ./output.json (needed by the online test-runner)
.mode json
.once './output.json'
SELECT description, status, message, output, test_code, task_id
FROM tests;

-- Display test results in readable form for the student:
.mode table
SELECT description, status, message
FROM tests;