From d96b195f954ab1b9f9a838774881ee02a6688e76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A1s=20B=20Nagy?= <20251272+BNAndras@users.noreply.github.com> Date: Mon, 7 Oct 2024 22:02:25 -0700 Subject: [PATCH] Add `prime-factors` --- config.json | 8 ++++ .../prime-factors/.docs/instructions.md | 36 +++++++++++++++ .../practice/prime-factors/.meta/config.json | 19 ++++++++ .../practice/prime-factors/.meta/example.vim | 14 ++++++ .../practice/prime-factors/.meta/tests.toml | 46 +++++++++++++++++++ .../prime-factors/prime_factors.vader | 35 ++++++++++++++ .../practice/prime-factors/prime_factors.vim | 13 ++++++ 7 files changed, 171 insertions(+) create mode 100644 exercises/practice/prime-factors/.docs/instructions.md create mode 100644 exercises/practice/prime-factors/.meta/config.json create mode 100644 exercises/practice/prime-factors/.meta/example.vim create mode 100644 exercises/practice/prime-factors/.meta/tests.toml create mode 100644 exercises/practice/prime-factors/prime_factors.vader create mode 100644 exercises/practice/prime-factors/prime_factors.vim diff --git a/config.json b/config.json index 2d80594..2f2c238 100644 --- a/config.json +++ b/config.json @@ -334,6 +334,14 @@ "transforming" ] }, + { + "slug": "prime-factors", + "name": "Prime Factors", + "uuid": "858b9e88-5c1c-48c7-9888-596d47a01d6e", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "proverb", "name": "Proverb", diff --git a/exercises/practice/prime-factors/.docs/instructions.md b/exercises/practice/prime-factors/.docs/instructions.md new file mode 100644 index 0000000..252cc8e --- /dev/null +++ b/exercises/practice/prime-factors/.docs/instructions.md @@ -0,0 +1,36 @@ +# Instructions + +Compute the prime factors of a given natural number. + +A prime number is only evenly divisible by itself and 1. + +Note that 1 is not a prime number. + +## Example + +What are the prime factors of 60? + +- Our first divisor is 2. + 2 goes into 60, leaving 30. +- 2 goes into 30, leaving 15. + - 2 doesn't go cleanly into 15. + So let's move on to our next divisor, 3. +- 3 goes cleanly into 15, leaving 5. + - 3 does not go cleanly into 5. + The next possible factor is 4. + - 4 does not go cleanly into 5. + The next possible factor is 5. +- 5 does go cleanly into 5. +- We're left only with 1, so now, we're done. + +Our successful divisors in that computation represent the list of prime factors of 60: 2, 2, 3, and 5. + +You can check this yourself: + +```text +2 * 2 * 3 * 5 += 4 * 15 += 60 +``` + +Success! diff --git a/exercises/practice/prime-factors/.meta/config.json b/exercises/practice/prime-factors/.meta/config.json new file mode 100644 index 0000000..6d5c49e --- /dev/null +++ b/exercises/practice/prime-factors/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "prime_factors.vim" + ], + "test": [ + "prime_factors.vader" + ], + "example": [ + ".meta/example.vim" + ] + }, + "blurb": "Compute the prime factors of a given natural number.", + "source": "The Prime Factors Kata by Uncle Bob", + "source_url": "https://web.archive.org/web/20221026171801/http://butunclebob.com/ArticleS.UncleBob.ThePrimeFactorsKata" +} diff --git a/exercises/practice/prime-factors/.meta/example.vim b/exercises/practice/prime-factors/.meta/example.vim new file mode 100644 index 0000000..7a0b4b3 --- /dev/null +++ b/exercises/practice/prime-factors/.meta/example.vim @@ -0,0 +1,14 @@ +function! Factors(value) abort + let l:results = [] + let l:divisor = 2 + let l:working = a:value + while l:working > 1 + while l:working % l:divisor == 0 + call add(l:results, l:divisor) + let l:working /= l:divisor + endwhile + let l:divisor += 1 + endwhile + + return l:results +endfunction diff --git a/exercises/practice/prime-factors/.meta/tests.toml b/exercises/practice/prime-factors/.meta/tests.toml new file mode 100644 index 0000000..6f9cc8c --- /dev/null +++ b/exercises/practice/prime-factors/.meta/tests.toml @@ -0,0 +1,46 @@ +# 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. + +[924fc966-a8f5-4288-82f2-6b9224819ccd] +description = "no factors" + +[17e30670-b105-4305-af53-ddde182cb6ad] +description = "prime number" + +[238d57c8-4c12-42ef-af34-ae4929f94789] +description = "another prime number" + +[f59b8350-a180-495a-8fb1-1712fbee1158] +description = "square of a prime" + +[756949d3-3158-4e3d-91f2-c4f9f043ee70] +description = "product of first prime" + +[bc8c113f-9580-4516-8669-c5fc29512ceb] +description = "cube of a prime" + +[7d6a3300-a4cb-4065-bd33-0ced1de6cb44] +description = "product of second prime" + +[073ac0b2-c915-4362-929d-fc45f7b9a9e4] +description = "product of third prime" + +[6e0e4912-7fb6-47f3-a9ad-dbcd79340c75] +description = "product of first and second prime" + +[00485cd3-a3fe-4fbe-a64a-a4308fc1f870] +description = "product of primes and non-primes" + +[02251d54-3ca1-4a9b-85e1-b38f4b0ccb91] +description = "product of primes" + +[070cf8dc-e202-4285-aa37-8d775c9cd473] +description = "factors include a large prime" diff --git a/exercises/practice/prime-factors/prime_factors.vader b/exercises/practice/prime-factors/prime_factors.vader new file mode 100644 index 0000000..9240bc1 --- /dev/null +++ b/exercises/practice/prime-factors/prime_factors.vader @@ -0,0 +1,35 @@ +Execute (no factors): + AssertEqual [], Factors(1) + +Execute (prime number): + AssertEqual [2], Factors(2) + +Execute (another prime number): + AssertEqual [3], Factors(3) + +Execute (square of a prime): + AssertEqual [3, 3], Factors(9) + +Execute (product of first prime): + AssertEqual [2, 2], Factors(4) + +Execute (cube of a prime): + AssertEqual [2, 2, 2], Factors(8) + +Execute (product of second prime): + AssertEqual [3, 3, 3], Factors(27) + +Execute (product of third prime): + AssertEqual [5, 5, 5, 5], Factors(625) + +Execute (product of first and second prime): + AssertEqual [2, 3], Factors(6) + +Execute (product of primes and non-primes): + AssertEqual [2, 2, 3], Factors(12) + +Execute (product of primes): + AssertEqual [5, 17, 23, 461], Factors(901255) + +Execute (factors include a large prime): + AssertEqual [11, 9539, 894119], Factors(93819012551) diff --git a/exercises/practice/prime-factors/prime_factors.vim b/exercises/practice/prime-factors/prime_factors.vim new file mode 100644 index 0000000..4b62883 --- /dev/null +++ b/exercises/practice/prime-factors/prime_factors.vim @@ -0,0 +1,13 @@ +" +" Given a number, return its prime factors. +" +" Examples: +" :echo Factors(1) +" [] +" +" :echo Factors(12) +" [2, 2, 3] +" +function! Factors(value) abort + " your code goes here +endfunction