diff --git a/config.json b/config.json index 64e6309..3ce4ae2 100644 --- a/config.json +++ b/config.json @@ -594,6 +594,14 @@ "prerequisites": [], "difficulty": 7 }, + { + "slug": "all-your-base", + "name": "All Your Base", + "uuid": "c4f16cf6-9f80-4d3a-bdad-c434483fc120", + "practices": [], + "prerequisites": [], + "difficulty": 7 + }, { "slug": "saddle-points", "name": "Saddle Points", 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..48447a7 --- /dev/null +++ b/exercises/practice/all-your-base/.meta/config.json @@ -0,0 +1,17 @@ +{ + "authors": [ + "erikschierboom" + ], + "files": { + "solution": [ + "all-your-base.ua" + ], + "test": [ + "tests.ua" + ], + "example": [ + ".meta/example.ua" + ] + }, + "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.ua b/exercises/practice/all-your-base/.meta/example.ua new file mode 100644 index 0000000..2f0efa9 --- /dev/null +++ b/exercises/practice/all-your-base/.meta/example.ua @@ -0,0 +1,9 @@ +ValidBases ← ( + ⍤"input base must be >= 2"≥2 + ⍤"output base must be >= 2"≥2 +) +ValidDigits ← ⍤"all digits must satisfy 0 <= d < input base" /×↧⊃(≥0|<:) +Valid ← ⊃(ValidDigits|⋅ValidBases) +FromInput ← /+×ⁿ:⊙(⇌°⊏): +ToOutput ← ⨬([0]|◿:⌊÷⊸⊃(ⁿ⊙⋅∘|⋅∘)◡(⇌⇡+1⌊ₙ:))±. +Rebase ← ToOutput FromInput ◡Valid 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.ua b/exercises/practice/all-your-base/all-your-base.ua new file mode 100644 index 0000000..5bf80b0 --- /dev/null +++ b/exercises/practice/all-your-base/all-your-base.ua @@ -0,0 +1,3 @@ +# Convert digits from base into another base +# Rebased ? Digits InputBase OutputBase +Rebase ← |3 ⊙⋅⋅(⍤ "Please implement Rebase" 0) diff --git a/exercises/practice/all-your-base/tests.ua b/exercises/practice/all-your-base/tests.ua new file mode 100644 index 0000000..789bc13 --- /dev/null +++ b/exercises/practice/all-your-base/tests.ua @@ -0,0 +1,139 @@ +~ "all-your-base.ua" ~ Rebase + +# Single bit one to decimal +Digits ← [1] +InputBase ← 2 +OutputBase ← 10 +Expected ← [1] +⍤⤙≍ Expected Rebase Digits InputBase OutputBase + +# Binary to single decimal +Digits ← [1 0 1] +InputBase ← 2 +OutputBase ← 10 +Expected ← [5] +⍤⤙≍ Expected Rebase Digits InputBase OutputBase + +# Single decimal to binary +Digits ← [5] +InputBase ← 10 +OutputBase ← 2 +Expected ← [1 0 1] +⍤⤙≍ Expected Rebase Digits InputBase OutputBase + +# Binary to multiple decimal +Digits ← [1 0 1 0 1 0] +InputBase ← 2 +OutputBase ← 10 +Expected ← [4 2] +⍤⤙≍ Expected Rebase Digits InputBase OutputBase + +# Decimal to binary +Digits ← [4 2] +InputBase ← 10 +OutputBase ← 2 +Expected ← [1 0 1 0 1 0] +⍤⤙≍ Expected Rebase Digits InputBase OutputBase + +# Trinary to hexadecimal +Digits ← [1 1 2 0] +InputBase ← 3 +OutputBase ← 16 +Expected ← [2 10] +⍤⤙≍ Expected Rebase Digits InputBase OutputBase + +# Hexadecimal to trinary +Digits ← [2 10] +InputBase ← 16 +OutputBase ← 3 +Expected ← [1 1 2 0] +⍤⤙≍ Expected Rebase Digits InputBase OutputBase + +# 15-bit integer +Digits ← [3 46 60] +InputBase ← 97 +OutputBase ← 73 +Expected ← [6 10 45] +⍤⤙≍ Expected Rebase Digits InputBase OutputBase + +# Empty list +Digits ← [] +InputBase ← 2 +OutputBase ← 10 +Expected ← [0] +⍤⤙≍ Expected Rebase Digits InputBase OutputBase + +# Single zero +Digits ← [0] +InputBase ← 10 +OutputBase ← 2 +Expected ← [0] +⍤⤙≍ Expected Rebase Digits InputBase OutputBase + +# Multiple zeros +Digits ← [0 0 0] +InputBase ← 10 +OutputBase ← 2 +Expected ← [0] +⍤⤙≍ Expected Rebase Digits InputBase OutputBase + +# Leading zeros +Digits ← [0 6 0] +InputBase ← 7 +OutputBase ← 10 +Expected ← [4 2] +⍤⤙≍ Expected Rebase Digits InputBase OutputBase + +# Input base is one +Digits ← [0] +InputBase ← 1 +OutputBase ← 10 +⍤⤙≍ "input base must be >= 2" ⍣(Rebase Digits InputBase OutputBase) + +# Input base is zero +Digits ← [] +InputBase ← 0 +OutputBase ← 10 +⍤⤙≍ "input base must be >= 2" ⍣(Rebase Digits InputBase OutputBase) + +# Input base is negative +Digits ← [1] +InputBase ← ¯2 +OutputBase ← 10 +⍤⤙≍ "input base must be >= 2" ⍣(Rebase Digits InputBase OutputBase) + +# Negative digit +Digits ← [1 ¯1 1 0 1 0] +InputBase ← 2 +OutputBase ← 10 +⍤⤙≍ "all digits must satisfy 0 <= d < input base" ⍣(Rebase Digits InputBase OutputBase) + +# Invalid positive digit +Digits ← [1 2 1 0 1 0] +InputBase ← 2 +OutputBase ← 10 +⍤⤙≍ "all digits must satisfy 0 <= d < input base" ⍣(Rebase Digits InputBase OutputBase) + +# Output base is one +Digits ← [1 0 1 0 1 0] +InputBase ← 2 +OutputBase ← 1 +⍤⤙≍ "output base must be >= 2" ⍣(Rebase Digits InputBase OutputBase) + +# Output base is zero +Digits ← [7] +InputBase ← 10 +OutputBase ← 0 +⍤⤙≍ "output base must be >= 2" ⍣(Rebase Digits InputBase OutputBase) + +# Output base is negative +Digits ← [1] +InputBase ← 2 +OutputBase ← ¯7 +⍤⤙≍ "output base must be >= 2" ⍣(Rebase Digits InputBase OutputBase) + +# Both bases are negative +Digits ← [1] +InputBase ← ¯2 +OutputBase ← ¯7 +⍤⤙≍ "input base must be >= 2" ⍣(Rebase Digits InputBase OutputBase)