Skip to content

Commit 993e5b5

Browse files
committed
PHP and Javascript solutions to moderate challenge #148 - Color code converter : CMYN, HSL, HSV, and HEX conversion to RGB
1 parent 683dff2 commit 993e5b5

File tree

3 files changed

+282
-0
lines changed

3 files changed

+282
-0
lines changed
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
// https://www.codeeval.com/open_challenges/148/
2+
3+
var hue2rgb = function(p, q, t){
4+
if(t < 0) t += 1;
5+
if(t > 1) t -= 1;
6+
if(t < 1/6) return p + (q - p) * 6 * t;
7+
if(t < 1/2) return q;
8+
if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
9+
return p;
10+
};
11+
12+
var hsl_to_rgb = function(hsl){
13+
var h = Number(hsl[0] / 360);
14+
var s = Number(hsl[1] / 100);
15+
var l = Number(hsl[2] / 100);
16+
17+
var r, g, b;
18+
19+
if(s === 0){
20+
r = g = b = l; // achromatic
21+
}else{
22+
var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
23+
var p = 2 * l - q;
24+
r = hue2rgb(p, q, h + 1/3);
25+
g = hue2rgb(p, q, h);
26+
b = hue2rgb(p, q, h - 1/3);
27+
}
28+
29+
return {'r': Math.round(r * 255), 'g': Math.round(g * 255), 'b': Math.round(b * 255) };
30+
};
31+
32+
var hsv_to_rgb = function(hsv){
33+
var h = Number(hsv[0] / 360);
34+
var s = Number(hsv[1] / 100);
35+
var v = Number(hsv[2] / 100);
36+
37+
var r, g, b;
38+
39+
var i = Math.floor(h * 6);
40+
var f = h * 6 - i;
41+
var p = v * (1 - s);
42+
var q = v * (1 - f * s);
43+
var t = v * (1 - (1 - f) * s);
44+
45+
switch(i % 6){
46+
case 0: r = v, g = t, b = p; break;
47+
case 1: r = q, g = v, b = p; break;
48+
case 2: r = p, g = v, b = t; break;
49+
case 3: r = p, g = q, b = v; break;
50+
case 4: r = t, g = p, b = v; break;
51+
case 5: r = v, g = p, b = q; break;
52+
}
53+
54+
return {'r': Math.round(r * 255), 'g': Math.round(g * 255), 'b': Math.round(b * 255) };
55+
};
56+
57+
var cmyk_to_rgb = function(cmyk){
58+
var c = cmyk[0];
59+
var m = cmyk[1];
60+
var y = cmyk[2];
61+
var k = cmyk[3];
62+
63+
var r = ( 1 - (c * (1 - k)) - k ) * 255;
64+
var g = ( 1 - (m * (1 - k)) - k ) * 255;
65+
var b = ( 1 - (y * (1 - k)) - k ) * 255;
66+
67+
if( r<0 ) r = 0 ;
68+
if( g<0 ) g = 0 ;
69+
if (b<0 ) b = 0 ;
70+
71+
return {'r': Math.round(r), 'g': Math.round(g), 'b': Math.round(b) };
72+
}; //cmyk_to_rgb
73+
74+
var hex_to_rgb = function(hex){
75+
var int = parseInt( hex, 16 );
76+
return {'r': 0xFF & (int >> 0x10), 'g': 0xFF & (int >> 0x8), 'b': 0xFF & int};
77+
};//hex_to_rgb
78+
79+
80+
var fs = require("fs");
81+
fs.readFileSync(process.argv[2]).toString().split('\n').forEach(function (line) {
82+
line = line.trim();
83+
if( line !== '' ){
84+
var rgb = false;
85+
if( line.indexOf('#') === 0 ){
86+
// hex
87+
rgb = hex_to_rgb( line.substr(1) );
88+
}
89+
else if( null !== (matches = line.match(/^(HSL|HSV|RGB|)?\((.*)\)$/) ) ){
90+
var c = matches[2].split(',');
91+
switch( matches[1] ){
92+
case 'HSL' :
93+
rgb = hsl_to_rgb(c);
94+
break;
95+
case 'HSV' :
96+
rgb = hsv_to_rgb(c);
97+
break;
98+
default :
99+
rgb = cmyk_to_rgb(c);
100+
break;
101+
}//
102+
}
103+
if( rgb ){
104+
console.log( 'RGB(' + rgb.r + ',' + rgb.g + ',' + rgb.b + ')' );
105+
}
106+
}//
107+
});
Lines changed: 171 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,171 @@
1+
<?php
2+
header('Content-Type: text/plain; charset=utf-8');
3+
4+
// https://www.codeeval.com/open_challenges/148/
5+
6+
if( isset($_GET['f_i_l_e']) && $_GET['f_i_l_e'] ) $argv[1] = $_GET['f_i_l_e'];
7+
8+
function hsl_to_rgb($hsl){
9+
list($h,$s,$l) = $hsl;
10+
11+
$s /= 100;
12+
$l /= 100;
13+
14+
$c = ( 1 - abs( 2 * $l - 1 ) ) * $s;
15+
$x = $c * ( 1 - abs( fmod( ( $h / 60 ), 2 ) - 1 ) );
16+
$m = $l - ( $c / 2 );
17+
18+
if ( $h < 60 ) {
19+
$r = $c;
20+
$g = $x;
21+
$b = 0;
22+
} else if ( $h < 120 ) {
23+
$r = $x;
24+
$g = $c;
25+
$b = 0;
26+
} else if ( $h < 180 ) {
27+
$r = 0;
28+
$g = $c;
29+
$b = $x;
30+
} else if ( $h < 240 ) {
31+
$r = 0;
32+
$g = $x;
33+
$b = $c;
34+
} else if ( $h < 300 ) {
35+
$r = $x;
36+
$g = 0;
37+
$b = $c;
38+
} else {
39+
$r = $c;
40+
$g = 0;
41+
$b = $x;
42+
}
43+
44+
$r = ( $r + $m ) * 255;
45+
$g = ( $g + $m ) * 255;
46+
$b = ( $b + $m ) * 255;
47+
48+
return array( 'r' => round($r), 'g' => round($g), 'b' => round($b) );
49+
}//hsl_to_rgb
50+
51+
function hsv_to_rgb($hsv){
52+
// echo 'hsv_to_rgb(' . var_export($hsv,true) . ')' . "\n";
53+
54+
list($h, $s, $v) = $hsv;
55+
$s /= 100;
56+
$v /= 100;
57+
58+
$c = $v * $s;
59+
$x = $c * ( 1 - abs( fmod( ( $h / 60 ), 2 ) - 1 ) );
60+
$m = $v - $c;
61+
62+
if ( $h < 60 ) {
63+
$r = $c;
64+
$g = $x;
65+
$b = 0;
66+
} else if ( $h < 120 ) {
67+
$r = $x;
68+
$g = $c;
69+
$b = 0;
70+
} else if ( $h < 180 ) {
71+
$r = 0;
72+
$g = $c;
73+
$b = $x;
74+
} else if ( $h < 240 ) {
75+
$r = 0;
76+
$g = $x;
77+
$b = $c;
78+
} else if ( $h < 300 ) {
79+
$r = $x;
80+
$g = 0;
81+
$b = $c;
82+
} else {
83+
$r = $c;
84+
$g = 0;
85+
$b = $x;
86+
}
87+
88+
$r = ( $r + $m ) * 255;
89+
$g = ( $g + $m ) * 255;
90+
$b = ( $b + $m ) * 255;
91+
92+
return array( 'r' => round($r), 'g' => round($g), 'b' => round($b) );
93+
}//hsv_to_rgb
94+
95+
function cmyk_to_rgb($cmyk){
96+
// echo 'cmyk_to_rgb(' . var_export($cmyk,true) . ')' . "\n";
97+
98+
list($c, $m, $y, $k) = $cmyk;
99+
100+
$r = (1 - ($c * (1 - $k)) - $k ) * 255;
101+
$g = ( 1 - ($m * (1 - $k)) - $k ) * 255;
102+
$b = ( 1 - ($y * (1 - $k)) - $k ) * 255;
103+
104+
if($r<0) $r = 0 ;
105+
if($g<0) $g = 0 ;
106+
if($b<0) $b = 0 ;
107+
108+
return array('r' => round($r), 'g' => round($g), 'b' => round($b) );
109+
}//cmyk_to_rgb
110+
111+
function hex_to_rgb($hex){
112+
// echo 'hex_to_rgb(' . $hex . ')' . "\n";
113+
$int = hexdec($hex);
114+
return array('r' => 0xFF & ($int >> 0x10), 'g' => 0xFF & ($int >> 0x8), 'b' => 0xFF & $int);
115+
}//hex_to_rgb
116+
117+
if( isset($argv[1]) && $argv[1] ){
118+
$filename = $argv[1];
119+
if( file_exists($filename) ){
120+
if( is_readable($filename) ){
121+
$fp = fopen($filename, 'r');
122+
if( $fp ){
123+
while ( $fp && !feof( $fp ) ) {
124+
$line = trim(fgets($fp));
125+
if( $line ){
126+
// echo ' => '. $line."\n";
127+
$rgb = false;
128+
if( strpos($line,'#') === 0 ){
129+
// hex
130+
$rgb = hex_to_rgb(substr($line,1));
131+
}
132+
else if( preg_match('/^(HSL|HSV|RGB|)?\((.*)\)$/',$line,$matches) ){
133+
$c = explode(',',$matches[2]);
134+
switch($matches[1]){
135+
case 'HSL' :
136+
$rgb = hsl_to_rgb($c);
137+
break;
138+
case 'HSV' :
139+
$rgb = hsv_to_rgb($c);
140+
break;
141+
case '' :
142+
$rgb = cmyk_to_rgb($c);
143+
break;
144+
}//
145+
}
146+
if( $rgb ){
147+
echo 'RGB('.$rgb['r'].','.$rgb['g'].','.$rgb['b'].')' . "\n";
148+
}//
149+
}
150+
151+
}//
152+
fclose( $fp );
153+
}
154+
else{
155+
echo '!fp'."\n";
156+
}
157+
}
158+
else{
159+
echo '!readable'."\n";
160+
}
161+
}
162+
else{
163+
echo '!file_exists'."\n";
164+
}
165+
}
166+
else{
167+
echo '!argv[1]'."\n";
168+
}
169+
170+
exit(0);
171+
?>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
(0.56,0.94,0.21,0.02)
2+
HSL(359,0,0)
3+
HSV(276,33,7)
4+
#cfa9c4

0 commit comments

Comments
 (0)