Initial commit
This commit is contained in:
21
elixir/darts/.exercism/config.json
Normal file
21
elixir/darts/.exercism/config.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"authors": [
|
||||
"jiegillet"
|
||||
],
|
||||
"contributors": [
|
||||
"angelikatyborska"
|
||||
],
|
||||
"files": {
|
||||
"solution": [
|
||||
"lib/darts.ex"
|
||||
],
|
||||
"test": [
|
||||
"test/darts_test.exs"
|
||||
],
|
||||
"example": [
|
||||
".meta/example.ex"
|
||||
]
|
||||
},
|
||||
"blurb": "Write a function that returns the earned points in a single toss of a Darts game.",
|
||||
"source": "Inspired by an exercise created by a professor Della Paolera in Argentina"
|
||||
}
|
||||
1
elixir/darts/.exercism/metadata.json
Normal file
1
elixir/darts/.exercism/metadata.json
Normal file
@@ -0,0 +1 @@
|
||||
{"track":"elixir","exercise":"darts","id":"1062d062de474a2ab65b96bb7027ec45","url":"https://exercism.org/tracks/elixir/exercises/darts","handle":"negrienko","is_requester":true,"auto_approve":false}
|
||||
4
elixir/darts/.formatter.exs
Normal file
4
elixir/darts/.formatter.exs
Normal file
@@ -0,0 +1,4 @@
|
||||
# Used by "mix format"
|
||||
[
|
||||
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
|
||||
]
|
||||
24
elixir/darts/.gitignore
vendored
Normal file
24
elixir/darts/.gitignore
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
# The directory Mix will write compiled artifacts to.
|
||||
/_build/
|
||||
|
||||
# If you run "mix test --cover", coverage assets end up here.
|
||||
/cover/
|
||||
|
||||
# The directory Mix downloads your dependencies sources to.
|
||||
/deps/
|
||||
|
||||
# Where third-party dependencies like ExDoc output generated docs.
|
||||
/doc/
|
||||
|
||||
# Ignore .fetch files in case you like to edit your project deps locally.
|
||||
/.fetch
|
||||
|
||||
# If the VM crashes, it generates a dump, let's ignore it too.
|
||||
erl_crash.dump
|
||||
|
||||
# Also ignore archive artifacts (built via "mix archive.build").
|
||||
*.ez
|
||||
|
||||
# Ignore package tarball (built via "mix hex.build").
|
||||
darts-*.tar
|
||||
|
||||
75
elixir/darts/HELP.md
Normal file
75
elixir/darts/HELP.md
Normal file
@@ -0,0 +1,75 @@
|
||||
# Help
|
||||
|
||||
## Running the tests
|
||||
|
||||
From the terminal, change to the base directory of the exercise then execute the tests with:
|
||||
|
||||
```bash
|
||||
$ mix test
|
||||
```
|
||||
|
||||
This will execute the test file found in the `test` subfolder -- a file ending in `_test.exs`
|
||||
|
||||
Documentation:
|
||||
|
||||
* [`mix test` - Elixir's test execution tool](https://hexdocs.pm/mix/Mix.Tasks.Test.html)
|
||||
* [`ExUnit` - Elixir's unit test library](https://hexdocs.pm/ex_unit/ExUnit.html)
|
||||
|
||||
## Pending tests
|
||||
|
||||
In test suites of practice exercises, all but the first test have been tagged to be skipped.
|
||||
|
||||
Once you get a test passing, you can unskip the next one by commenting out the relevant `@tag :pending` with a `#` symbol.
|
||||
|
||||
For example:
|
||||
|
||||
```elixir
|
||||
# @tag :pending
|
||||
test "shouting" do
|
||||
assert Bob.hey("WATCH OUT!") == "Whoa, chill out!"
|
||||
end
|
||||
```
|
||||
|
||||
If you wish to run all tests at once, you can include all skipped test by using the `--include` flag on the `mix test` command:
|
||||
|
||||
```bash
|
||||
$ mix test --include pending
|
||||
```
|
||||
|
||||
Or, you can enable all the tests by commenting out the `ExUnit.configure` line in the file `test/test_helper.exs`.
|
||||
|
||||
```elixir
|
||||
# ExUnit.configure(exclude: :pending, trace: true)
|
||||
```
|
||||
|
||||
## Useful `mix test` options
|
||||
|
||||
* `test/<FILE>.exs:LINENUM` - runs only a single test, the test from `<FILE>.exs` whose definition is on line `LINENUM`
|
||||
* `--failed` - runs only tests that failed the last time they ran
|
||||
* `--max-failures` - the suite stops evaluating tests when this number of test failures
|
||||
is reached
|
||||
* `--seed 0` - disables randomization so the tests in a single file will always be ran
|
||||
in the same order they were defined in
|
||||
|
||||
## Submitting your solution
|
||||
|
||||
You can submit your solution using the `exercism submit lib/darts.ex` 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 [Elixir track's documentation](https://exercism.org/docs/tracks/elixir)
|
||||
- The [Elixir track's programming category on the forum](https://forum.exercism.org/c/programming/elixir)
|
||||
- [Exercism's programming category on the forum](https://forum.exercism.org/c/programming/5)
|
||||
- The [Frequently Asked Questions](https://exercism.org/docs/using/faqs)
|
||||
|
||||
Should those resources not suffice, you could submit your (incomplete) solution to request mentoring.
|
||||
|
||||
If you're stuck on something, it may help to look at some of the [available resources](https://exercism.org/docs/tracks/elixir/resources) out there where answers might be found.
|
||||
7
elixir/darts/HINTS.md
Normal file
7
elixir/darts/HINTS.md
Normal file
@@ -0,0 +1,7 @@
|
||||
# Hints
|
||||
|
||||
## General
|
||||
|
||||
- The distance of a point `(x, y)` from the center of the target `(0, 0)` can be calculated with `sqrt(x*x + y *y)`
|
||||
|
||||
- You can calculate the square root of `x` by raising it to the power of `1/2`. In other words, `sqrt(x) == pow(x, 0.5)`
|
||||
51
elixir/darts/README.md
Normal file
51
elixir/darts/README.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# Darts
|
||||
|
||||
Welcome to Darts on Exercism's Elixir Track.
|
||||
If you need help running the tests or submitting your code, check out `HELP.md`.
|
||||
If you get stuck on the exercise, check out `HINTS.md`, but try and solve it without using those first :)
|
||||
|
||||
## Instructions
|
||||
|
||||
Write a function that returns the earned points in a single toss of a Darts game.
|
||||
|
||||
[Darts][darts] is a game where players throw darts at a [target][darts-target].
|
||||
|
||||
In our particular instance of the game, the target rewards 4 different amounts of points, depending on where the dart lands:
|
||||
|
||||

|
||||
|
||||
- If the dart lands outside the target, player earns no points (0 points).
|
||||
- If the dart lands in the outer circle of the target, player earns 1 point.
|
||||
- If the dart lands in the middle circle of the target, player earns 5 points.
|
||||
- If the dart lands in the inner circle of the target, player earns 10 points.
|
||||
|
||||
The outer circle has a radius of 10 units (this is equivalent to the total radius for the entire target), the middle circle a radius of 5 units, and the inner circle a radius of 1.
|
||||
Of course, they are all centered at the same point — that is, the circles are [concentric][] defined by the coordinates (0, 0).
|
||||
|
||||
Write a function that given a point in the target (defined by its [Cartesian coordinates][cartesian-coordinates] `x` and `y`, where `x` and `y` are [real][real-numbers]), returns the correct amount earned by a dart landing at that point.
|
||||
|
||||
## Credit
|
||||
|
||||
The scoreboard image was created by [habere-et-dispertire][habere-et-dispertire] using [Inkscape][inkscape].
|
||||
|
||||
[darts]: https://en.wikipedia.org/wiki/Darts
|
||||
[darts-target]: https://en.wikipedia.org/wiki/Darts#/media/File:Darts_in_a_dartboard.jpg
|
||||
[concentric]: https://mathworld.wolfram.com/ConcentricCircles.html
|
||||
[cartesian-coordinates]: https://www.mathsisfun.com/data/cartesian-coordinates.html
|
||||
[real-numbers]: https://www.mathsisfun.com/numbers/real-numbers.html
|
||||
[habere-et-dispertire]: https://exercism.org/profiles/habere-et-dispertire
|
||||
[inkscape]: https://en.wikipedia.org/wiki/Inkscape
|
||||
|
||||
## Source
|
||||
|
||||
### Created by
|
||||
|
||||
- @jiegillet
|
||||
|
||||
### Contributed to by
|
||||
|
||||
- @angelikatyborska
|
||||
|
||||
### Based on
|
||||
|
||||
Inspired by an exercise created by a professor Della Paolera in Argentina
|
||||
17
elixir/darts/lib/darts.ex
Normal file
17
elixir/darts/lib/darts.ex
Normal file
@@ -0,0 +1,17 @@
|
||||
defmodule Darts do
|
||||
@type position :: {number, number}
|
||||
|
||||
@doc """
|
||||
Calculate the score of a single dart hitting a target
|
||||
"""
|
||||
@spec score(position) :: integer
|
||||
def score({x, y}) do
|
||||
in_radius = (x ** 2 + y ** 2) ** 0.5
|
||||
cond do
|
||||
in_radius <= 1 -> 10
|
||||
in_radius <= 5 -> 5
|
||||
in_radius <= 10 -> 1
|
||||
true -> 0
|
||||
end
|
||||
end
|
||||
end
|
||||
28
elixir/darts/mix.exs
Normal file
28
elixir/darts/mix.exs
Normal file
@@ -0,0 +1,28 @@
|
||||
defmodule Darts.MixProject do
|
||||
use Mix.Project
|
||||
|
||||
def project do
|
||||
[
|
||||
app: :darts,
|
||||
version: "0.1.0",
|
||||
# elixir: "~> 1.8",
|
||||
start_permanent: Mix.env() == :prod,
|
||||
deps: deps()
|
||||
]
|
||||
end
|
||||
|
||||
# Run "mix help compile.app" to learn about applications.
|
||||
def application do
|
||||
[
|
||||
extra_applications: [:logger]
|
||||
]
|
||||
end
|
||||
|
||||
# Run "mix help deps" to learn about dependencies.
|
||||
defp deps do
|
||||
[
|
||||
# {:dep_from_hexpm, "~> 0.3.0"},
|
||||
# {:dep_from_git, git: "https://github.com/elixir-lang/my_dep.git", tag: "0.1.0"}
|
||||
]
|
||||
end
|
||||
end
|
||||
68
elixir/darts/test/darts_test.exs
Normal file
68
elixir/darts/test/darts_test.exs
Normal file
@@ -0,0 +1,68 @@
|
||||
defmodule DartsTest do
|
||||
use ExUnit.Case
|
||||
|
||||
# @tag :pending
|
||||
test "Missed target" do
|
||||
assert Darts.score({-9, 9}) == 0
|
||||
end
|
||||
|
||||
# @tag :pending
|
||||
test "On the outer circle" do
|
||||
assert Darts.score({0, 10}) == 1
|
||||
end
|
||||
|
||||
# @tag :pending
|
||||
test "On the middle circle" do
|
||||
assert Darts.score({-5, 0}) == 5
|
||||
end
|
||||
|
||||
# @tag :pending
|
||||
test "On the inner circle" do
|
||||
assert Darts.score({0, -1}) == 10
|
||||
end
|
||||
|
||||
# @tag :pending
|
||||
test "Exactly on centre" do
|
||||
assert Darts.score({0, 0}) == 10
|
||||
end
|
||||
|
||||
# @tag :pending
|
||||
test "Near the centre" do
|
||||
assert Darts.score({-0.1, -0.1}) == 10
|
||||
end
|
||||
|
||||
# @tag :pending
|
||||
test "Just within the inner circle" do
|
||||
assert Darts.score({0.7, 0.7}) == 10
|
||||
end
|
||||
|
||||
# @tag :pending
|
||||
test "Just outside the inner circle" do
|
||||
assert Darts.score({0.8, -0.8}) == 5
|
||||
end
|
||||
|
||||
# @tag :pending
|
||||
test "Just within the middle circle" do
|
||||
assert Darts.score({-3.5, 3.5}) == 5
|
||||
end
|
||||
|
||||
# @tag :pending
|
||||
test "Just outside the middle circle" do
|
||||
assert Darts.score({-3.6, -3.6}) == 1
|
||||
end
|
||||
|
||||
# @tag :pending
|
||||
test "Just within the outer circle" do
|
||||
assert Darts.score({-7.0, 7.0}) == 1
|
||||
end
|
||||
|
||||
# @tag :pending
|
||||
test "Just outside the outer circle" do
|
||||
assert Darts.score({7.1, -7.1}) == 0
|
||||
end
|
||||
|
||||
# @tag :pending
|
||||
test "Asymmetric position between the inner and middle circles" do
|
||||
assert Darts.score({0.5, -4}) == 5
|
||||
end
|
||||
end
|
||||
2
elixir/darts/test/test_helper.exs
Normal file
2
elixir/darts/test/test_helper.exs
Normal file
@@ -0,0 +1,2 @@
|
||||
ExUnit.start()
|
||||
ExUnit.configure(exclude: :pending, trace: true)
|
||||
Reference in New Issue
Block a user