diff --git a/config.json b/config.json
index 8eb35bf46..9455b508e 100644
--- a/config.json
+++ b/config.json
@@ -2191,6 +2191,20 @@
"strings"
],
"difficulty": 3
+ },
+ {
+ "slug": "resistor-color-trio",
+ "name": "Resistor Color Trio",
+ "uuid": "6f58712b-8b74-4b4b-b6b7-1237dd717c04",
+ "practices": [
+ "string-formatting"
+ ],
+ "prerequisites": [
+ "numbers",
+ "lists",
+ "strings"
+ ],
+ "difficulty": 3
}
],
"foregone": [
diff --git a/exercises/Exercises.sln b/exercises/Exercises.sln
index bc05554ce..78358a3d0 100644
--- a/exercises/Exercises.sln
+++ b/exercises/Exercises.sln
@@ -303,6 +303,8 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ZebraPuzzle", "practice\zeb
EndProject
Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Zipper", "practice\zipper\Zipper.fsproj", "{32F8738C-2782-4881-95C0-C621DC0D7ED9}"
EndProject
+Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "ResistorColorTrio", "practice\resistor-color-trio\ResistorColorTrio.fsproj", "{1850FAE9-5ACB-41D0-91BB-AD17A1021248}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -892,6 +894,10 @@ Global
{32F8738C-2782-4881-95C0-C621DC0D7ED9}.Debug|Any CPU.Build.0 = Debug|Any CPU
{32F8738C-2782-4881-95C0-C621DC0D7ED9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{32F8738C-2782-4881-95C0-C621DC0D7ED9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1850FAE9-5ACB-41D0-91BB-AD17A1021248}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1850FAE9-5ACB-41D0-91BB-AD17A1021248}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1850FAE9-5ACB-41D0-91BB-AD17A1021248}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1850FAE9-5ACB-41D0-91BB-AD17A1021248}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{B404AA3C-A226-409A-A035-6C1DC66940DD} = {B7E719DB-FB8D-43B4-B529-55FCF6E3DC3F}
@@ -1042,5 +1048,6 @@ Global
{4AD3B365-83FE-4C43-BEB5-E7DC5CCED892} = {391BEEC4-91A8-43F3-AE94-D5CB9A8FA611}
{A6E25412-34F6-49ED-834B-8A551CF3F2D3} = {391BEEC4-91A8-43F3-AE94-D5CB9A8FA611}
{32F8738C-2782-4881-95C0-C621DC0D7ED9} = {391BEEC4-91A8-43F3-AE94-D5CB9A8FA611}
+ {1850FAE9-5ACB-41D0-91BB-AD17A1021248} = {391BEEC4-91A8-43F3-AE94-D5CB9A8FA611}
EndGlobalSection
EndGlobal
diff --git a/exercises/practice/resistor-color-trio/.config/dotnet-tools.json b/exercises/practice/resistor-color-trio/.config/dotnet-tools.json
new file mode 100644
index 000000000..0f7926bad
--- /dev/null
+++ b/exercises/practice/resistor-color-trio/.config/dotnet-tools.json
@@ -0,0 +1,12 @@
+{
+ "version": 1,
+ "isRoot": true,
+ "tools": {
+ "fantomas-tool": {
+ "version": "4.7.9",
+ "commands": [
+ "fantomas"
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/exercises/practice/resistor-color-trio/.docs/instructions.md b/exercises/practice/resistor-color-trio/.docs/instructions.md
new file mode 100644
index 000000000..1ac5cf5e9
--- /dev/null
+++ b/exercises/practice/resistor-color-trio/.docs/instructions.md
@@ -0,0 +1,56 @@
+# Instructions
+
+If you want to build something using a Raspberry Pi, you'll probably use _resistors_.
+For this exercise, you need to know only three things about them:
+
+- Each resistor has a resistance value.
+- Resistors are small - so small in fact that if you printed the resistance value on them, it would be hard to read.
+ To get around this problem, manufacturers print color-coded bands onto the resistors to denote their resistance values.
+- Each band acts as a digit of a number.
+ For example, if they printed a brown band (value 1) followed by a green band (value 5), it would translate to the number 15.
+ In this exercise, you are going to create a helpful program so that you don't have to remember the values of the bands.
+ The program will take 3 colors as input, and outputs the correct value, in ohms.
+ The color bands are encoded as follows:
+
+- black: 0
+- brown: 1
+- red: 2
+- orange: 3
+- yellow: 4
+- green: 5
+- blue: 6
+- violet: 7
+- grey: 8
+- white: 9
+
+In Resistor Color Duo you decoded the first two colors.
+For instance: orange-orange got the main value `33`.
+The third color stands for how many zeros need to be added to the main value.
+The main value plus the zeros gives us a value in ohms.
+For the exercise it doesn't matter what ohms really are.
+For example:
+
+- orange-orange-black would be 33 and no zeros, which becomes 33 ohms.
+- orange-orange-red would be 33 and 2 zeros, which becomes 3300 ohms.
+- orange-orange-orange would be 33 and 3 zeros, which becomes 33000 ohms.
+
+(If Math is your thing, you may want to think of the zeros as exponents of 10.
+If Math is not your thing, go with the zeros.
+It really is the same thing, just in plain English instead of Math lingo.)
+
+This exercise is about translating the colors into a label:
+
+> "... ohms"
+
+So an input of `"orange", "orange", "black"` should return:
+
+> "33 ohms"
+
+When we get to larger resistors, a [metric prefix][metric-prefix] is used to indicate a larger magnitude of ohms, such as "kiloohms".
+That is similar to saying "2 kilometers" instead of "2000 meters", or "2 kilograms" for "2000 grams".
+
+For example, an input of `"orange", "orange", "orange"` should return:
+
+> "33 kiloohms"
+
+[metric-prefix]: https://en.wikipedia.org/wiki/Metric_prefix
diff --git a/exercises/practice/resistor-color-trio/.meta/Example.fs b/exercises/practice/resistor-color-trio/.meta/Example.fs
new file mode 100644
index 000000000..0066a8802
--- /dev/null
+++ b/exercises/practice/resistor-color-trio/.meta/Example.fs
@@ -0,0 +1,28 @@
+module ResistorColorTrio
+
+let private allColors =
+ [ "black"
+ "brown"
+ "red"
+ "orange"
+ "yellow"
+ "green"
+ "blue"
+ "violet"
+ "grey"
+ "white" ]
+
+let private colorCode color = List.findIndex ((=) color) allColors
+
+let private value colors =
+ let first = colorCode (List.item 0 colors)
+ let second = colorCode (List.item 1 colors)
+ let third = colorCode (List.item 2 colors)
+ uint64 (first * 10 + second) * uint64(pown 10 third)
+
+let label colors =
+ match value colors with
+ | ohms when ohms < 1_000UL -> $"{ohms} ohms"
+ | ohms when ohms < 1_000_000UL -> $"{ohms / 1000UL} kiloohms"
+ | ohms when ohms < 1_000_000_000UL -> $"{ohms / 1_000_000UL} megaohms"
+ | ohms -> $"{ohms / 1_000_000_000UL} gigaohms"
diff --git a/exercises/practice/resistor-color-trio/.meta/config.json b/exercises/practice/resistor-color-trio/.meta/config.json
new file mode 100644
index 000000000..49ff7dc38
--- /dev/null
+++ b/exercises/practice/resistor-color-trio/.meta/config.json
@@ -0,0 +1,19 @@
+{
+ "authors": [
+ "erikschierboom"
+ ],
+ "files": {
+ "solution": [
+ "ResistorColorTrio.fs"
+ ],
+ "test": [
+ "ResistorColorTrioTests.fs"
+ ],
+ "example": [
+ ".meta/Example.fs"
+ ]
+ },
+ "blurb": "Convert color codes, as used on resistors, to a human-readable label.",
+ "source": "Maud de Vries, Erik Schierboom",
+ "source_url": "https://github.com/exercism/problem-specifications/issues/1549"
+}
diff --git a/exercises/practice/resistor-color-trio/.meta/tests.toml b/exercises/practice/resistor-color-trio/.meta/tests.toml
new file mode 100644
index 000000000..b7d45fa5d
--- /dev/null
+++ b/exercises/practice/resistor-color-trio/.meta/tests.toml
@@ -0,0 +1,40 @@
+# 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.
+
+[d6863355-15b7-40bb-abe0-bfb1a25512ed]
+description = "Orange and orange and black"
+
+[1224a3a9-8c8e-4032-843a-5224e04647d6]
+description = "Blue and grey and brown"
+
+[b8bda7dc-6b95-4539-abb2-2ad51d66a207]
+description = "Red and black and red"
+
+[5b1e74bc-d838-4eda-bbb3-eaba988e733b]
+description = "Green and brown and orange"
+
+[f5d37ef9-1919-4719-a90d-a33c5a6934c9]
+description = "Yellow and violet and yellow"
+
+[5f6404a7-5bb3-4283-877d-3d39bcc33854]
+description = "Blue and violet and blue"
+
+[7d3a6ab8-e40e-46c3-98b1-91639fff2344]
+description = "Minimum possible value"
+
+[ca0aa0ac-3825-42de-9f07-dac68cc580fd]
+description = "Maximum possible value"
+
+[0061a76c-903a-4714-8ce2-f26ce23b0e09]
+description = "First two colors make an invalid octal number"
+
+[30872c92-f567-4b69-a105-8455611c10c4]
+description = "Ignore extra colors"
diff --git a/exercises/practice/resistor-color-trio/ResistorColorTrio.fs b/exercises/practice/resistor-color-trio/ResistorColorTrio.fs
new file mode 100644
index 000000000..6dbd01447
--- /dev/null
+++ b/exercises/practice/resistor-color-trio/ResistorColorTrio.fs
@@ -0,0 +1,4 @@
+module ResistorColorTrio
+
+let label colors =
+ failwith "Please implement the 'label' function"
diff --git a/exercises/practice/resistor-color-trio/ResistorColorTrio.fsproj b/exercises/practice/resistor-color-trio/ResistorColorTrio.fsproj
new file mode 100644
index 000000000..58e5ed465
--- /dev/null
+++ b/exercises/practice/resistor-color-trio/ResistorColorTrio.fsproj
@@ -0,0 +1,22 @@
+
+
+ net8.0
+ false
+ false
+ true
+
+
+
+
+
+
+
+
+
+
+
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+ all
+
+
+
\ No newline at end of file
diff --git a/exercises/practice/resistor-color-trio/ResistorColorTrioTests.fs b/exercises/practice/resistor-color-trio/ResistorColorTrioTests.fs
new file mode 100644
index 000000000..7df6b35a4
--- /dev/null
+++ b/exercises/practice/resistor-color-trio/ResistorColorTrioTests.fs
@@ -0,0 +1,59 @@
+module ResistorColorTrioTests
+
+open FsUnit.Xunit
+open Xunit
+
+open ResistorColorTrio
+
+[]
+let ``Orange and orange and black`` () =
+ label [ "orange"; "orange"; "black" ]
+ |> should equal "33 ohms"
+
+[]
+let ``Blue and grey and brown`` () =
+ label [ "blue"; "grey"; "brown" ]
+ |> should equal "680 ohms"
+
+[]
+let ``Red and black and red`` () =
+ label [ "red"; "black"; "red" ]
+ |> should equal "2 kiloohms"
+
+[]
+let ``Green and brown and orange`` () =
+ label [ "green"; "brown"; "orange" ]
+ |> should equal "51 kiloohms"
+
+[]
+let ``Yellow and violet and yellow`` () =
+ label [ "yellow"; "violet"; "yellow" ]
+ |> should equal "470 kiloohms"
+
+[]
+let ``Blue and violet and blue`` () =
+ label [ "blue"; "violet"; "blue" ]
+ |> should equal "67 megaohms"
+
+[]
+let ``Minimum possible value`` () =
+ label [ "black"; "black"; "black" ]
+ |> should equal "0 ohms"
+
+[]
+let ``Maximum possible value`` () =
+ label [ "white"; "white"; "white" ]
+ |> should equal "99 gigaohms"
+
+[]
+let ``First two colors make an invalid octal number`` () =
+ label [ "black"; "grey"; "black" ]
+ |> should equal "8 ohms"
+
+[]
+let ``Ignore extra colors`` () =
+ label [ "blue"
+ "green"
+ "yellow"
+ "orange" ]
+ |> should equal "650 kiloohms"
diff --git a/generators/Generators.fs b/generators/Generators.fs
index f72e2210f..c814e814e 100644
--- a/generators/Generators.fs
+++ b/generators/Generators.fs
@@ -2047,3 +2047,6 @@ type Knapsack() =
type BottleSong() =
inherit ExerciseGenerator()
+
+type ResistorColorTrio() =
+ inherit ExerciseGenerator()