From 8d3596b5b71aeaeed57e03b67cac8f87efe1e2fa Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Fri, 13 Jan 2023 20:00:01 +0100 Subject: [PATCH 01/11] exercises: stub out every user-facing solution file Before this commit, the user-facing solution file was empty for every exercise apart from: - clock - hello-world - react Add initial content to the user-facing solution file for every other exercise. Closes: 409 --- exercises/concept/lasagna/lasagna.nim | 14 ++++++++++++ exercises/practice/acronym/acronym.nim | 2 ++ .../practice/all-your-base/all_your_base.nim | 2 ++ exercises/practice/allergies/allergies.nim | 9 ++++++++ exercises/practice/anagram/anagram.nim | 2 ++ .../armstrong-numbers/armstrong_numbers.nim | 2 ++ .../practice/atbash-cipher/atbash_cipher.nim | 5 +++++ exercises/practice/binary/binary.nim | 2 ++ exercises/practice/bob/bob.nim | 2 ++ .../collatz-conjecture/collatz_conjecture.nim | 2 ++ .../practice/crypto-square/crypto_square.nim | 2 ++ exercises/practice/darts/darts.nim | 2 ++ exercises/practice/diamond/diamond.nim | 2 ++ .../difference_of_squares.nim | 8 +++++++ .../diffie-hellman/diffie_hellman.nim | 8 +++++++ exercises/practice/etl/etl.nim | 4 ++++ exercises/practice/gigasecond/gigasecond.nim | 4 ++++ .../practice/grade-school/grade_school.nim | 22 +++++++++++++++++++ exercises/practice/grains/grains.nim | 5 +++++ exercises/practice/hamming/hamming.nim | 2 ++ .../practice/high-scores/high_scores.nim | 8 +++++++ .../practice/isbn-verifier/isbn_verifier.nim | 2 ++ exercises/practice/isogram/isogram.nim | 2 ++ .../kindergarten_garden.nim | 6 +++++ .../largest_series_product.nim | 2 ++ exercises/practice/leap/leap.nim | 2 ++ exercises/practice/luhn/luhn.nim | 2 ++ .../matching-brackets/matching_brackets.nim | 2 ++ exercises/practice/matrix/matrix.nim | 5 +++++ exercises/practice/meetup/meetup.nim | 8 +++++++ exercises/practice/nth-prime/nth_prime.nim | 2 ++ .../nucleotide-count/nucleotide_count.nim | 4 ++++ exercises/practice/pangram/pangram.nim | 2 ++ .../pascals-triangle/pascals_triangle.nim | 2 ++ .../perfect-numbers/perfect_numbers.nim | 6 +++++ .../practice/phone-number/phone_number.nim | 2 ++ .../practice/prime-factors/prime_factors.nim | 2 ++ .../protein_translation.nim | 2 ++ exercises/practice/proverb/proverb.nim | 2 ++ .../practice/queen-attack/queen_attack.nim | 13 +++++++++++ exercises/practice/raindrops/raindrops.nim | 2 ++ .../resistor-color-duo/resistor_color_duo.nim | 6 +++++ .../resistor_color_trio.nim | 6 +++++ .../resistor-color/resistor_color.nim | 9 ++++++++ .../reverse-string/reverse_string.nim | 2 ++ .../rna-transcription/rna_transcription.nim | 2 ++ exercises/practice/robot-name/robot_name.nim | 10 +++++++++ .../roman-numerals/roman_numerals.nim | 2 ++ .../rotational-cipher/rotational_cipher.nim | 2 ++ .../run_length_encoding.nim | 5 +++++ .../practice/saddle-points/saddle_points.nim | 2 ++ exercises/practice/say/say.nim | 2 ++ .../scale-generator/scale_generator.nim | 2 ++ .../scrabble-score/scrabble_score.nim | 2 ++ .../secret-handshake/secret_handshake.nim | 2 ++ exercises/practice/series/series.nim | 2 ++ exercises/practice/sieve/sieve.nim | 2 ++ exercises/practice/space-age/space_age.nim | 6 +++++ .../practice/spiral-matrix/spiral_matrix.nim | 2 ++ exercises/practice/sublist/sublist.nim | 6 +++++ .../sum-of-multiples/sum_of_multiples.nim | 2 ++ exercises/practice/triangle/triangle.nim | 8 +++++++ .../practice/twelve-days/twelve_days.nim | 2 ++ exercises/practice/two-fer/two_fer.nim | 2 ++ exercises/practice/word-count/word_count.nim | 4 ++++ exercises/practice/yacht/yacht.nim | 7 ++++++ 66 files changed, 276 insertions(+) diff --git a/exercises/concept/lasagna/lasagna.nim b/exercises/concept/lasagna/lasagna.nim index e69de29b..4e76ae2e 100644 --- a/exercises/concept/lasagna/lasagna.nim +++ b/exercises/concept/lasagna/lasagna.nim @@ -0,0 +1,14 @@ +let expectedMinutesInOven* = 5 + +proc remainingMinutesInOven*(elapsedMinutes: int): int = + ## Returns the number of minutes that the lasagna still needs to remain in the + ## oven to be properly prepared. + discard + +proc preparationTimeInMinutes*(layers: int): int = + ## Returns the total preparation time for a given number of layers. + discard + +proc totalTimeInMinutes*(layers, minutesInOven: int): int = + ## Returns the total time required to prepare the lasagna. + discard diff --git a/exercises/practice/acronym/acronym.nim b/exercises/practice/acronym/acronym.nim index e69de29b..70f97d57 100644 --- a/exercises/practice/acronym/acronym.nim +++ b/exercises/practice/acronym/acronym.nim @@ -0,0 +1,2 @@ +proc abbreviate*(s: string): string = + discard diff --git a/exercises/practice/all-your-base/all_your_base.nim b/exercises/practice/all-your-base/all_your_base.nim index e69de29b..803d8434 100644 --- a/exercises/practice/all-your-base/all_your_base.nim +++ b/exercises/practice/all-your-base/all_your_base.nim @@ -0,0 +1,2 @@ +proc convert*(digits: openArray[int], fromBase: int, toBase: int): seq[int] = + discard diff --git a/exercises/practice/allergies/allergies.nim b/exercises/practice/allergies/allergies.nim index e69de29b..cad7513b 100644 --- a/exercises/practice/allergies/allergies.nim +++ b/exercises/practice/allergies/allergies.nim @@ -0,0 +1,9 @@ +type + Allergen* = enum + Eggs, Peanuts, Shellfish, Strawberries, Tomatoes, Chocolate, Pollen, Cats + +proc isAllergicTo*(score: int, allergen: Allergen): bool = + discard + +proc allergies*(score: int): set[Allergen] = + discard diff --git a/exercises/practice/anagram/anagram.nim b/exercises/practice/anagram/anagram.nim index e69de29b..ad700548 100644 --- a/exercises/practice/anagram/anagram.nim +++ b/exercises/practice/anagram/anagram.nim @@ -0,0 +1,2 @@ +proc detectAnagrams*(word: string, candidates: openArray[string]): seq[string] = + discard diff --git a/exercises/practice/armstrong-numbers/armstrong_numbers.nim b/exercises/practice/armstrong-numbers/armstrong_numbers.nim index e69de29b..0d13eea7 100644 --- a/exercises/practice/armstrong-numbers/armstrong_numbers.nim +++ b/exercises/practice/armstrong-numbers/armstrong_numbers.nim @@ -0,0 +1,2 @@ +proc isArmstrongNumber*(n: int): bool = + discard diff --git a/exercises/practice/atbash-cipher/atbash_cipher.nim b/exercises/practice/atbash-cipher/atbash_cipher.nim index e69de29b..881ada9c 100644 --- a/exercises/practice/atbash-cipher/atbash_cipher.nim +++ b/exercises/practice/atbash-cipher/atbash_cipher.nim @@ -0,0 +1,5 @@ +proc encode*(s: string): string = + discard + +proc decode*(s: string): string = + discard diff --git a/exercises/practice/binary/binary.nim b/exercises/practice/binary/binary.nim index e69de29b..8175c92e 100644 --- a/exercises/practice/binary/binary.nim +++ b/exercises/practice/binary/binary.nim @@ -0,0 +1,2 @@ +proc binary*(s: string): int = + discard diff --git a/exercises/practice/bob/bob.nim b/exercises/practice/bob/bob.nim index e69de29b..26095a72 100644 --- a/exercises/practice/bob/bob.nim +++ b/exercises/practice/bob/bob.nim @@ -0,0 +1,2 @@ +proc hey*(s: string): string = + discard diff --git a/exercises/practice/collatz-conjecture/collatz_conjecture.nim b/exercises/practice/collatz-conjecture/collatz_conjecture.nim index e69de29b..a6f12235 100644 --- a/exercises/practice/collatz-conjecture/collatz_conjecture.nim +++ b/exercises/practice/collatz-conjecture/collatz_conjecture.nim @@ -0,0 +1,2 @@ +proc steps*(n: int): int = + discard diff --git a/exercises/practice/crypto-square/crypto_square.nim b/exercises/practice/crypto-square/crypto_square.nim index e69de29b..117e0bd7 100644 --- a/exercises/practice/crypto-square/crypto_square.nim +++ b/exercises/practice/crypto-square/crypto_square.nim @@ -0,0 +1,2 @@ +proc encrypt*(s: string): string = + discard diff --git a/exercises/practice/darts/darts.nim b/exercises/practice/darts/darts.nim index e69de29b..4c9e30e0 100644 --- a/exercises/practice/darts/darts.nim +++ b/exercises/practice/darts/darts.nim @@ -0,0 +1,2 @@ +proc score*(p: tuple[x, y: float]): int = + discard diff --git a/exercises/practice/diamond/diamond.nim b/exercises/practice/diamond/diamond.nim index e69de29b..79ff5262 100644 --- a/exercises/practice/diamond/diamond.nim +++ b/exercises/practice/diamond/diamond.nim @@ -0,0 +1,2 @@ +proc diamond*(c: char): string = + discard diff --git a/exercises/practice/difference-of-squares/difference_of_squares.nim b/exercises/practice/difference-of-squares/difference_of_squares.nim index e69de29b..42d8d910 100644 --- a/exercises/practice/difference-of-squares/difference_of_squares.nim +++ b/exercises/practice/difference-of-squares/difference_of_squares.nim @@ -0,0 +1,8 @@ +proc squareOfSum*(n: int): int = + discard + +proc sumOfSquares*(n: int): int = + discard + +proc difference*(n: int): int = + discard diff --git a/exercises/practice/diffie-hellman/diffie_hellman.nim b/exercises/practice/diffie-hellman/diffie_hellman.nim index e69de29b..0a7d23ab 100644 --- a/exercises/practice/diffie-hellman/diffie_hellman.nim +++ b/exercises/practice/diffie-hellman/diffie_hellman.nim @@ -0,0 +1,8 @@ +proc privateKey*(p: int): int = + discard + +proc publicKey*(p, g, a: int): int = + discard + +proc secret*(p, bPub, a: int): int = + discard diff --git a/exercises/practice/etl/etl.nim b/exercises/practice/etl/etl.nim index e69de29b..37e1f464 100644 --- a/exercises/practice/etl/etl.nim +++ b/exercises/practice/etl/etl.nim @@ -0,0 +1,4 @@ +import std/tables + +proc transform*(t: Table[int, seq[char]]): Table[char, int] = + discard diff --git a/exercises/practice/gigasecond/gigasecond.nim b/exercises/practice/gigasecond/gigasecond.nim index e69de29b..fdb33ee0 100644 --- a/exercises/practice/gigasecond/gigasecond.nim +++ b/exercises/practice/gigasecond/gigasecond.nim @@ -0,0 +1,4 @@ +import std/times + +proc addGigasecond*(dt: DateTime): DateTime = + discard diff --git a/exercises/practice/grade-school/grade_school.nim b/exercises/practice/grade-school/grade_school.nim index e69de29b..90d71b53 100644 --- a/exercises/practice/grade-school/grade_school.nim +++ b/exercises/practice/grade-school/grade_school.nim @@ -0,0 +1,22 @@ +type + Student* = object + name*: string + grade*: int + + School* = object + students*: seq[Student] + +proc roster*(school: School): seq[string] = + ## Returns the names of every student in the `school`, sorted by grade then name. + discard + +proc addStudent*(school: var School, name: string, grade: int) = + ## Adds a student with `name` and `grade` to the `school`. + ## + ## Raises a `ValueError` if `school` already contains a student named `name`. + discard + +proc grade*(school: School, grade: int): seq[string] = + ## Returns the names of the students in the given `school` and `grade`, in + ## alphabetical order. + discard diff --git a/exercises/practice/grains/grains.nim b/exercises/practice/grains/grains.nim index e69de29b..8b383218 100644 --- a/exercises/practice/grains/grains.nim +++ b/exercises/practice/grains/grains.nim @@ -0,0 +1,5 @@ +proc onSquare*(n: int): uint64 = + discard + +proc total*: uint64 = + discard diff --git a/exercises/practice/hamming/hamming.nim b/exercises/practice/hamming/hamming.nim index e69de29b..176a22ec 100644 --- a/exercises/practice/hamming/hamming.nim +++ b/exercises/practice/hamming/hamming.nim @@ -0,0 +1,2 @@ +proc distance*(strand1, strand2: string): int = + discard diff --git a/exercises/practice/high-scores/high_scores.nim b/exercises/practice/high-scores/high_scores.nim index e69de29b..7736e314 100644 --- a/exercises/practice/high-scores/high_scores.nim +++ b/exercises/practice/high-scores/high_scores.nim @@ -0,0 +1,8 @@ +proc latest*(scores: openArray[int]): int = + discard + +proc personalBest*(scores: openArray[int]): int = + discard + +proc personalTopThree*(scores: openArray[int]): seq[int] = + discard diff --git a/exercises/practice/isbn-verifier/isbn_verifier.nim b/exercises/practice/isbn-verifier/isbn_verifier.nim index e69de29b..c363be64 100644 --- a/exercises/practice/isbn-verifier/isbn_verifier.nim +++ b/exercises/practice/isbn-verifier/isbn_verifier.nim @@ -0,0 +1,2 @@ +proc isValid*(s: string): bool = + discard diff --git a/exercises/practice/isogram/isogram.nim b/exercises/practice/isogram/isogram.nim index e69de29b..bcdd7592 100644 --- a/exercises/practice/isogram/isogram.nim +++ b/exercises/practice/isogram/isogram.nim @@ -0,0 +1,2 @@ +proc isIsogram*(s: string): bool = + discard diff --git a/exercises/practice/kindergarten-garden/kindergarten_garden.nim b/exercises/practice/kindergarten-garden/kindergarten_garden.nim index e69de29b..6cd7acd6 100644 --- a/exercises/practice/kindergarten-garden/kindergarten_garden.nim +++ b/exercises/practice/kindergarten-garden/kindergarten_garden.nim @@ -0,0 +1,6 @@ +type + Plant* = enum + Clover, Grass, Radishes, Violets + +proc plants*(garden: string, student: string): seq[Plant] = + discard diff --git a/exercises/practice/largest-series-product/largest_series_product.nim b/exercises/practice/largest-series-product/largest_series_product.nim index e69de29b..82e9685a 100644 --- a/exercises/practice/largest-series-product/largest_series_product.nim +++ b/exercises/practice/largest-series-product/largest_series_product.nim @@ -0,0 +1,2 @@ +proc largestProduct*(s: string, span: int): int = + discard diff --git a/exercises/practice/leap/leap.nim b/exercises/practice/leap/leap.nim index e69de29b..26b7080e 100644 --- a/exercises/practice/leap/leap.nim +++ b/exercises/practice/leap/leap.nim @@ -0,0 +1,2 @@ +proc isLeapYear*(year: int): bool = + discard diff --git a/exercises/practice/luhn/luhn.nim b/exercises/practice/luhn/luhn.nim index e69de29b..c363be64 100644 --- a/exercises/practice/luhn/luhn.nim +++ b/exercises/practice/luhn/luhn.nim @@ -0,0 +1,2 @@ +proc isValid*(s: string): bool = + discard diff --git a/exercises/practice/matching-brackets/matching_brackets.nim b/exercises/practice/matching-brackets/matching_brackets.nim index e69de29b..eeec63fb 100644 --- a/exercises/practice/matching-brackets/matching_brackets.nim +++ b/exercises/practice/matching-brackets/matching_brackets.nim @@ -0,0 +1,2 @@ +proc isPaired*(s: string): bool = + discard diff --git a/exercises/practice/matrix/matrix.nim b/exercises/practice/matrix/matrix.nim index e69de29b..4fae8a28 100644 --- a/exercises/practice/matrix/matrix.nim +++ b/exercises/practice/matrix/matrix.nim @@ -0,0 +1,5 @@ +proc row*(s: string, n: int): seq[int] = + discard + +proc column*(s: string, n: int): seq[int] = + discard diff --git a/exercises/practice/meetup/meetup.nim b/exercises/practice/meetup/meetup.nim index e69de29b..131e9f9e 100644 --- a/exercises/practice/meetup/meetup.nim +++ b/exercises/practice/meetup/meetup.nim @@ -0,0 +1,8 @@ +import std/times + +type + Schedule* = enum + Teenth, First, Second, Third, Fourth, Last + +proc meetup*(year: int, month: int, schedule: Schedule, day: WeekDay): string = + discard diff --git a/exercises/practice/nth-prime/nth_prime.nim b/exercises/practice/nth-prime/nth_prime.nim index e69de29b..b3ca14b7 100644 --- a/exercises/practice/nth-prime/nth_prime.nim +++ b/exercises/practice/nth-prime/nth_prime.nim @@ -0,0 +1,2 @@ +proc prime*(n: int): int = + discard diff --git a/exercises/practice/nucleotide-count/nucleotide_count.nim b/exercises/practice/nucleotide-count/nucleotide_count.nim index e69de29b..a14c93ad 100644 --- a/exercises/practice/nucleotide-count/nucleotide_count.nim +++ b/exercises/practice/nucleotide-count/nucleotide_count.nim @@ -0,0 +1,4 @@ +import std/tables + +proc countDna*(s: string): CountTable[char] = + discard diff --git a/exercises/practice/pangram/pangram.nim b/exercises/practice/pangram/pangram.nim index e69de29b..8ade0bc1 100644 --- a/exercises/practice/pangram/pangram.nim +++ b/exercises/practice/pangram/pangram.nim @@ -0,0 +1,2 @@ +proc isPangram*(s: string): bool = + discard diff --git a/exercises/practice/pascals-triangle/pascals_triangle.nim b/exercises/practice/pascals-triangle/pascals_triangle.nim index e69de29b..aae54653 100644 --- a/exercises/practice/pascals-triangle/pascals_triangle.nim +++ b/exercises/practice/pascals-triangle/pascals_triangle.nim @@ -0,0 +1,2 @@ +proc pascal*(n: int): seq[seq[int]] = + discard diff --git a/exercises/practice/perfect-numbers/perfect_numbers.nim b/exercises/practice/perfect-numbers/perfect_numbers.nim index e69de29b..5412458d 100644 --- a/exercises/practice/perfect-numbers/perfect_numbers.nim +++ b/exercises/practice/perfect-numbers/perfect_numbers.nim @@ -0,0 +1,6 @@ +type + Classification* = enum + Perfect, Deficient, Abundant + +proc classify*(n: int): Classification = + discard diff --git a/exercises/practice/phone-number/phone_number.nim b/exercises/practice/phone-number/phone_number.nim index e69de29b..83a731ae 100644 --- a/exercises/practice/phone-number/phone_number.nim +++ b/exercises/practice/phone-number/phone_number.nim @@ -0,0 +1,2 @@ +proc clean*(s: string): string = + discard diff --git a/exercises/practice/prime-factors/prime_factors.nim b/exercises/practice/prime-factors/prime_factors.nim index e69de29b..b1f4c996 100644 --- a/exercises/practice/prime-factors/prime_factors.nim +++ b/exercises/practice/prime-factors/prime_factors.nim @@ -0,0 +1,2 @@ +proc primeFactors*(n: int64): seq[int] = + discard diff --git a/exercises/practice/protein-translation/protein_translation.nim b/exercises/practice/protein-translation/protein_translation.nim index e69de29b..39ad760b 100644 --- a/exercises/practice/protein-translation/protein_translation.nim +++ b/exercises/practice/protein-translation/protein_translation.nim @@ -0,0 +1,2 @@ +proc translate*(s: string): seq[string] = + discard diff --git a/exercises/practice/proverb/proverb.nim b/exercises/practice/proverb/proverb.nim index e69de29b..cf0b67d0 100644 --- a/exercises/practice/proverb/proverb.nim +++ b/exercises/practice/proverb/proverb.nim @@ -0,0 +1,2 @@ +proc recite*(words: openArray[string]): string = + discard diff --git a/exercises/practice/queen-attack/queen_attack.nim b/exercises/practice/queen-attack/queen_attack.nim index e69de29b..e9814e8a 100644 --- a/exercises/practice/queen-attack/queen_attack.nim +++ b/exercises/practice/queen-attack/queen_attack.nim @@ -0,0 +1,13 @@ +type + Queen* = object + row*: range[0..7] + col*: range[0..7] + +proc initQueen*(row, col: int): Queen = + discard + +proc canAttack*(white, black: Queen): bool = + discard + +proc board*(white, black: Queen): string = + discard diff --git a/exercises/practice/raindrops/raindrops.nim b/exercises/practice/raindrops/raindrops.nim index e69de29b..ad74fd9f 100644 --- a/exercises/practice/raindrops/raindrops.nim +++ b/exercises/practice/raindrops/raindrops.nim @@ -0,0 +1,2 @@ +proc convert*(n: int): string = + discard diff --git a/exercises/practice/resistor-color-duo/resistor_color_duo.nim b/exercises/practice/resistor-color-duo/resistor_color_duo.nim index e69de29b..7521d577 100644 --- a/exercises/practice/resistor-color-duo/resistor_color_duo.nim +++ b/exercises/practice/resistor-color-duo/resistor_color_duo.nim @@ -0,0 +1,6 @@ +type + ResistorColor* = enum + Black, Brown, Red, Orange, Yellow, Green, Blue, Violet, Grey, White + +proc value*(colors: openArray[ResistorColor]): int = + discard diff --git a/exercises/practice/resistor-color-trio/resistor_color_trio.nim b/exercises/practice/resistor-color-trio/resistor_color_trio.nim index e69de29b..92600cd4 100644 --- a/exercises/practice/resistor-color-trio/resistor_color_trio.nim +++ b/exercises/practice/resistor-color-trio/resistor_color_trio.nim @@ -0,0 +1,6 @@ +type + ResistorColor* = enum + Black, Brown, Red, Orange, Yellow, Green, Blue, Violet, Grey, White + +proc label*(r: array[3, ResistorColor]): tuple[value: int, unit: string] = + discard diff --git a/exercises/practice/resistor-color/resistor_color.nim b/exercises/practice/resistor-color/resistor_color.nim index e69de29b..e099d5c7 100644 --- a/exercises/practice/resistor-color/resistor_color.nim +++ b/exercises/practice/resistor-color/resistor_color.nim @@ -0,0 +1,9 @@ +type + ResistorColor* = enum + Black, Brown, Red, Orange, Yellow, Green, Blue, Violet, Grey, White + +proc colorCode*(color: ResistorColor): int = + discard + +proc colors*: array[0..ResistorColor.high.ord, ResistorColor] = + discard diff --git a/exercises/practice/reverse-string/reverse_string.nim b/exercises/practice/reverse-string/reverse_string.nim index e69de29b..36903f0a 100644 --- a/exercises/practice/reverse-string/reverse_string.nim +++ b/exercises/practice/reverse-string/reverse_string.nim @@ -0,0 +1,2 @@ +proc reverse*(s: string): string = + discard diff --git a/exercises/practice/rna-transcription/rna_transcription.nim b/exercises/practice/rna-transcription/rna_transcription.nim index e69de29b..987a77cb 100644 --- a/exercises/practice/rna-transcription/rna_transcription.nim +++ b/exercises/practice/rna-transcription/rna_transcription.nim @@ -0,0 +1,2 @@ +proc toRna*(s: string): string = + discard diff --git a/exercises/practice/robot-name/robot_name.nim b/exercises/practice/robot-name/robot_name.nim index e69de29b..259cb44b 100644 --- a/exercises/practice/robot-name/robot_name.nim +++ b/exercises/practice/robot-name/robot_name.nim @@ -0,0 +1,10 @@ +type + Name* = array[5, char] + Robot* = object + name*: Name + +proc makeRobot*: Robot = + discard + +proc reset*(r: var Robot) = + discard diff --git a/exercises/practice/roman-numerals/roman_numerals.nim b/exercises/practice/roman-numerals/roman_numerals.nim index e69de29b..8ea9228a 100644 --- a/exercises/practice/roman-numerals/roman_numerals.nim +++ b/exercises/practice/roman-numerals/roman_numerals.nim @@ -0,0 +1,2 @@ +proc roman*(n: int): string = + discard diff --git a/exercises/practice/rotational-cipher/rotational_cipher.nim b/exercises/practice/rotational-cipher/rotational_cipher.nim index e69de29b..6f828116 100644 --- a/exercises/practice/rotational-cipher/rotational_cipher.nim +++ b/exercises/practice/rotational-cipher/rotational_cipher.nim @@ -0,0 +1,2 @@ +proc rotate*(s: string, n: Natural): string = + discard diff --git a/exercises/practice/run-length-encoding/run_length_encoding.nim b/exercises/practice/run-length-encoding/run_length_encoding.nim index e69de29b..881ada9c 100644 --- a/exercises/practice/run-length-encoding/run_length_encoding.nim +++ b/exercises/practice/run-length-encoding/run_length_encoding.nim @@ -0,0 +1,5 @@ +proc encode*(s: string): string = + discard + +proc decode*(s: string): string = + discard diff --git a/exercises/practice/saddle-points/saddle_points.nim b/exercises/practice/saddle-points/saddle_points.nim index e69de29b..7d5df7f9 100644 --- a/exercises/practice/saddle-points/saddle_points.nim +++ b/exercises/practice/saddle-points/saddle_points.nim @@ -0,0 +1,2 @@ +proc saddlePoints*(matrix: seq[seq[int]]): seq[tuple[r, c: int]] = + discard diff --git a/exercises/practice/say/say.nim b/exercises/practice/say/say.nim index e69de29b..42f37156 100644 --- a/exercises/practice/say/say.nim +++ b/exercises/practice/say/say.nim @@ -0,0 +1,2 @@ +proc say*(n: int64): string = + discard diff --git a/exercises/practice/scale-generator/scale_generator.nim b/exercises/practice/scale-generator/scale_generator.nim index e69de29b..d8e4ba69 100644 --- a/exercises/practice/scale-generator/scale_generator.nim +++ b/exercises/practice/scale-generator/scale_generator.nim @@ -0,0 +1,2 @@ +proc scale*(tonic: string, intervals = "mmmmmmmmmmm"): seq[string] = + discard diff --git a/exercises/practice/scrabble-score/scrabble_score.nim b/exercises/practice/scrabble-score/scrabble_score.nim index e69de29b..f0793b59 100644 --- a/exercises/practice/scrabble-score/scrabble_score.nim +++ b/exercises/practice/scrabble-score/scrabble_score.nim @@ -0,0 +1,2 @@ +proc score*(word: string): int = + discard diff --git a/exercises/practice/secret-handshake/secret_handshake.nim b/exercises/practice/secret-handshake/secret_handshake.nim index e69de29b..9748fa8f 100644 --- a/exercises/practice/secret-handshake/secret_handshake.nim +++ b/exercises/practice/secret-handshake/secret_handshake.nim @@ -0,0 +1,2 @@ +proc commands*(n: Natural): seq[string] = + discard diff --git a/exercises/practice/series/series.nim b/exercises/practice/series/series.nim index e69de29b..86f90b45 100644 --- a/exercises/practice/series/series.nim +++ b/exercises/practice/series/series.nim @@ -0,0 +1,2 @@ +proc slices*(s: string, n: int): seq[string] = + discard diff --git a/exercises/practice/sieve/sieve.nim b/exercises/practice/sieve/sieve.nim index e69de29b..2d2f4d22 100644 --- a/exercises/practice/sieve/sieve.nim +++ b/exercises/practice/sieve/sieve.nim @@ -0,0 +1,2 @@ +proc primes*(limit: int): seq[int] = + discard diff --git a/exercises/practice/space-age/space_age.nim b/exercises/practice/space-age/space_age.nim index e69de29b..bd9779b9 100644 --- a/exercises/practice/space-age/space_age.nim +++ b/exercises/practice/space-age/space_age.nim @@ -0,0 +1,6 @@ +type + Planet* = enum + Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune + +proc age*(planet: Planet, seconds: int64): float = + discard diff --git a/exercises/practice/spiral-matrix/spiral_matrix.nim b/exercises/practice/spiral-matrix/spiral_matrix.nim index e69de29b..2d6154c7 100644 --- a/exercises/practice/spiral-matrix/spiral_matrix.nim +++ b/exercises/practice/spiral-matrix/spiral_matrix.nim @@ -0,0 +1,2 @@ +proc spiral*(n: static int): array[n, array[n, int]] = + discard diff --git a/exercises/practice/sublist/sublist.nim b/exercises/practice/sublist/sublist.nim index e69de29b..1a7704c2 100644 --- a/exercises/practice/sublist/sublist.nim +++ b/exercises/practice/sublist/sublist.nim @@ -0,0 +1,6 @@ +type + Comparison* = enum + Unequal, Sublist, Superlist, Equal + +proc sublist*(a, b: openArray[int]): Comparison = + discard diff --git a/exercises/practice/sum-of-multiples/sum_of_multiples.nim b/exercises/practice/sum-of-multiples/sum_of_multiples.nim index e69de29b..c3d2196d 100644 --- a/exercises/practice/sum-of-multiples/sum_of_multiples.nim +++ b/exercises/practice/sum-of-multiples/sum_of_multiples.nim @@ -0,0 +1,2 @@ +proc sum*(limit: int, factors: seq[int]): int = + discard diff --git a/exercises/practice/triangle/triangle.nim b/exercises/practice/triangle/triangle.nim index e69de29b..8a1dcacf 100644 --- a/exercises/practice/triangle/triangle.nim +++ b/exercises/practice/triangle/triangle.nim @@ -0,0 +1,8 @@ +proc isEquilateral*(sides: array[3, int]): bool = + discard + +proc isIsosceles*(sides: array[3, int]): bool = + discard + +proc isScalene*(sides: array[3, int]): bool = + discard diff --git a/exercises/practice/twelve-days/twelve_days.nim b/exercises/practice/twelve-days/twelve_days.nim index e69de29b..885cc2d9 100644 --- a/exercises/practice/twelve-days/twelve_days.nim +++ b/exercises/practice/twelve-days/twelve_days.nim @@ -0,0 +1,2 @@ +proc recite*(start: int, stop = 1): string = + discard diff --git a/exercises/practice/two-fer/two_fer.nim b/exercises/practice/two-fer/two_fer.nim index e69de29b..dbfaccd6 100644 --- a/exercises/practice/two-fer/two_fer.nim +++ b/exercises/practice/two-fer/two_fer.nim @@ -0,0 +1,2 @@ +proc twoFer*(name = ""): string = + discard diff --git a/exercises/practice/word-count/word_count.nim b/exercises/practice/word-count/word_count.nim index e69de29b..d5f7e76d 100644 --- a/exercises/practice/word-count/word_count.nim +++ b/exercises/practice/word-count/word_count.nim @@ -0,0 +1,4 @@ +import std/tables + +proc countWords*(s: string): Table[string, int] = + discard diff --git a/exercises/practice/yacht/yacht.nim b/exercises/practice/yacht/yacht.nim index e69de29b..bc37b23e 100644 --- a/exercises/practice/yacht/yacht.nim +++ b/exercises/practice/yacht/yacht.nim @@ -0,0 +1,7 @@ +type + Category* = enum + Ones, Twos, Threes, Fours, Fives, Sixes, + FullHouse, FourOfAKind, LittleStraight, BigStraight, Choice, Yacht + +proc score*(dice: array[5, int], category: Category): int = + discard From 76b06f738b9b3c6a97ecf2417b0599fc5304645f Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Sat, 14 Jan 2023 12:00:01 +0100 Subject: [PATCH 02/11] .github, check_stubs: check stubs in CI And for now: - Implement this outside `check_exercises.nim`. - Don't optimize by combining the tests for every exercise stub. This simplifies checking that running each individual test file produces an error when using the stub. --- .github/workflows/exercises.yml | 6 ++++ _test/check_stubs.nim | 55 +++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 _test/check_stubs.nim diff --git a/.github/workflows/exercises.yml b/.github/workflows/exercises.yml index dc8f2437..f81f813b 100644 --- a/.github/workflows/exercises.yml +++ b/.github/workflows/exercises.yml @@ -55,3 +55,9 @@ jobs: - name: Run `check_exercises` run: _test/check_exercises + + - name: Compile `check_stubs.nim` + run: nim c --styleCheck:error _test/check_stubs.nim + + - name: Run `check_stubs` + run: _test/check_stubs diff --git a/_test/check_stubs.nim b/_test/check_stubs.nim new file mode 100644 index 00000000..a33e8844 --- /dev/null +++ b/_test/check_stubs.nim @@ -0,0 +1,55 @@ +import std/[os, osproc, strformat, strutils] + +iterator walkExerciseDirs: string = + const repoRootDir = currentSourcePath().parentDir().parentDir() + for exerciseKind in ["concept", "practice"]: + for exerciseDir in walkDirs(repoRootDir / "exercises" / exerciseKind / "*"): + yield exerciseDir + +proc checkStubs: seq[string] = + ## Compiles and runs the test file for every exercise, using the user-facing + ## solution stub. + ## + ## Returns the exercise slugs for which the corresponding test file either: + ## + ## - compiles with an error + ## + ## - runs without an error (the solution stub is supposed to fail the tests) + result = @[] + stderr.writeLine "Checking stubs..." + for exerciseDir in walkExerciseDirs(): + let slug = exerciseDir.lastPathPart() + let testPath = exerciseDir / &"test_{slug.replace('-', '_')}.nim" + stderr.writeLine &"{slug}" + const nimOptions = "--hints:off --usenimcache --filenames:canonical " & + "--spellSuggest:0 --styleCheck:error" + let (outpCompile, errCompile) = execCmdEx(&"nim c {nimOptions} {testPath}") + if errCompile == 0: + let (outpRun, errRun) = execCmdEx(&"nim r --hints:off {testPath}") + if errRun == 0: + stderr.write outpRun + stderr.writeLine &"Error: the {slug} stub passed the tests\n" + result.add slug + else: + stderr.writeLine outpCompile + result.add slug + +proc main = + let errorSlugs = checkStubs() + if errorSlugs.len > 0: + let msg = fmt""" + + Error: there were {errorSlugs.len} exercises with a problematic stub: + {errorSlugs.join(", ")}""".unindent() + echo msg + quit 1 + else: + const msg = """ + + Success. Every exercise has a test file and stub that: + - compiles without error + - runs with an error (we want the stub to fail the tests)""".unindent() + echo msg + +when isMainModule: + main() From 7190dd34a50f2d14b59ae183c4f7d19cc2bb1d7d Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Wed, 22 Feb 2023 14:15:01 +0100 Subject: [PATCH 03/11] exercises(darts): update stub to reflect redesign Reflect the changes from commit 53d780350e48. --- exercises/practice/darts/darts.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/practice/darts/darts.nim b/exercises/practice/darts/darts.nim index 4c9e30e0..7f94b4ac 100644 --- a/exercises/practice/darts/darts.nim +++ b/exercises/practice/darts/darts.nim @@ -1,2 +1,2 @@ -proc score*(p: tuple[x, y: float]): int = +proc score*(x, y: float): int = discard From 957596c010fd513d7a749c1e2c759bc0a783de06 Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Sun, 5 Mar 2023 12:30:01 +0100 Subject: [PATCH 04/11] exercises(lasagna): stub: make parameter names match instructions --- exercises/concept/lasagna/lasagna.nim | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/exercises/concept/lasagna/lasagna.nim b/exercises/concept/lasagna/lasagna.nim index 4e76ae2e..b2f96a67 100644 --- a/exercises/concept/lasagna/lasagna.nim +++ b/exercises/concept/lasagna/lasagna.nim @@ -1,14 +1,14 @@ let expectedMinutesInOven* = 5 -proc remainingMinutesInOven*(elapsedMinutes: int): int = +proc remainingMinutesInOven*(actualMinutesInOven: int): int = ## Returns the number of minutes that the lasagna still needs to remain in the ## oven to be properly prepared. discard -proc preparationTimeInMinutes*(layers: int): int = +proc preparationTimeInMinutes*(numberOfLayers: int): int = ## Returns the total preparation time for a given number of layers. discard -proc totalTimeInMinutes*(layers, minutesInOven: int): int = +proc totalTimeInMinutes*(numberOfLayers, actualMinutesInOven: int): int = ## Returns the total time required to prepare the lasagna. discard From 6b29c208d32d68ec24582637ea040b3798470e89 Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Sun, 5 Mar 2023 12:30:02 +0100 Subject: [PATCH 05/11] exercises(hamming): rename parameters to a and b --- exercises/practice/hamming/hamming.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/practice/hamming/hamming.nim b/exercises/practice/hamming/hamming.nim index 176a22ec..e4198df0 100644 --- a/exercises/practice/hamming/hamming.nim +++ b/exercises/practice/hamming/hamming.nim @@ -1,2 +1,2 @@ -proc distance*(strand1, strand2: string): int = +proc distance*(a, b: string): int = discard From d3b892211b1971a249788d4d4bd98d34c79f9232 Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Sun, 5 Mar 2023 12:30:03 +0100 Subject: [PATCH 06/11] exercises(queen-attack): use `int`, not range type --- exercises/practice/queen-attack/queen_attack.nim | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/practice/queen-attack/queen_attack.nim b/exercises/practice/queen-attack/queen_attack.nim index e9814e8a..b468c637 100644 --- a/exercises/practice/queen-attack/queen_attack.nim +++ b/exercises/practice/queen-attack/queen_attack.nim @@ -1,7 +1,7 @@ type Queen* = object - row*: range[0..7] - col*: range[0..7] + row*: int + col*: int proc initQueen*(row, col: int): Queen = discard From 11145b186063a202e39b9b13e79b8b37e19b81e6 Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Sun, 5 Mar 2023 12:30:04 +0100 Subject: [PATCH 07/11] exercises(rotational-cipher, secret-handshake): remove `Natural` --- exercises/practice/rotational-cipher/rotational_cipher.nim | 2 +- exercises/practice/secret-handshake/secret_handshake.nim | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/exercises/practice/rotational-cipher/rotational_cipher.nim b/exercises/practice/rotational-cipher/rotational_cipher.nim index 6f828116..70b5fe30 100644 --- a/exercises/practice/rotational-cipher/rotational_cipher.nim +++ b/exercises/practice/rotational-cipher/rotational_cipher.nim @@ -1,2 +1,2 @@ -proc rotate*(s: string, n: Natural): string = +proc rotate*(s: string, n: int): string = discard diff --git a/exercises/practice/secret-handshake/secret_handshake.nim b/exercises/practice/secret-handshake/secret_handshake.nim index 9748fa8f..7910973b 100644 --- a/exercises/practice/secret-handshake/secret_handshake.nim +++ b/exercises/practice/secret-handshake/secret_handshake.nim @@ -1,2 +1,2 @@ -proc commands*(n: Natural): seq[string] = +proc commands*(n: int): seq[string] = discard From 351c222f00d01ddc605e5e73fa7b79569e517212 Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Sun, 5 Mar 2023 12:30:05 +0100 Subject: [PATCH 08/11] exercises(dnd-character): add Character fields I'm not convinced that it's worth requiring the user to add this themselves. --- exercises/practice/dnd-character/dnd_character.nim | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/exercises/practice/dnd-character/dnd_character.nim b/exercises/practice/dnd-character/dnd_character.nim index f3d266ef..5d5bca1e 100644 --- a/exercises/practice/dnd-character/dnd_character.nim +++ b/exercises/practice/dnd-character/dnd_character.nim @@ -1,6 +1,12 @@ type Character* = object strength*: int + dexterity*: int + constitution*: int + intelligence*: int + wisdom*: int + charisma*: int + hitpoints*: int proc ability*: int = discard From 53c07dd1c2fcb869d40679bcca66f0c7abddadfb Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Sun, 5 Mar 2023 13:00:01 +0100 Subject: [PATCH 09/11] exercises(scale-generator): make default parameter less magic --- exercises/practice/scale-generator/scale_generator.nim | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/exercises/practice/scale-generator/scale_generator.nim b/exercises/practice/scale-generator/scale_generator.nim index d8e4ba69..408998b5 100644 --- a/exercises/practice/scale-generator/scale_generator.nim +++ b/exercises/practice/scale-generator/scale_generator.nim @@ -1,2 +1,6 @@ -proc scale*(tonic: string, intervals = "mmmmmmmmmmm"): seq[string] = +import std/strutils + +const chromaticIntervals = "m".repeat(11) + +proc scale*(tonic: string, intervals = chromaticIntervals): seq[string] = discard From 6764cc68421e13e2d6519c2657a552fb60a1a1cd Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Sun, 5 Mar 2023 13:00:02 +0100 Subject: [PATCH 10/11] exercises(twelve-days): stub: change stop default value to -1 Try to communicate the idea slightly better. We might consider making both parameters required, but let's leave that for later. Otherwise, I think it's better to avoid writing `stop = start`, so the user can discover that for themselves, or be mentored on that point. --- exercises/practice/twelve-days/twelve_days.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/practice/twelve-days/twelve_days.nim b/exercises/practice/twelve-days/twelve_days.nim index 885cc2d9..57ab44e7 100644 --- a/exercises/practice/twelve-days/twelve_days.nim +++ b/exercises/practice/twelve-days/twelve_days.nim @@ -1,2 +1,2 @@ -proc recite*(start: int, stop = 1): string = +proc recite*(start: int, stop = -1): string = discard From 208964a29d42a2e7571797d8b7814f2df242d6cf Mon Sep 17 00:00:00 2001 From: ee7 <45465154+ee7@users.noreply.github.com> Date: Sun, 5 Mar 2023 13:00:03 +0100 Subject: [PATCH 11/11] exercises(sum-of-multiples): prefer `openArray` parameter --- exercises/practice/sum-of-multiples/sum_of_multiples.nim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exercises/practice/sum-of-multiples/sum_of_multiples.nim b/exercises/practice/sum-of-multiples/sum_of_multiples.nim index c3d2196d..e3fedc24 100644 --- a/exercises/practice/sum-of-multiples/sum_of_multiples.nim +++ b/exercises/practice/sum-of-multiples/sum_of_multiples.nim @@ -1,2 +1,2 @@ -proc sum*(limit: int, factors: seq[int]): int = +proc sum*(limit: int, factors: openArray[int]): int = discard