diff --git a/config.json b/config.json index 25f6c60190..c977abeab4 100644 --- a/config.json +++ b/config.json @@ -1222,6 +1222,17 @@ "topics": [ "loops" ] + }, + { + "slug": "darts", + "uuid": "15b73808-78a4-4854-b7cf-82a478107024", + "core": false, + "unlocked_by": null, + "difficulty": 3, + "topics": [ + "math", + "geometry" + ] } ] } diff --git a/exercises/darts/.meta/generator/darts_case.rb b/exercises/darts/.meta/generator/darts_case.rb new file mode 100644 index 0000000000..f7cec1aaa4 --- /dev/null +++ b/exercises/darts/.meta/generator/darts_case.rb @@ -0,0 +1,10 @@ +require 'generator/exercise_case' + +class DartsCase < Generator::ExerciseCase + def workload + [ + "darts = Darts.new(#{input["x"]}, #{input["y"]})\n", + "assert_equal(#{expected.inspect}, darts.score)\n" + ].join + end +end diff --git a/exercises/darts/.meta/solutions/darts.rb b/exercises/darts/.meta/solutions/darts.rb new file mode 100644 index 0000000000..32b0196e04 --- /dev/null +++ b/exercises/darts/.meta/solutions/darts.rb @@ -0,0 +1,29 @@ +class Darts + attr_reader :x, :y + + def initialize(x, y) + @x = x + @y = y + end + + def score + scores.detect do |range, _| + range.cover? distance_to_bullseye + end[1] + end + + private + + def scores + { + 0.0..1.0 => 10, + 1.0..5.0 => 5, + 5.0..10.0 => 1, + 10.0..1.0/0 => 0, + } + end + + def distance_to_bullseye + Math.sqrt(x * x + y * y) + end +end diff --git a/exercises/darts/README.md b/exercises/darts/README.md new file mode 100644 index 0000000000..21e842aaaf --- /dev/null +++ b/exercises/darts/README.md @@ -0,0 +1,48 @@ +# Darts + +Write a method that returns the earned points in a single toss of a Darts game. + +[Darts](https://en.wikipedia.org/wiki/Darts) is a game where players +throw darts to a [target](https://en.wikipedia.org/wiki/Darts#/media/File:Darts_in_a_dartboard.jpg). + +In our particular instance of the game, the target rewards with 4 different amounts of points, depending on where the dart lands. + +If the dart lands: + +* outside the target: 0 points. +* in the outer circle of the target: 1 point. +* in the middle circle of the target: 5 points. +* in the inner circle of the target: 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. They are all centered to the same point (That is, the circles are [concentric](http://mathworld.wolfram.com/ConcentricCircles.html)) defined by the coordinates (0, 0). + +Write a method that, given a point in the target (defined by its `real` Cartesian coordinates `x` and `y`), returns the correct amount earned by a dart landing in that point. +* * * * + +For installation and learning resources, refer to the +[Ruby resources page](http://exercism.io/languages/ruby/resources). + +For running the tests provided, you will need the Minitest gem. Open a +terminal window and run the following command to install minitest: + + gem install minitest + +If you would like color output, you can `require 'minitest/pride'` in +the test file, or note the alternative instruction, below, for running +the test file. + +Run the tests from the exercise directory using the following command: + + ruby darts_test.rb + +To include color from the command line: + + ruby -r minitest/pride darts_test.rb + + +## Source + +Inspired by an exercise created by a professor Della Paolera in Argentina + +## Submitting Incomplete Solutions +It's possible to submit an incomplete solution so you can see how others have completed the exercise. diff --git a/exercises/darts/darts_test.rb b/exercises/darts/darts_test.rb new file mode 100644 index 0000000000..f13419682e --- /dev/null +++ b/exercises/darts/darts_test.rb @@ -0,0 +1,83 @@ +require 'minitest/autorun' +require_relative 'darts' + +# Common test data version: 2.2.0 f60c43b +class DartsTest < Minitest::Test + def test_missed_target + # skip + darts = Darts.new(-9, 9) + assert_equal(0, darts.score) + end + + def test_on_the_outer_circle + skip + darts = Darts.new(0, 10) + assert_equal(1, darts.score) + end + + def test_on_the_middle_circle + skip + darts = Darts.new(-5, 0) + assert_equal(5, darts.score) + end + + def test_on_the_inner_circle + skip + darts = Darts.new(0, -1) + assert_equal(10, darts.score) + end + + def test_exactly_on_centre + skip + darts = Darts.new(0, 0) + assert_equal(10, darts.score) + end + + def test_near_the_centre + skip + darts = Darts.new(-0.1, -0.1) + assert_equal(10, darts.score) + end + + def test_just_within_the_inner_circle + skip + darts = Darts.new(0.7, 0.7) + assert_equal(10, darts.score) + end + + def test_just_outside_the_inner_circle + skip + darts = Darts.new(0.8, -0.8) + assert_equal(5, darts.score) + end + + def test_just_within_the_middle_circle + skip + darts = Darts.new(-3.5, 3.5) + assert_equal(5, darts.score) + end + + def test_just_outside_the_middle_circle + skip + darts = Darts.new(-3.6, -3.6) + assert_equal(1, darts.score) + end + + def test_just_within_the_outer_circle + skip + darts = Darts.new(-7.0, 7.0) + assert_equal(1, darts.score) + end + + def test_just_outside_the_outer_circle + skip + darts = Darts.new(7.1, -7.1) + assert_equal(0, darts.score) + end + + def test_asymmetric_position_between_the_inner_and_middle_circles + skip + darts = Darts.new(0.5, -4) + assert_equal(5, darts.score) + end +end