ðŸŽ‰ Exercism Research is now launched. Help Exercism, help science and have some fun at research.exercism.io ðŸŽ‰

# rdipardo's solution

## to Space Age in the Clojure Track

Published at Nov 28 2020 · 0 comments
Instructions
Test suite
Solution

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

• Earth: orbital period 365.25 Earth days, or 31557600 seconds
• Mercury: orbital period 0.2408467 Earth years
• Venus: orbital period 0.61519726 Earth years
• 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.

## Source

Partially inspired by Chapter 1 in Chris Pine's online Learn to Program tutorial. http://pine.fm/LearnToProgram/?Chapter=01

## Submitting Incomplete Solutions

It's possible to submit an incomplete solution so you can see how others have completed the exercise.

### space_age_test.clj

``````(ns space-age-test
(:require [clojure.test :refer [deftest is]]
space-age))

(defn- rounds-to
[expected actual]
(is (= (Math/round (* 100.0 expected))
(Math/round (* 100.0 actual)))))

(deftest age-in-earth-years
(rounds-to 31.69 (space-age/on-earth 1000000000)))

(deftest age-in-mercury-years
(let [seconds 2134835688]
(rounds-to 67.65 (space-age/on-earth seconds))
(rounds-to 280.88 (space-age/on-mercury seconds))))

(deftest age-in-venus-years
(let [seconds 189839836]
(rounds-to 6.02 (space-age/on-earth seconds))
(rounds-to 9.78 (space-age/on-venus seconds))))

(deftest age-on-mars
(let [seconds 2329871239]
(rounds-to 73.83 (space-age/on-earth seconds))
(rounds-to 39.25 (space-age/on-mars seconds))))

(deftest age-on-jupiter
(let [seconds 901876382]
(rounds-to 28.58 (space-age/on-earth seconds))
(rounds-to 2.41 (space-age/on-jupiter seconds))))

(deftest age-on-saturn
(let [seconds 3000000000]
(rounds-to 95.06 (space-age/on-earth seconds))
(rounds-to 3.23 (space-age/on-saturn seconds))))

(deftest age-on-uranus
(let [seconds 3210123456]
(rounds-to 101.72 (space-age/on-earth seconds))
(rounds-to 1.21 (space-age/on-uranus seconds))))

(deftest age-on-neptune
(let [seconds 8210123456]
(rounds-to 260.16 (space-age/on-earth seconds))
(rounds-to 1.58 (space-age/on-neptune seconds))))``````
``````(ns space-age)

(defrecord Planet [name earth-orbits])

(defn- ->kw [s]
(if (keyword? s) s (keyword (.toLowerCase (str s)))))

(def ^:private planets
(->>
'(["Mercury" 0.2408467]
["Venus" 0.61519726]
["Earth" 1.0]
["Mars" 1.8808158]
["Jupiter" 11.862615]
["Saturn" 29.447498]
["Uranus" 84.016846]
["Neptune" 164.79132])
(into {}
(map #(assoc {} (->kw (first %)) (apply ->Planet %))))))

(defn- ->earth-years [s & {:keys [planet] :or {planet :earth}}]
(/ s
(*'
(:earth-orbits (get planets (->kw planet) (:earth planets)))
365.25
24.0
(Math/pow 60.0 2.0))))

(defn on-earth [s] (->earth-years s))
(defn on-mercury [s] (->earth-years s :planet :mercury))
(defn on-venus [s] (->earth-years s :planet :venus))
(defn on-mars [s] (->earth-years s :planet :mars))
(defn on-jupiter [s] (->earth-years s :planet :jupiter))
(defn on-saturn [s] (->earth-years s :planet :saturn))
(defn on-uranus [s] (->earth-years s :planet :uranus))
(defn on-neptune [s] (->earth-years s :planet :neptune))``````