From 726c4785b9cb990af265b5df19dac1b06fdadaf8 Mon Sep 17 00:00:00 2001 From: J R M Date: Mon, 30 Mar 2026 17:38:58 +0200 Subject: [PATCH 1/2] all your base --- config.json | 8 ++ .../all-your-base/.docs/instructions.md | 28 +++++++ .../all-your-base/.docs/introduction.md | 8 ++ .../practice/all-your-base/.meta/config.json | 17 +++++ .../practice/all-your-base/.meta/example.nu | 28 +++++++ .../practice/all-your-base/.meta/tests.toml | 73 +++++++++++++++++++ .../practice/all-your-base/all-your-base.nu | 4 + exercises/practice/all-your-base/tests.nu | 23 ++++++ 8 files changed, 189 insertions(+) create mode 100644 exercises/practice/all-your-base/.docs/instructions.md create mode 100644 exercises/practice/all-your-base/.docs/introduction.md create mode 100644 exercises/practice/all-your-base/.meta/config.json create mode 100644 exercises/practice/all-your-base/.meta/example.nu create mode 100644 exercises/practice/all-your-base/.meta/tests.toml create mode 100644 exercises/practice/all-your-base/all-your-base.nu create mode 100644 exercises/practice/all-your-base/tests.nu diff --git a/config.json b/config.json index d619ead..4d22d93 100644 --- a/config.json +++ b/config.json @@ -125,6 +125,14 @@ "practices": [], "prerequisites": [], "difficulty": 2 + }, + { + "slug": "all-your-base", + "name": "All Your Base", + "uuid": "b858df1d-c175-4bc2-a6f8-b4f4339d60c2", + "practices": [], + "prerequisites": [], + "difficulty": 1 } ] }, diff --git a/exercises/practice/all-your-base/.docs/instructions.md b/exercises/practice/all-your-base/.docs/instructions.md new file mode 100644 index 0000000..1b688b6 --- /dev/null +++ b/exercises/practice/all-your-base/.docs/instructions.md @@ -0,0 +1,28 @@ +# Instructions + +Convert a sequence of digits in one base, representing a number, into a sequence of digits in another base, representing the same number. + +~~~~exercism/note +Try to implement the conversion yourself. +Do not use something else to perform the conversion for you. +~~~~ + +## About [Positional Notation][positional-notation] + +In positional notation, a number in base **b** can be understood as a linear combination of powers of **b**. + +The number 42, _in base 10_, means: + +`(4 × 10¹) + (2 × 10⁰)` + +The number 101010, _in base 2_, means: + +`(1 × 2⁵) + (0 × 2⁴) + (1 × 2³) + (0 × 2²) + (1 × 2¹) + (0 × 2⁰)` + +The number 1120, _in base 3_, means: + +`(1 × 3³) + (1 × 3²) + (2 × 3¹) + (0 × 3⁰)` + +_Yes. Those three numbers above are exactly the same. Congratulations!_ + +[positional-notation]: https://en.wikipedia.org/wiki/Positional_notation diff --git a/exercises/practice/all-your-base/.docs/introduction.md b/exercises/practice/all-your-base/.docs/introduction.md new file mode 100644 index 0000000..68aaffb --- /dev/null +++ b/exercises/practice/all-your-base/.docs/introduction.md @@ -0,0 +1,8 @@ +# Introduction + +You've just been hired as professor of mathematics. +Your first week went well, but something is off in your second week. +The problem is that every answer given by your students is wrong! +Luckily, your math skills have allowed you to identify the problem: the student answers _are_ correct, but they're all in base 2 (binary)! +Amazingly, it turns out that each week, the students use a different base. +To help you quickly verify the student answers, you'll be building a tool to translate between bases. diff --git a/exercises/practice/all-your-base/.meta/config.json b/exercises/practice/all-your-base/.meta/config.json new file mode 100644 index 0000000..c8cb800 --- /dev/null +++ b/exercises/practice/all-your-base/.meta/config.json @@ -0,0 +1,17 @@ +{ + "authors": [ + "quintuple-mallard" + ], + "files": { + "solution": [ + "all-your-base.nu" + ], + "test": [ + "tests.nu" + ], + "example": [ + ".meta/example.nu" + ] + }, + "blurb": "Convert a number, represented as a sequence of digits in one base, to any other base." +} diff --git a/exercises/practice/all-your-base/.meta/example.nu b/exercises/practice/all-your-base/.meta/example.nu new file mode 100644 index 0000000..3d69ddd --- /dev/null +++ b/exercises/practice/all-your-base/.meta/example.nu @@ -0,0 +1,28 @@ +use std/assert +def base_ten [base: number]: list -> number { + $in | reverse | enumerate | reduce --fold 0 {|el, acc| + let i = $el.index + let digit = $el.item + $acc + $digit * $base ** $i + } +} +def rebase_from_ten [base: number]: number -> list { + mut num = $in + mut out = [] + while $num > 0 { + let digit = $num mod $base + $out ++= [$digit] + $num -= $digit + $num /= $base + } + $out | reverse +} +export def rebase [--input-base (-i): number, --output-base (-o): number]: list -> list { + assert ($input_base >= 2) "input base must be >= 2" + assert ($output_base >= 2) "output base must be >= 2" + let number = $in + assert ($number | all {|d| 0 <= $d and $d < $input_base }) "all digits must satisfy 0 <= d < input base" + let number = $number | base_ten $input_base + let rebased = $number | rebase_from_ten $output_base + if $rebased == [] { [0] } else $rebased +} diff --git a/exercises/practice/all-your-base/.meta/tests.toml b/exercises/practice/all-your-base/.meta/tests.toml new file mode 100644 index 0000000..8968c13 --- /dev/null +++ b/exercises/practice/all-your-base/.meta/tests.toml @@ -0,0 +1,73 @@ +# 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. + +[5ce422f9-7a4b-4f44-ad29-49c67cb32d2c] +description = "single bit one to decimal" + +[0cc3fea8-bb79-46ac-a2ab-5a2c93051033] +description = "binary to single decimal" + +[f12db0f9-0d3d-42c2-b3ba-e38cb375a2b8] +description = "single decimal to binary" + +[2c45cf54-6da3-4748-9733-5a3c765d925b] +description = "binary to multiple decimal" + +[65ddb8b4-8899-4fcc-8618-181b2cf0002d] +description = "decimal to binary" + +[8d418419-02a7-4824-8b7a-352d33c6987e] +description = "trinary to hexadecimal" + +[d3901c80-8190-41b9-bd86-38d988efa956] +description = "hexadecimal to trinary" + +[5d42f85e-21ad-41bd-b9be-a3e8e4258bbf] +description = "15-bit integer" + +[d68788f7-66dd-43f8-a543-f15b6d233f83] +description = "empty list" + +[5e27e8da-5862-4c5f-b2a9-26c0382b6be7] +description = "single zero" + +[2e1c2573-77e4-4b9c-8517-6c56c5bcfdf2] +description = "multiple zeros" + +[3530cd9f-8d6d-43f5-bc6e-b30b1db9629b] +description = "leading zeros" + +[a6b476a1-1901-4f2a-92c4-4d91917ae023] +description = "input base is one" + +[e21a693a-7a69-450b-b393-27415c26a016] +description = "input base is zero" + +[54a23be5-d99e-41cc-88e0-a650ffe5fcc2] +description = "input base is negative" + +[9eccf60c-dcc9-407b-95d8-c37b8be56bb6] +description = "negative digit" + +[232fa4a5-e761-4939-ba0c-ed046cd0676a] +description = "invalid positive digit" + +[14238f95-45da-41dc-95ce-18f860b30ad3] +description = "output base is one" + +[73dac367-da5c-4a37-95fe-c87fad0a4047] +description = "output base is zero" + +[13f81f42-ff53-4e24-89d9-37603a48ebd9] +description = "output base is negative" + +[0e6c895d-8a5d-4868-a345-309d094cfe8d] +description = "both bases are negative" diff --git a/exercises/practice/all-your-base/all-your-base.nu b/exercises/practice/all-your-base/all-your-base.nu new file mode 100644 index 0000000..2c1fd77 --- /dev/null +++ b/exercises/practice/all-your-base/all-your-base.nu @@ -0,0 +1,4 @@ +export def rebase [--input-base (-i): number, --output-base (-o): number]: list -> number { + error make {msg: "Please implement rebase"} + NaN # This is to prevent the typechecker from erroring +} diff --git a/exercises/practice/all-your-base/tests.nu b/exercises/practice/all-your-base/tests.nu new file mode 100644 index 0000000..2a06ea6 --- /dev/null +++ b/exercises/practice/all-your-base/tests.nu @@ -0,0 +1,23 @@ +use std/assert +use all-your-base.nu rebase +assert equal ([1] | rebase -i 2 -o 10) [1] +assert equal ([1, 0, 1] | rebase -i 2 -o 10) [5] +assert equal ([5] | rebase -i 10 -o 2) [1, 0, 1] +assert equal ([1, 0, 1, 0, 1, 0] | rebase -i 2 -o 10) [4, 2] +assert equal ([4, 2] | rebase -i 10 -o 2) [1, 0, 1, 0, 1, 0] +assert equal ([1, 1, 2, 0] | rebase -i 3 -o 16) [2, 10] +assert equal ([2, 10] | rebase -i 16 -o 3) [1, 1, 2, 0] +assert equal ([3, 46, 60] | rebase -i 97 -o 73) [6, 10, 45] +assert equal ([] | rebase -i 2 -o 10) [0] +assert equal ([0] | rebase -i 10 -o 2) [0] +assert equal ([0, 0, 0] | rebase -i 10 -o 2) [0] +assert equal ([0, 6, 0] | rebase -i 7 -o 10) [4, 2] +assert equal (try { [0] | rebase -i 1 -o 10 } catch {|e| $e.msg}) "input base must be >= 2" +assert equal (try { [] | rebase -i 0 -o 10 } catch {|e| $e.msg}) "input base must be >= 2" +assert equal (try { [1] | rebase -i -2 -o 10 } catch {|e| $e.msg}) "input base must be >= 2" +assert equal (try { [1,-1, 1, 0, 1, 0] | rebase -i 2 -o 10 } catch {|e| $e.msg}) "all digits must satisfy 0 <= d < input base" +assert equal (try { [1, 2, 1, 0, 1, 0] | rebase -i 2 -o 10 } catch {|e| $e.msg}) "all digits must satisfy 0 <= d < input base" +assert equal (try { [1, 0, 1, 0, 1, 0] | rebase -i 2 -o 1 } catch {|e| $e.msg}) "output base must be >= 2" +assert equal (try { [7] | rebase -i 10 -o 0 } catch {|e| $e.msg}) "output base must be >= 2" +assert equal (try { [1] | rebase -i 2 -o -7 } catch {|e| $e.msg}) "output base must be >= 2" +assert equal (try { [1] | rebase -i -2 -o -7 } catch {|e| $e.msg}) "input base must be >= 2" From a158855b3fca20239287e91d5641553be429c674 Mon Sep 17 00:00:00 2001 From: J R M Date: Mon, 30 Mar 2026 17:39:52 +0200 Subject: [PATCH 2/2] difficulty --- config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.json b/config.json index 4d22d93..7933d6b 100644 --- a/config.json +++ b/config.json @@ -132,7 +132,7 @@ "uuid": "b858df1d-c175-4bc2-a6f8-b4f4339d60c2", "practices": [], "prerequisites": [], - "difficulty": 1 + "difficulty": 5 } ] },