diff --git a/config.json b/config.json index 2e037bc..8914476 100644 --- a/config.json +++ b/config.json @@ -55,12 +55,12 @@ "practices": [], "prerequisites": [], "difficulty": 3, + "status": "deprecated", "topics": [ "formatting", "loops", "strings" - ], - "status": "deprecated" + ] }, { "slug": "bob", @@ -74,6 +74,14 @@ "strings" ] }, + { + "slug": "darts", + "name": "Darts", + "uuid": "1ae2f1bd-5f62-4692-857d-faaf5223cad7", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "bottle-song", "name": "Bottle Song", diff --git a/exercises/practice/darts/.docs/instructions.md b/exercises/practice/darts/.docs/instructions.md new file mode 100644 index 0000000..5e57a86 --- /dev/null +++ b/exercises/practice/darts/.docs/instructions.md @@ -0,0 +1,31 @@ +# 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: + +![Our dart scoreboard with values from a complete miss to a bullseye](https://assets.exercism.org/images/exercises/darts/darts-scoreboard.svg) + +- 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 diff --git a/exercises/practice/darts/.meta/config.json b/exercises/practice/darts/.meta/config.json new file mode 100644 index 0000000..9c5690d --- /dev/null +++ b/exercises/practice/darts/.meta/config.json @@ -0,0 +1,18 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "darts.vim" + ], + "test": [ + "darts.vader" + ], + "example": [ + ".meta/example.vim" + ] + }, + "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" +} diff --git a/exercises/practice/darts/.meta/example.vim b/exercises/practice/darts/.meta/example.vim new file mode 100644 index 0000000..f11a913 --- /dev/null +++ b/exercises/practice/darts/.meta/example.vim @@ -0,0 +1,13 @@ +function! Darts(x, y) abort + let l:distance = sqrt(a:x * a:x + a:y * a:y) + + if l:distance <= 1 + return 10 + elseif l:distance <= 5 + return 5 + elseif l:distance <= 10 + return 1 + else + return 0 + endif +endfunction diff --git a/exercises/practice/darts/.meta/tests.toml b/exercises/practice/darts/.meta/tests.toml new file mode 100644 index 0000000..fbe2976 --- /dev/null +++ b/exercises/practice/darts/.meta/tests.toml @@ -0,0 +1,49 @@ +# 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. + +[9033f731-0a3a-4d9c-b1c0-34a1c8362afb] +description = "Missed target" + +[4c9f6ff4-c489-45fd-be8a-1fcb08b4d0ba] +description = "On the outer circle" + +[14378687-ee58-4c9b-a323-b089d5274be8] +description = "On the middle circle" + +[849e2e63-85bd-4fed-bc3b-781ae962e2c9] +description = "On the inner circle" + +[1c5ffd9f-ea66-462f-9f06-a1303de5a226] +description = "Exactly on center" + +[b65abce3-a679-4550-8115-4b74bda06088] +description = "Near the center" + +[66c29c1d-44f5-40cf-9927-e09a1305b399] +description = "Just within the inner circle" + +[d1012f63-c97c-4394-b944-7beb3d0b141a] +description = "Just outside the inner circle" + +[ab2b5666-b0b4-49c3-9b27-205e790ed945] +description = "Just within the middle circle" + +[70f1424e-d690-4860-8caf-9740a52c0161] +description = "Just outside the middle circle" + +[a7dbf8db-419c-4712-8a7f-67602b69b293] +description = "Just within the outer circle" + +[e0f39315-9f9a-4546-96e4-a9475b885aa7] +description = "Just outside the outer circle" + +[045d7d18-d863-4229-818e-b50828c75d19] +description = "Asymmetric position between the inner and middle circles" diff --git a/exercises/practice/darts/darts.vader b/exercises/practice/darts/darts.vader new file mode 100644 index 0000000..f7bc724 --- /dev/null +++ b/exercises/practice/darts/darts.vader @@ -0,0 +1,78 @@ + +Execute (Missed target): + let g:x = -9 + let g:y = 9 + let g:expected = 0 + AssertEqual g:expected, Darts(g:x, g:y) + +Execute (On the outer circle): + let g:x = 0 + let g:y = 10 + let g:expected = 1 + AssertEqual g:expected, Darts(g:x, g:y) + +Execute (On the middle circle): + let g:x = -5 + let g:y = 0 + let g:expected = 5 + AssertEqual g:expected, Darts(g:x, g:y) + +Execute (On the inner circle): + let g:x = 0 + let g:y = -1 + let g:expected = 10 + AssertEqual g:expected, Darts(g:x, g:y) + +Execute (Exactly on center): + let g:x = 0 + let g:y = 0 + let g:expected = 10 + AssertEqual g:expected, Darts(g:x, g:y) + +Execute (Near the center): + let g:x = -0.1 + let g:y = -0.1 + let g:expected = 10 + AssertEqual g:expected, Darts(g:x, g:y) + +Execute (Just within the inner circle): + let g:x = 0.7 + let g:y = 0.7 + let g:expected = 10 + AssertEqual g:expected, Darts(g:x, g:y) + +Execute (Just outside the inner circle): + let g:x = 0.8 + let g:y = -0.8 + let g:expected = 5 + AssertEqual g:expected, Darts(g:x, g:y) + +Execute (Just within the middle circle): + let g:x = -3.5 + let g:y = 3.5 + let g:expected = 5 + AssertEqual g:expected, Darts(g:x, g:y) + +Execute (Just outside the middle circle): + let g:x = -3.6 + let g:y = -3.6 + let g:expected = 1 + AssertEqual g:expected, Darts(g:x, g:y) + +Execute (Just within the outer circle): + let g:x = -7.0 + let g:y = 7.0 + let g:expected = 1 + AssertEqual g:expected, Darts(g:x, g:y) + +Execute (Just outside the outer circle): + let g:x = 7.1 + let g:y = -7.1 + let g:expected = 0 + AssertEqual g:expected, Darts(g:x, g:y) + +Execute (Asymmetric position between the inner and middle circles): + let g:x = 0.5 + let g:y = -4 + let g:expected = 5 + AssertEqual g:expected, Darts(g:x, g:y) diff --git a/exercises/practice/darts/darts.vim b/exercises/practice/darts/darts.vim new file mode 100644 index 0000000..ae1c9b3 --- /dev/null +++ b/exercises/practice/darts/darts.vim @@ -0,0 +1,16 @@ +" +" Calculate the score of a single dart toss, given the distance +" from the center of the board in the X and Y graph axes. +" The circular dartboard is ten units wide from the center to the edge. +" +" Example: +" +" :echo Darts(0, 0) +" 10 +" +" :echo Darts(11, 11) +" 0 +" +function! Darts(x, y) abort + " your code goes here +endfunction