The problem
On this problem, you parse RGB colours represented by strings. The codecs are primarily utilized in HTML and CSS. Your activity is to implement a perform that takes a colour as a string and returns the parsed colour as a map (see Examples).
Inputs:
The enter string represents one of many following:
- 6-digit hexadecimal – “#RRGGBB”
e.g. “#012345”, “#789abc”, “#FFA077”
Every pair of digits represents a worth of the channel in hexadecimal: 00 to FF - 3-digit hexadecimal – “#RGB”
e.g. “#012”, “#aaa”, “#F5A”
Every digit represents a worth 0 to F which interprets to 2-digit hexadecimal: 0->00, 1->11, 2->22, and so forth. - Preset colour title
e.g. “purple”, “BLUE”, “LimeGreen”
You must use the predefined mapPRESET_COLORS
(JavaScript, Python, Ruby),presetColors
(Java, C#, Haskell), orpreset-colors
(Clojure). The keys are the names of preset colours in lower-case and the values are the corresponding colours in 6-digit hexadecimal (identical as 1. “#RRGGBB”).
Examples:
parse("#80FFA0") === new RGB(128, 255, 160))
parse("#3B7") === new RGB( 51, 187, 119))
parse("LimeGreen") === new RGB( 50, 205, 50))
// RGB class is outlined as follows:
last class RGB {
public int r, g, b;
public RGB();
public RGB(int r, int g, int b);
}
The answer in Java code
Choice 1:
import java.util.Map;
import java.awt.Coloration;
public class HtmlColorParser {
personal last Map<String, String> presetColors;
public HtmlColorParser(Map<String, String> presetColors) {
this.presetColors = presetColors;
}
public RGB parse(String colour) {
if (colour.charAt(0) != '#') colour = nameFixer(colour);
if (colour.size() < 7) colour = stringFixer(colour);
Coloration decoded = (Coloration.decode(colour));
return new RGB(decoded.getRed(), decoded.getGreen(), decoded.getBlue());
}
public String stringFixer(String s) {
return "#" + s.charAt(1) + s.charAt(1) + s.charAt(2) + s.charAt(2) + s.charAt(3) + s.charAt(3);
}
public String nameFixer(String s) {
return presetColors.get(s.toLowerCase());
}
}
Choice 2:
import java.util.Map;
class HtmlColorParser {
personal last Map<String, String> presetColors;
HtmlColorParser(Map<String, String> presetColors) {
this.presetColors = presetColors;
}
RGB parse(String colour) {
if ((colour = presetColors.getOrDefault(colour.toLowerCase(), colour)).size() < 7)
colour = colour.replaceAll("((?i)[da-f])", "$1$1");
return new RGB(Integer.valueOf(colour.substring(1, 3), 16), Integer.valueOf(colour.substring(3, 5), 16), Integer.valueOf(colour.substring(5), 16));
}
}
Choice 3:
import java.util.Map;
public class HtmlColorParser {
personal last Map<String, String> presetColors;
public HtmlColorParser(Map<String, String> presetColors) {
this.presetColors = presetColors;
}
public RGB parse(String colour) {
String lc = colour.toLowerCase();
String rgb = presetColors.getOrDefault(lc, lc);
if(rgb.size() == 4)
rgb = rgb.replaceAll("([0-9a-f])", "$1$1");
return new RGB(Integer.valueOf(rgb.substring(1, 3), 16),
Integer.valueOf(rgb.substring(3, 5), 16),
Integer.valueOf(rgb.substring(5), 16));
}
}
Take a look at circumstances to validate our resolution
import java.util.Locale;
import org.junit.Earlier than;
import org.junit.Take a look at;
import static org.junit.Assert.assertEquals;
public class ExampleTests {
personal HtmlColorParser parser;
@Earlier than
public void setup() {
parser = new HtmlColorParser(PresetColors.getMap());
}
@Take a look at
public void testExamples() {
shouldParse("#80FFA0", new RGB(128, 255, 160));
shouldParse("#3B7", new RGB( 51, 187, 119));
shouldParse("LimeGreen", new RGB( 50, 205, 50));
}
personal void shouldParse(String colour, RGB anticipated) {
assertRgbEquals(colour, anticipated, parser.parse(colour));
}
personal static void assertRgbEquals(String enter, RGB anticipated, RGB precise) throws AssertionError {
attempt {
System.out.printf("enter: "%s"", enter);
assertEquals(anticipated, precise);
System.out.println(" => go!");
} catch (AssertionError e) {
String message = String.format(Locale.ENGLISH,
"anticipated: %snactual : %s", anticipated, precise);
throw new AssertionError(message, e);
}
}
}