From 41c11777dd5f29a50cfe59b1691b7f5451e9a42d Mon Sep 17 00:00:00 2001 From: BNAndras <20251272+BNAndras@users.noreply.github.com> Date: Sun, 8 Mar 2026 22:56:02 -0700 Subject: [PATCH 1/2] add `grains` --- config.json | 8 ++++ exercises/practice/grains/.busted | 5 +++ .../practice/grains/.docs/instructions.md | 11 +++++ .../practice/grains/.docs/introduction.md | 6 +++ exercises/practice/grains/.meta/config.json | 19 ++++++++ exercises/practice/grains/.meta/example.moon | 8 ++++ .../practice/grains/.meta/spec_generator.moon | 17 ++++++++ exercises/practice/grains/.meta/tests.toml | 43 +++++++++++++++++++ exercises/practice/grains/grains.moon | 7 +++ exercises/practice/grains/grains_spec.moon | 36 ++++++++++++++++ 10 files changed, 160 insertions(+) create mode 100644 exercises/practice/grains/.busted create mode 100644 exercises/practice/grains/.docs/instructions.md create mode 100644 exercises/practice/grains/.docs/introduction.md create mode 100644 exercises/practice/grains/.meta/config.json create mode 100644 exercises/practice/grains/.meta/example.moon create mode 100644 exercises/practice/grains/.meta/spec_generator.moon create mode 100644 exercises/practice/grains/.meta/tests.toml create mode 100644 exercises/practice/grains/grains.moon create mode 100644 exercises/practice/grains/grains_spec.moon diff --git a/config.json b/config.json index 6050599..8c44116 100644 --- a/config.json +++ b/config.json @@ -98,6 +98,14 @@ "prerequisites": [], "difficulty": 2 }, + { + "slug": "grains", + "name": "Grains", + "uuid": "b960441a-2cd9-4384-bfcc-58a1723873da", + "practices": [], + "prerequisites": [], + "difficulty": 2 + }, { "slug": "hamming", "name": "Hamming", diff --git a/exercises/practice/grains/.busted b/exercises/practice/grains/.busted new file mode 100644 index 0000000..86b84e7 --- /dev/null +++ b/exercises/practice/grains/.busted @@ -0,0 +1,5 @@ +return { + default = { + ROOT = { '.' } + } +} diff --git a/exercises/practice/grains/.docs/instructions.md b/exercises/practice/grains/.docs/instructions.md new file mode 100644 index 0000000..f5b752a --- /dev/null +++ b/exercises/practice/grains/.docs/instructions.md @@ -0,0 +1,11 @@ +# Instructions + +Calculate the number of grains of wheat on a chessboard. + +A chessboard has 64 squares. +Square 1 has one grain, square 2 has two grains, square 3 has four grains, and so on, doubling each time. + +Write code that calculates: + +- the number of grains on a given square +- the total number of grains on the chessboard diff --git a/exercises/practice/grains/.docs/introduction.md b/exercises/practice/grains/.docs/introduction.md new file mode 100644 index 0000000..0df4f46 --- /dev/null +++ b/exercises/practice/grains/.docs/introduction.md @@ -0,0 +1,6 @@ +# Introduction + +There once was a wise servant who saved the life of a prince. +The king promised to pay whatever the servant could dream up. +Knowing that the king loved chess, the servant told the king he would like to have grains of wheat. +One grain on the first square of a chessboard, with the number of grains doubling on each successive square. diff --git a/exercises/practice/grains/.meta/config.json b/exercises/practice/grains/.meta/config.json new file mode 100644 index 0000000..f20d0aa --- /dev/null +++ b/exercises/practice/grains/.meta/config.json @@ -0,0 +1,19 @@ +{ + "authors": [ + "BNAndras" + ], + "files": { + "solution": [ + "grains.moon" + ], + "test": [ + "grains_spec.moon" + ], + "example": [ + ".meta/example.moon" + ] + }, + "blurb": "Calculate the number of grains of wheat on a chessboard given that the number on each square doubles.", + "source": "The CodeRanch Cattle Drive, Assignment 6", + "source_url": "https://web.archive.org/web/20240908084142/https://coderanch.com/wiki/718824/Grains" +} diff --git a/exercises/practice/grains/.meta/example.moon b/exercises/practice/grains/.meta/example.moon new file mode 100644 index 0000000..6f7d11f --- /dev/null +++ b/exercises/practice/grains/.meta/example.moon @@ -0,0 +1,8 @@ +{ + square: (n) -> + error 'square must be between 1 and 64' unless n >= 1 and n <= 64 + 2 ^ (n - 1) + + total: -> + 2 ^ 64 - 1 +} diff --git a/exercises/practice/grains/.meta/spec_generator.moon b/exercises/practice/grains/.meta/spec_generator.moon new file mode 100644 index 0000000..9d3a868 --- /dev/null +++ b/exercises/practice/grains/.meta/spec_generator.moon @@ -0,0 +1,17 @@ +format = (number) -> + string.format '%.0f', number + +{ + module_name: 'Grains' + + generate_test: (case, level) -> + lines = {} + if type(case.expected) == 'table' and case.expected.error + table.insert lines, 'assert.has.errors -> Grains.#{case.property} #{case.input.square}, #{quote case.expected.error}' + else if case.property == 'square' + table.insert lines, 'assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square}' + else + table.insert lines, 'assert.are.equal #{format case.expected}, Grains.#{case.property}!' + + table.concat [indent line, level for line in *lines], '\n' +} diff --git a/exercises/practice/grains/.meta/tests.toml b/exercises/practice/grains/.meta/tests.toml new file mode 100644 index 0000000..6ea68bc --- /dev/null +++ b/exercises/practice/grains/.meta/tests.toml @@ -0,0 +1,43 @@ +# 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. + +[9fbde8de-36b2-49de-baf2-cd42d6f28405] +description = "returns the number of grains on the square -> grains on square 1" + +[ee1f30c2-01d8-4298-b25d-c677331b5e6d] +description = "returns the number of grains on the square -> grains on square 2" + +[10f45584-2fc3-4875-8ec6-666065d1163b] +description = "returns the number of grains on the square -> grains on square 3" + +[a7cbe01b-36f4-4601-b053-c5f6ae055170] +description = "returns the number of grains on the square -> grains on square 4" + +[c50acc89-8535-44e4-918f-b848ad2817d4] +description = "returns the number of grains on the square -> grains on square 16" + +[acd81b46-c2ad-4951-b848-80d15ed5a04f] +description = "returns the number of grains on the square -> grains on square 32" + +[c73b470a-5efb-4d53-9ac6-c5f6487f227b] +description = "returns the number of grains on the square -> grains on square 64" + +[1d47d832-3e85-4974-9466-5bd35af484e3] +description = "returns the number of grains on the square -> square 0 is invalid" + +[61974483-eeb2-465e-be54-ca5dde366453] +description = "returns the number of grains on the square -> negative square is invalid" + +[a95e4374-f32c-45a7-a10d-ffec475c012f] +description = "returns the number of grains on the square -> square greater than 64 is invalid" + +[6eb07385-3659-4b45-a6be-9dc474222750] +description = "returns the total number of grains on the board" diff --git a/exercises/practice/grains/grains.moon b/exercises/practice/grains/grains.moon new file mode 100644 index 0000000..98dd7e5 --- /dev/null +++ b/exercises/practice/grains/grains.moon @@ -0,0 +1,7 @@ +{ + square: (n) -> + error 'Implement me!' + + total: -> + error 'Implement me!' +} diff --git a/exercises/practice/grains/grains_spec.moon b/exercises/practice/grains/grains_spec.moon new file mode 100644 index 0000000..325d396 --- /dev/null +++ b/exercises/practice/grains/grains_spec.moon @@ -0,0 +1,36 @@ +Grains = require 'grains' + +describe 'grains', -> + describe 'returns the number of grains on the square', -> + it 'grains on square 1', -> + assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + + pending 'grains on square 2', -> + assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + + pending 'grains on square 3', -> + assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + + pending 'grains on square 4', -> + assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + + pending 'grains on square 16', -> + assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + + pending 'grains on square 32', -> + assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + + pending 'grains on square 64', -> + assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + + pending 'square 0 is invalid', -> + assert.has.errors -> Grains.#{case.property} #{case.input.square}, #{quote case.expected.error} + + pending 'negative square is invalid', -> + assert.has.errors -> Grains.#{case.property} #{case.input.square}, #{quote case.expected.error} + + pending 'square greater than 64 is invalid', -> + assert.has.errors -> Grains.#{case.property} #{case.input.square}, #{quote case.expected.error} + + pending 'returns the total number of grains on the board', -> + assert.are.equal #{format case.expected}, Grains.#{case.property}! From a6216b6fda3225ef7cd1e5ea3de691ac76c2f7b6 Mon Sep 17 00:00:00 2001 From: BNAndras <20251272+BNAndras@users.noreply.github.com> Date: Sun, 8 Mar 2026 23:14:22 -0700 Subject: [PATCH 2/2] Fix missng double quotes --- .../practice/grains/.meta/spec_generator.moon | 6 ++--- exercises/practice/grains/grains_spec.moon | 22 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/exercises/practice/grains/.meta/spec_generator.moon b/exercises/practice/grains/.meta/spec_generator.moon index 9d3a868..31077ee 100644 --- a/exercises/practice/grains/.meta/spec_generator.moon +++ b/exercises/practice/grains/.meta/spec_generator.moon @@ -7,11 +7,11 @@ format = (number) -> generate_test: (case, level) -> lines = {} if type(case.expected) == 'table' and case.expected.error - table.insert lines, 'assert.has.errors -> Grains.#{case.property} #{case.input.square}, #{quote case.expected.error}' + table.insert lines, "assert.has.errors -> Grains.#{case.property} #{case.input.square}, #{quote case.expected.error}" else if case.property == 'square' - table.insert lines, 'assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square}' + table.insert lines, "assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square}" else - table.insert lines, 'assert.are.equal #{format case.expected}, Grains.#{case.property}!' + table.insert lines, "assert.are.equal #{format case.expected}, Grains.#{case.property}!" table.concat [indent line, level for line in *lines], '\n' } diff --git a/exercises/practice/grains/grains_spec.moon b/exercises/practice/grains/grains_spec.moon index 325d396..712c3aa 100644 --- a/exercises/practice/grains/grains_spec.moon +++ b/exercises/practice/grains/grains_spec.moon @@ -3,34 +3,34 @@ Grains = require 'grains' describe 'grains', -> describe 'returns the number of grains on the square', -> it 'grains on square 1', -> - assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + assert.are.equal 1, Grains.square 1 pending 'grains on square 2', -> - assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + assert.are.equal 2, Grains.square 2 pending 'grains on square 3', -> - assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + assert.are.equal 4, Grains.square 3 pending 'grains on square 4', -> - assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + assert.are.equal 8, Grains.square 4 pending 'grains on square 16', -> - assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + assert.are.equal 32768, Grains.square 16 pending 'grains on square 32', -> - assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + assert.are.equal 2147483648, Grains.square 32 pending 'grains on square 64', -> - assert.are.equal #{format case.expected}, Grains.#{case.property} #{case.input.square} + assert.are.equal 9223372036854775808, Grains.square 64 pending 'square 0 is invalid', -> - assert.has.errors -> Grains.#{case.property} #{case.input.square}, #{quote case.expected.error} + assert.has.errors -> Grains.square 0, 'square must be between 1 and 64' pending 'negative square is invalid', -> - assert.has.errors -> Grains.#{case.property} #{case.input.square}, #{quote case.expected.error} + assert.has.errors -> Grains.square -1, 'square must be between 1 and 64' pending 'square greater than 64 is invalid', -> - assert.has.errors -> Grains.#{case.property} #{case.input.square}, #{quote case.expected.error} + assert.has.errors -> Grains.square 65, 'square must be between 1 and 64' pending 'returns the total number of grains on the board', -> - assert.are.equal #{format case.expected}, Grains.#{case.property}! + assert.are.equal 18446744073709551616, Grains.total!