Back to all solutions
#800 - Similar RGB Color
Problem Description
The red-green-blue color "#AABBCC" can be written as "#ABC" in shorthand.
- For example, "#15c" is shorthand for the color "#1155cc".
The similarity between the two colors "#ABCDEF" and "#UVWXYZ" is -(AB - UV)2 - (CD - WX)2 - (EF - YZ)2.
Given a string color that follows the format "#ABCDEF", return a string represents the color that is most similar to the given color and has a shorthand (i.e., it can be represented as some "#XYZ").
Any answer which has the same highest similarity as the best answer will be accepted.
Solution
/**
* @param {string} color
* @return {string}
*/
var similarRGB = function(color) {
const shorthandValues = [
'00', '11', '22', '33', '44', '55', '66', '77',
'88', '99', 'aa', 'bb', 'cc', 'dd', 'ee', 'ff'
];
const red = helper(color.slice(1, 3));
const green = helper(color.slice(3, 5));
const blue = helper(color.slice(5, 7));
return `#${red}${green}${blue}`;
function helper(hex) {
const value = parseInt(hex, 16);
let minDiff = Infinity;
let closest = '';
for (const shorthand of shorthandValues) {
const shorthandValue = parseInt(shorthand, 16);
const diff = Math.abs(value - shorthandValue);
if (diff < minDiff) {
minDiff = diff;
closest = shorthand;
}
}
return closest;
}
};