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:
(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 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"
This exercise is intended as a continuation of Resistor Color Duo and builds upon it.
Although you may solve practice exercises in any order, we encourage you to follow the suggested sequence.
In this exercise, you are given syntax for colors already predefined using the c* prefix, e.g., c*black.
You must then define syntax that associates a sequence of colors to a resistance value with its SI unit, possibly with a metric prefix, according to the instructions.
The colors are within *[[ and ]] and separated by , , e.g., *[[c*black, c*yellow, c*violet]].
This task will likely require you to use either notations or macros. You might want to check a reference.
Because new syntax is expanded at compile time, any test would fail to compile unless all the required syntax is defined.
For this reason, instead of relying on traditional runtime tests, we use #guard_msgs.
This command compares a given docstring with a message generated by another command, in this case #eval, and reports an error if they are different.
You may consider the absence of an error as a passing test.
If you work locally or in Lean's online playground, you will get instant feedback on any error reported by #guard_msgs through Lean InfoView.
The resistance value should be output using the unit Ω (ohm).
This unicode character can be generated locally on in Lean's online playground with the shortcut \ohm.
If you are working in Exercism's online editor, feel free to copy the character from the instructions.
The online test runner does not currently support importing the full Lean meta-programming library.
While you are free to use any features available in Lean by default, including those within the Lean namespace, adding import Lean or importing specific modules from the Lean namespace will cause your submission to fail when submitted to Exercism.
Note that importing the Lean library is not necessary to solve this exercise.
Sign up to Exercism to learn and master Lean with 100 exercises, and real human mentoring, all for free.