diff --git a/config.json b/config.json index 0a75c92..d423179 100644 --- a/config.json +++ b/config.json @@ -134,6 +134,14 @@ "strings" ] }, + { + "slug": "sieve", + "name": "Sieve", + "uuid": "62ea1661-cdf6-4291-9c0f-3a8c911ce940", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "matching-brackets", "name": "Matching Brackets", diff --git a/exercises/practice/sieve/.docs/instructions.md b/exercises/practice/sieve/.docs/instructions.md new file mode 100644 index 0000000..3adf1d5 --- /dev/null +++ b/exercises/practice/sieve/.docs/instructions.md @@ -0,0 +1,28 @@ +# Instructions + +Your task is to create a program that implements the Sieve of Eratosthenes algorithm to find prime numbers. + +A prime number is a number that is only divisible by 1 and itself. +For example, 2, 3, 5, 7, 11, and 13 are prime numbers. + +The Sieve of Eratosthenes is an ancient algorithm that works by taking a list of numbers and crossing out all the numbers that aren't prime. + +A number that is **not** prime is called a "composite number". + +To use the Sieve of Eratosthenes, you first create a list of all the numbers between 2 and your given number. +Then you repeat the following steps: + +1. Find the next unmarked number in your list. This is a prime number. +2. Mark all the multiples of that prime number as composite (not prime). + +You keep repeating these steps until you've gone through every number in your list. +At the end, all the unmarked numbers are prime. + +~~~~exercism/note +[Wikipedia's Sieve of Eratosthenes article][eratosthenes] has a useful graphic that explains the algorithm. + +The tests don't check that you've implemented the algorithm, only that you've come up with the correct list of primes. +A good first test is to check that you do not use division or remainder operations. + +[eratosthenes]: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes +~~~~ diff --git a/exercises/practice/sieve/.docs/introduction.md b/exercises/practice/sieve/.docs/introduction.md new file mode 100644 index 0000000..f6c1cf7 --- /dev/null +++ b/exercises/practice/sieve/.docs/introduction.md @@ -0,0 +1,7 @@ +# Introduction + +You bought a big box of random computer parts at a garage sale. +You've started putting the parts together to build custom computers. + +You want to test the performance of different combinations of parts, and decide to create your own benchmarking program to see how your computers compare. +You choose the famous "Sieve of Eratosthenes" algorithm, an ancient algorithm, but one that should push your computers to the limits. diff --git a/exercises/practice/sieve/.meta/config.json b/exercises/practice/sieve/.meta/config.json new file mode 100644 index 0000000..88c2272 --- /dev/null +++ b/exercises/practice/sieve/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "source/sieve.d" + ], + "test": [ + "source/sieve.d" + ], + "example": [ + "example/sieve.d" + ] + }, + "blurb": "Use the Sieve of Eratosthenes to find all the primes from 2 up to a given number.", + "source": "Sieve of Eratosthenes at Wikipedia", + "source_url": "https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes" +} diff --git a/exercises/practice/sieve/.meta/tests.toml b/exercises/practice/sieve/.meta/tests.toml new file mode 100644 index 0000000..fec5e1a --- /dev/null +++ b/exercises/practice/sieve/.meta/tests.toml @@ -0,0 +1,25 @@ +# 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. + +[88529125-c4ce-43cc-bb36-1eb4ddd7b44f] +description = "no primes under two" + +[4afe9474-c705-4477-9923-840e1024cc2b] +description = "find first prime" + +[974945d8-8cd9-4f00-9463-7d813c7f17b7] +description = "find primes up to 10" + +[2e2417b7-3f3a-452a-8594-b9af08af6d82] +description = "limit is prime" + +[92102a05-4c7c-47de-9ed0-b7d5fcd00f21] +description = "find primes up to 1000" diff --git a/exercises/practice/sieve/dub.sdl b/exercises/practice/sieve/dub.sdl new file mode 100644 index 0000000..d42f9b3 --- /dev/null +++ b/exercises/practice/sieve/dub.sdl @@ -0,0 +1,2 @@ +name "sieve" +buildRequirements "disallowDeprecations" diff --git a/exercises/practice/sieve/example/sieve.d b/exercises/practice/sieve/example/sieve.d new file mode 100644 index 0000000..f7f9d24 --- /dev/null +++ b/exercises/practice/sieve/example/sieve.d @@ -0,0 +1,20 @@ +module sieve; + +import std.algorithm; +import std.array; +import std.range; + +pure int[] primes(immutable int limit) +{ + int[] results = []; + int[] nums = iota(2, limit + 1).array; + while (nums.length > 0) + { + int current = nums.front; + results ~= nums.front; + + nums = nums.dropOne().filter!(n => n % current != 0).array; + } + + return results; +} diff --git a/exercises/practice/sieve/source/sieve.d b/exercises/practice/sieve/source/sieve.d new file mode 100644 index 0000000..c3d2d95 --- /dev/null +++ b/exercises/practice/sieve/source/sieve.d @@ -0,0 +1,56 @@ +module sieve; + +pure int[] primes(immutable int limit) +{ + // implement this function +} + +unittest +{ + immutable int allTestsEnabled = 0; + + // no primes under two + { + assert(primes(1) == []); + } + + static if (allTestsEnabled) + { + // find first prime + { + assert(primes(2) == [2]); + } + + // find primes up to 10 + { + assert(primes(10) == [2, 3, 5, 7]); + } + + // limit is prime + { + assert(primes(13) == [2, 3, 5, 7, 11, 13]); + } + + // find primes up to 1000 + { + const int[] expected = [ + 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, + 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, + 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, + 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, + 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, + 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, + 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, + 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, + 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, + 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, + 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, + 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997 + ]; + + assert(primes(1000) == expected); + } + + } + +}