✅ haskell: space-age
This commit is contained in:
parent
b1ec5d6b16
commit
8d7392977c
88
haskell/space-age/HELP.md
Normal file
88
haskell/space-age/HELP.md
Normal file
@ -0,0 +1,88 @@
|
||||
# Help
|
||||
|
||||
## Running the tests
|
||||
|
||||
To run the test suite, execute the following command:
|
||||
|
||||
```bash
|
||||
stack test
|
||||
```
|
||||
|
||||
#### If you get an error message like this...
|
||||
|
||||
```
|
||||
No .cabal file found in directory
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```
|
||||
RedownloadInvalidResponse Request {
|
||||
...
|
||||
}
|
||||
"/home/username/.stack/build-plan/lts-xx.yy.yaml" (Response {responseStatus = Status {statusCode = 404, statusMessage = "Not Found"},
|
||||
```
|
||||
|
||||
You are probably running an old stack version and need
|
||||
to upgrade it. Try running:
|
||||
|
||||
```bash
|
||||
stack upgrade
|
||||
```
|
||||
|
||||
Or see other options for upgrading at [Stack documentation](https://docs.haskellstack.org/en/stable/install_and_upgrade/#upgrade).
|
||||
|
||||
#### Otherwise, if you get an error message like this...
|
||||
|
||||
```
|
||||
No compiler found, expected minor version match with...
|
||||
Try running "stack setup" to install the correct GHC...
|
||||
```
|
||||
|
||||
Just do as it says and it will download and install
|
||||
the correct compiler version:
|
||||
|
||||
```bash
|
||||
stack setup
|
||||
```
|
||||
|
||||
|
||||
If you want to play with your solution in GHCi, just run the command:
|
||||
|
||||
```bash
|
||||
stack ghci
|
||||
```
|
||||
|
||||
## Submitting your solution
|
||||
|
||||
You can submit your solution using the `exercism submit src/SpaceAge.hs` command.
|
||||
This command will upload your solution to the Exercism website and print the solution page's URL.
|
||||
|
||||
It's possible to submit an incomplete solution which allows you to:
|
||||
|
||||
- See how others have completed the exercise
|
||||
- Request help from a mentor
|
||||
|
||||
## Need to get help?
|
||||
|
||||
If you'd like help solving the exercise, check the following pages:
|
||||
|
||||
- The [Haskell track's documentation](https://exercism.org/docs/tracks/haskell)
|
||||
- [Exercism's support channel on gitter](https://gitter.im/exercism/support)
|
||||
- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
|
||||
|
||||
Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
|
||||
|
||||
## Getting Started
|
||||
|
||||
Please refer to the [installation](https://exercism.io/tracks/haskell/installation)
|
||||
and [learning](https://exercism.io/tracks/haskell/learning) help pages.
|
||||
|
||||
## Feedback, Issues, Pull Requests
|
||||
|
||||
The [exercism/haskell](https://github.com/exercism/haskell) repository on
|
||||
GitHub is the home for all of the Haskell exercises.
|
||||
|
||||
If you have feedback about an exercise, or want to help implementing a new
|
||||
one, head over there and create an issue. We'll do our best to help you!
|
||||
{{ with .Spec.Credits }}
|
59
haskell/space-age/README.md
Normal file
59
haskell/space-age/README.md
Normal file
@ -0,0 +1,59 @@
|
||||
# Space Age
|
||||
|
||||
Welcome to Space Age on Exercism's Haskell Track.
|
||||
If you need help running the tests or submitting your code, check out `HELP.md`.
|
||||
|
||||
## 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](http://www.youtube.com/watch?v=Z_2gbGXzFbs).
|
||||
|
||||
In this exercise, we provided the definition of the
|
||||
[algebric data type](http://learnyouahaskell.com/making-our-own-types-and-typeclasses)
|
||||
named `Planet`.
|
||||
You need to implement the `ageOn` function, that calculates how many
|
||||
years old someone would be on a `Planet`, given an age in seconds.
|
||||
|
||||
Your can use the provided signature if you are unsure about the types, but
|
||||
don't let it restrict your creativity:
|
||||
|
||||
```haskell
|
||||
ageOn :: Planet -> Float -> Float
|
||||
```
|
||||
|
||||
## Source
|
||||
|
||||
### Created by
|
||||
|
||||
- @etrepum
|
||||
|
||||
### Contributed to by
|
||||
|
||||
- @iHiD
|
||||
- @joshgoebel
|
||||
- @kytrinyx
|
||||
- @mttakai
|
||||
- @petertseng
|
||||
- @ppartarr
|
||||
- @rbasso
|
||||
- @sharno
|
||||
- @sshine
|
||||
- @tejasbubane
|
||||
|
||||
### Based on
|
||||
|
||||
Partially inspired by Chapter 1 in Chris Pine's online Learn to Program tutorial. - http://pine.fm/LearnToProgram/?Chapter=01
|
16
haskell/space-age/examples/success-double/package.yaml
Normal file
16
haskell/space-age/examples/success-double/package.yaml
Normal file
@ -0,0 +1,16 @@
|
||||
name: space-age
|
||||
|
||||
dependencies:
|
||||
- base
|
||||
|
||||
library:
|
||||
exposed-modules: SpaceAge
|
||||
source-dirs: src
|
||||
|
||||
tests:
|
||||
test:
|
||||
main: Tests.hs
|
||||
source-dirs: test
|
||||
dependencies:
|
||||
- space-age
|
||||
- hspec
|
16
haskell/space-age/examples/success-rational/package.yaml
Normal file
16
haskell/space-age/examples/success-rational/package.yaml
Normal file
@ -0,0 +1,16 @@
|
||||
name: space-age
|
||||
|
||||
dependencies:
|
||||
- base
|
||||
|
||||
library:
|
||||
exposed-modules: SpaceAge
|
||||
source-dirs: src
|
||||
|
||||
tests:
|
||||
test:
|
||||
main: Tests.hs
|
||||
source-dirs: test
|
||||
dependencies:
|
||||
- space-age
|
||||
- hspec
|
24
haskell/space-age/examples/success-rational/src/SpaceAge.hs
Normal file
24
haskell/space-age/examples/success-rational/src/SpaceAge.hs
Normal file
@ -0,0 +1,24 @@
|
||||
module SpaceAge (Planet(..), ageOn) where
|
||||
|
||||
data Planet = Mercury
|
||||
| Venus
|
||||
| Earth
|
||||
| Mars
|
||||
| Jupiter
|
||||
| Saturn
|
||||
| Uranus
|
||||
| Neptune
|
||||
|
||||
ageOn :: Real a => Planet -> a -> Rational
|
||||
ageOn planet seconds = toRational seconds / (earthPeriod * planetMultiplier)
|
||||
where
|
||||
planetMultiplier = case planet of
|
||||
Mercury -> 0.2408467
|
||||
Venus -> 0.61519726
|
||||
Earth -> 1
|
||||
Mars -> 1.8808158
|
||||
Jupiter -> 11.862615
|
||||
Saturn -> 29.447498
|
||||
Uranus -> 84.016846
|
||||
Neptune -> 164.79132
|
||||
earthPeriod = 31557600
|
21
haskell/space-age/package.yaml
Normal file
21
haskell/space-age/package.yaml
Normal file
@ -0,0 +1,21 @@
|
||||
name: space-age
|
||||
version: 1.2.0.6
|
||||
|
||||
dependencies:
|
||||
- base
|
||||
|
||||
library:
|
||||
exposed-modules: SpaceAge
|
||||
source-dirs: src
|
||||
ghc-options: -Wall
|
||||
# dependencies:
|
||||
# - foo # List here the packages you
|
||||
# - bar # want to use in your solution.
|
||||
|
||||
tests:
|
||||
test:
|
||||
main: Tests.hs
|
||||
source-dirs: test
|
||||
dependencies:
|
||||
- space-age
|
||||
- hspec
|
24
haskell/space-age/src/SpaceAge.hs
Normal file
24
haskell/space-age/src/SpaceAge.hs
Normal file
@ -0,0 +1,24 @@
|
||||
module SpaceAge (Planet(..), ageOn) where
|
||||
|
||||
data Planet = Mercury
|
||||
| Venus
|
||||
| Earth
|
||||
| Mars
|
||||
| Jupiter
|
||||
| Saturn
|
||||
| Uranus
|
||||
| Neptune
|
||||
|
||||
ageOn :: Planet -> Float -> Float
|
||||
ageOn planet seconds = seconds / (earthPeriod * planetMultiplier)
|
||||
where
|
||||
planetMultiplier = case planet of
|
||||
Mercury -> 0.2408467
|
||||
Venus -> 0.61519726
|
||||
Earth -> 1
|
||||
Mars -> 1.8808158
|
||||
Jupiter -> 11.862615
|
||||
Saturn -> 29.447498
|
||||
Uranus -> 84.016846
|
||||
Neptune -> 164.79132
|
||||
earthPeriod = 31557600
|
1
haskell/space-age/stack.yaml
Normal file
1
haskell/space-age/stack.yaml
Normal file
@ -0,0 +1 @@
|
||||
resolver: lts-16.21
|
79
haskell/space-age/test/Tests.hs
Normal file
79
haskell/space-age/test/Tests.hs
Normal file
@ -0,0 +1,79 @@
|
||||
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
|
||||
{-# LANGUAGE RecordWildCards #-}
|
||||
|
||||
import Data.Foldable (for_)
|
||||
import Data.Function (on)
|
||||
import Test.Hspec (Spec, describe, it, shouldBe)
|
||||
import Test.Hspec.Runner (configFastFail, defaultConfig, hspecWith)
|
||||
|
||||
import SpaceAge (Planet(..), ageOn)
|
||||
|
||||
main :: IO ()
|
||||
main = hspecWith defaultConfig {configFastFail = True} specs
|
||||
|
||||
specs :: Spec
|
||||
specs = describe "ageOn" $ for_ cases test
|
||||
where
|
||||
-- Here we used `fromIntegral`, `fromRational` and `toRational` to
|
||||
-- generalize the test suite, allowing any function that takes a
|
||||
-- `Planet` and a number, returning an instance of `Real`.
|
||||
test Case{..} = it description $ expression `shouldBeAround` expected
|
||||
where
|
||||
expression = fromRational
|
||||
. toRational
|
||||
. ageOn planet
|
||||
. fromIntegral
|
||||
$ seconds
|
||||
shouldBeAround = shouldBe `on` roundTo 2
|
||||
roundTo n = (/ 10 ^ n) . fromIntegral . round . (* 10 ^ n)
|
||||
|
||||
data Case = Case { description :: String
|
||||
, planet :: Planet
|
||||
, seconds :: Integer
|
||||
, expected :: Double
|
||||
}
|
||||
|
||||
cases :: [Case]
|
||||
cases = [ Case { description = "Earth"
|
||||
, planet = Earth
|
||||
, seconds = 1000000000
|
||||
, expected = 31.69
|
||||
}
|
||||
, Case { description = "Mercury"
|
||||
, planet = Mercury
|
||||
, seconds = 2134835688
|
||||
, expected = 280.88
|
||||
}
|
||||
, Case { description = "Venus"
|
||||
, planet = Venus
|
||||
, seconds = 189839836
|
||||
, expected = 9.78
|
||||
}
|
||||
, Case { description = "Mars"
|
||||
, planet = Mars
|
||||
, seconds = 2129871239
|
||||
, expected = 35.88
|
||||
}
|
||||
, Case { description = "Jupiter"
|
||||
, planet = Jupiter
|
||||
, seconds = 901876382
|
||||
, expected = 2.41
|
||||
}
|
||||
, Case { description = "Saturn"
|
||||
, planet = Saturn
|
||||
, seconds = 2000000000
|
||||
, expected = 2.15
|
||||
}
|
||||
, Case { description = "Uranus"
|
||||
, planet = Uranus
|
||||
, seconds = 1210123456
|
||||
, expected = 0.46
|
||||
}
|
||||
, Case { description = "Neptune"
|
||||
, planet = Neptune
|
||||
, seconds = 1821023456
|
||||
, expected = 0.35
|
||||
}
|
||||
]
|
||||
|
||||
-- 33c40fce28c835600282d0bfdc589d7c6d785f6e
|
Loading…
x
Reference in New Issue
Block a user