From 60048e699bbc57fbf3860e032b9a2db4b803ab5c Mon Sep 17 00:00:00 2001 From: Eric Willigers Date: Tue, 28 Jan 2025 19:59:46 +1100 Subject: [PATCH] Add nth-prime exercise --- config.json | 8 ++++ .../practice/nth-prime/.docs/instructions.md | 7 +++ .../practice/nth-prime/.meta/config.json | 19 ++++++++ .../practice/nth-prime/.meta/example.zig | 37 ++++++++++++++++ exercises/practice/nth-prime/.meta/tests.toml | 26 +++++++++++ exercises/practice/nth-prime/nth_prime.zig | 8 ++++ .../practice/nth-prime/test_nth_prime.zig | 44 +++++++++++++++++++ 7 files changed, 149 insertions(+) create mode 100644 exercises/practice/nth-prime/.docs/instructions.md create mode 100644 exercises/practice/nth-prime/.meta/config.json create mode 100644 exercises/practice/nth-prime/.meta/example.zig create mode 100644 exercises/practice/nth-prime/.meta/tests.toml create mode 100644 exercises/practice/nth-prime/nth_prime.zig create mode 100644 exercises/practice/nth-prime/test_nth_prime.zig diff --git a/config.json b/config.json index a5e83711..8480da40 100644 --- a/config.json +++ b/config.json @@ -136,6 +136,14 @@ "prerequisites": [], "difficulty": 4 }, + { + "slug": "nth-prime", + "name": "Nth Prime", + "uuid": "799a17cb-9f29-481b-94be-b532f46c8024", + "practices": [], + "prerequisites": [], + "difficulty": 4 + }, { "slug": "pangram", "name": "Pangram", diff --git a/exercises/practice/nth-prime/.docs/instructions.md b/exercises/practice/nth-prime/.docs/instructions.md new file mode 100644 index 00000000..065e323a --- /dev/null +++ b/exercises/practice/nth-prime/.docs/instructions.md @@ -0,0 +1,7 @@ +# Instructions + +Given a number n, determine what the nth prime is. + +By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13. + +If your language provides methods in the standard library to deal with prime numbers, pretend they don't exist and implement them yourself. diff --git a/exercises/practice/nth-prime/.meta/config.json b/exercises/practice/nth-prime/.meta/config.json new file mode 100644 index 00000000..157e8bb1 --- /dev/null +++ b/exercises/practice/nth-prime/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "keiravillekode" + ], + "files": { + "solution": [ + "nth_prime.zig" + ], + "test": [ + "test_nth_prime.zig" + ], + "example": [ + ".meta/example.zig" + ] + }, + "blurb": "Given a number n, determine what the nth prime is.", + "source": "A variation on Problem 7 at Project Euler", + "source_url": "https://projecteuler.net/problem=7" +} diff --git a/exercises/practice/nth-prime/.meta/example.zig b/exercises/practice/nth-prime/.meta/example.zig new file mode 100644 index 00000000..5779f5ca --- /dev/null +++ b/exercises/practice/nth-prime/.meta/example.zig @@ -0,0 +1,37 @@ +const std = @import("std"); +const math = std.math; +const mem = std.mem; + +pub fn prime(allocator: mem.Allocator, number: usize) !usize { + // The first two primes are 2 and 3. + if (number <= 2) { + return number + 1; + } + + const limit = number * math.log2_int_ceil(usize, number); + const table = try allocator.alloc(bool, limit); + defer allocator.free(table); + @memset(table, false); + + var remaining = number - 2; + var p: usize = 1; + var step: usize = 4; + while (true) { + p += step; // skip multiples of 2 and multiples of 3 + step = 6 - step; + if (table[p]) { + continue; + } + + remaining -= 1; + if (remaining == 0) { + return p; + } + + var q = p * p; + while (q < limit) { + table[q] = true; + q += 2 * p; + } + } +} diff --git a/exercises/practice/nth-prime/.meta/tests.toml b/exercises/practice/nth-prime/.meta/tests.toml new file mode 100644 index 00000000..4fe38e1e --- /dev/null +++ b/exercises/practice/nth-prime/.meta/tests.toml @@ -0,0 +1,26 @@ +# 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. + +[75c65189-8aef-471a-81de-0a90c728160c] +description = "first prime" + +[2c38804c-295f-4701-b728-56dea34fd1a0] +description = "second prime" + +[56692534-781e-4e8c-b1f9-3e82c1640259] +description = "sixth prime" + +[fce1e979-0edb-412d-93aa-2c744e8f50ff] +description = "big prime" + +[bd0a9eae-6df7-485b-a144-80e13c7d55b2] +description = "there is no zeroth prime" +include = false diff --git a/exercises/practice/nth-prime/nth_prime.zig b/exercises/practice/nth-prime/nth_prime.zig new file mode 100644 index 00000000..1ad2ff3a --- /dev/null +++ b/exercises/practice/nth-prime/nth_prime.zig @@ -0,0 +1,8 @@ +const std = @import("std"); +const mem = std.mem; + +pub fn prime(allocator: mem.Allocator, number: usize) !usize { + _ = allocator; + _ = number; + @compileError("please implement the prime function"); +} diff --git a/exercises/practice/nth-prime/test_nth_prime.zig b/exercises/practice/nth-prime/test_nth_prime.zig new file mode 100644 index 00000000..a50496e9 --- /dev/null +++ b/exercises/practice/nth-prime/test_nth_prime.zig @@ -0,0 +1,44 @@ +const std = @import("std"); +const testing = std.testing; + +const nth_prime = @import("nth_prime.zig"); + +test "first prime" { + const p = try nth_prime.prime(testing.allocator, 1); + try testing.expectEqual(2, p); +} + +test "second prime" { + const p = try nth_prime.prime(testing.allocator, 2); + try testing.expectEqual(3, p); +} + +test "third prime" { + const p = try nth_prime.prime(testing.allocator, 3); + try testing.expectEqual(5, p); +} + +test "fourth prime" { + const p = try nth_prime.prime(testing.allocator, 4); + try testing.expectEqual(7, p); +} + +test "fifth prime" { + const p = try nth_prime.prime(testing.allocator, 5); + try testing.expectEqual(11, p); +} + +test "sixth prime" { + const p = try nth_prime.prime(testing.allocator, 6); + try testing.expectEqual(13, p); +} + +test "seventh prime" { + const p = try nth_prime.prime(testing.allocator, 7); + try testing.expectEqual(17, p); +} + +test "big prime" { + const p = try nth_prime.prime(testing.allocator, 10001); + try testing.expectEqual(104743, p); +}