Решение на CSS Цветове от Борислав Тодоров
Към профила на Борислав Тодоров
Резултати
- 20 точки от тестове
- 0 бонус точки
- 20 точки общо
- 5 успешни тест(а)
- 0 неуспешни тест(а)
Код
const RGB: u8 = 255;
const HSV_HUE: u16 = 360;
const HSV_PERCENT: u8 = 100;
pub enum Color {
RGB {
red: u8,
green: u8,
blue: u8
},
HSV {
hue: u16,
saturation: u8,
value: u8
}
}
//Part 1.1: Create constructors
impl Color {
/// Конструира нова стойност от вариант `RGB` с дадените стойности за червено, зелено и синьо.
///
pub fn new_rgb(red: u8, green: u8, blue: u8) -> Color {
Color::RGB{red: red, green: green, blue: blue}
}
/// Конструира нова стойност от вариант `HSV` с дадените стойности.
///
/// В случай, че hue е над 360 или saturation или value са над 100, очакваме да `panic!`-нете с
/// каквото съобщение си изберете.
///
pub fn new_hsv(hue: u16, saturation: u8, value: u8) -> Color {
if hue > 360 {panic!("Hue should have a value in the range [0,..,360]!")}
else if saturation > 100 {panic!("Saturation should have a value in the range [0,..,100]!")}
else if value > 100 {panic!("Value should be in the range [0,..,100]!")}
else {Color::HSV{hue: hue, saturation: saturation, value: value}}
}
}
// Part 1.2: Create a tuple of values to allow access to individual components
impl Color {
/// Ако `self` е `RGB`, тогава връщате неговите `red`, `green`, `blue` компоненти в този ред.
/// Иначе, `panic!`-вате с каквото съобщение си изберете.
///
pub fn unwrap_rgb(&self) -> (u8, u8, u8) {
match self {
Color::RGB{red: r, green: g, blue: b} => (*r, *g, *b),
_ => panic!("Incorrect RGB format!"),
}
}
/// Ако `self` е `HSV`, тогава връщате неговите `hue`, `saturation`, `value` компоненти в този
/// ред. Иначе, `panic!`-вате с каквото съобщение си изберете.
///
pub fn unwrap_hsv(&self) -> (u16, u8, u8) {
match self {
Color::HSV{hue: h, saturation: s, value: v} => (*h, *s, *v),
_ => panic!("Incorrect HSV format!"),
}
}
}
// Part 2: Create a string according to this format: RGB - #rrggbb, HSV: (hue,saturation%,value%)
// For RGB: red, green and blue have values 0-255 in dec, 0x00-0xFF in hex. Display their values in hex
// For HSV: hue is in the range 0-360, saturation is between 0-100, value is between 0-100. For saturation and value display % at the end
impl Color {
/// В случай, че варианта на `self` е `RGB`, очакваме низ със съдържание `#rrggbb`, където
/// червения, зеления и синия компонент са форматирани в шестнадесетична система, и всеки от тях е
/// точно два символа с малки букви (запълнени с нули).
///
/// Ако варианта е `HSV`, очакваме низ `hsv(h,s%,v%)`, където числата са си напечатани в
/// десетичната система, без водещи нули, без интервали след запетаите, вторите две завършващи на
/// `%`.
///
pub fn to_string(&self) -> String {
match self {
Color::RGB{red: r, green: g, blue: b} => format!("#{:02x}{:02x}{:02x}", *r, *g, *b),
Color::HSV{hue: h, saturation: s, value: v} => format!("hsv({},{}%,{}%)", *h, *s, *v),
_ => panic!("Incorrect RGB/HSV format!"),
}
}
}
// Part 3: Invert the values for RGB and HSV
// RGB: #ffffff -> #000000, #007f05 -> 0080FA
// HSV: (360,30,40) -> (0,70,60), (150,40,80) -> (210,60,20)
impl Color {
/// Инвертира цвят покомпонентно -- за всяка от стойностите се взема разликата с максимума.
///
pub fn invert(&self) -> Self {
match self {
Color::RGB{red: r, green: g, blue: b} => {
let red = RGB - *r;
let green = RGB - *g;
let blue = RGB - *b;
Color::RGB{red, green, blue}
}
Color::HSV{hue: h, saturation: s, value: v} => {
let hue = HSV_HUE - *h;
let saturation = HSV_PERCENT - *s;
let value = HSV_PERCENT - *v;
Color::HSV{hue, saturation, value}
}
_ => panic!("Function 'invert' caused an abrupt end to this program's life."),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_basic() {
let color1 = Color::new_rgb(0, 0, 0);
assert_eq!(color1.unwrap_rgb().0, 0);
assert_eq!(&color1.to_string()[0..1], "#");
let color2 = Color::new_hsv(0, 0, 0);
assert_eq!(color2.unwrap_hsv().0, 0);
assert_eq!(color1.invert().unwrap_rgb().0, 255);
}
}
Лог от изпълнението
Compiling solution v0.1.0 (/tmp/d20230111-3772066-yw0wah/solution) warning: unreachable pattern --> src/lib.rs:78:5 | 78 | _ => panic!("Incorrect RGB/HSV format!"), | ^ | = note: `#[warn(unreachable_patterns)]` on by default warning: unreachable pattern --> src/lib.rs:103:5 | 103 | _ => panic!("Function 'invert' caused an abrupt end to this program's life."), | ^ warning: `solution` (lib) generated 2 warnings Finished test [unoptimized + debuginfo] target(s) in 0.59s Running tests/solution_test.rs (target/debug/deps/solution_test-0edbea2040daef01) running 5 tests test solution_test::test_hsv_display ... ok test solution_test::test_invert_hsv ... ok test solution_test::test_invert_rgb ... ok test solution_test::test_rgb_display ... ok test solution_test::test_new_hsv ... ok test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
История (2 версии и 0 коментара)
Борислав качи решение на 27.10.2022 15:20 (преди почти 3 години)
const RGB: u8 = 255;
const HSV_HUE: u16 = 360;
const HSV_PERCENT: u8 = 100;
pub enum Color {
RGB {
red: u8,
green: u8,
blue: u8
},
HSV {
hue: u16,
saturation: u8,
value: u8
}
}
//Part 1.1: Create constructors
impl Color {
/// Конструира нова стойност от вариант `RGB` с дадените стойности за червено, зелено и синьо.
///
pub fn new_rgb(red: u8, green: u8, blue: u8) -> Color {
Color::RGB{red: red, green: green, blue: blue}
}
/// Конструира нова стойност от вариант `HSV` с дадените стойности.
///
/// В случай, че hue е над 360 или saturation или value са над 100, очакваме да `panic!`-нете с
/// каквото съобщение си изберете.
///
pub fn new_hsv(hue: u16, saturation: u8, value: u8) -> Color {
if hue > 360 {panic!("Hue should have a value in the range [0,..,360]!")}
else if saturation > 100 {panic!("Saturation should have a value in the range [0,..,100]!")}
else if value > 100 {panic!("Value should be in the range [0,..,100]!")}
else {Color::HSV{hue: hue, saturation: saturation, value: value}}
}
}
// Part 1.2: Create a tuple of values to allow access to individual components
impl Color {
/// Ако `self` е `RGB`, тогава връщате неговите `red`, `green`, `blue` компоненти в този ред.
/// Иначе, `panic!`-вате с каквото съобщение си изберете.
///
pub fn unwrap_rgb(&self) -> (u8, u8, u8) {
match self {
Color::RGB{red: r, green: g, blue: b} => (*r, *g, *b),
_ => panic!("Incorrect RGB format!"),
}
}
/// Ако `self` е `HSV`, тогава връщате неговите `hue`, `saturation`, `value` компоненти в този
/// ред. Иначе, `panic!`-вате с каквото съобщение си изберете.
///
pub fn unwrap_hsv(&self) -> (u16, u8, u8) {
match self {
Color::HSV{hue: h, saturation: s, value: v} => (*h, *s, *v),
_ => panic!("Incorrect HSV format!"),
}
}
}
// Part 2: Create a string according to this format: RGB - #rrggbb, HSV: (hue,saturation%,value%)
// For RGB: red, green and blue have values 0-255 in dec, 0x00-0xFF in hex. Display their values in hex
// For HSV: hue is in the range 0-360, saturation is between 0-100, value is between 0-100. For saturation and value display % at the end
impl Color {
/// В случай, че варианта на `self` е `RGB`, очакваме низ със съдържание `#rrggbb`, където
/// червения, зеления и синия компонент са форматирани в шестнадесетична система, и всеки от тях е
/// точно два символа с малки букви (запълнени с нули).
///
/// Ако варианта е `HSV`, очакваме низ `hsv(h,s%,v%)`, където числата са си напечатани в
/// десетичната система, без водещи нули, без интервали след запетаите, вторите две завършващи на
/// `%`.
///
pub fn to_string(&self) -> String {
match self {
Color::RGB{red: r, green: g, blue: b} => format!("#{:02x}{:02x}{:02x}", *r, *g, *b),
Color::HSV{hue: h, saturation: s, value: v} => format!("hsv({},{}%,{}%)", *h, *s, *v),
_ => panic!("Incorrect RGB/HSV format!"),
}
}
}
// Part 3: Invert the values for RGB and HSV
// RGB: #ffffff -> #000000, #007f05 -> 0080FA
// HSV: (360,30,40) -> (0,70,60), (150,40,80) -> (210,60,20)
impl Color {
/// Инвертира цвят покомпонентно -- за всяка от стойностите се взема разликата с максимума.
///
pub fn invert(&self) -> Self {
match self {
Color::RGB{red: r, green: g, blue: b} => {
let red = RGB - *r;
let green = RGB - *g;
let blue = RGB - *b;
Color::RGB{red, green, blue}
}
Color::HSV{hue: h, saturation: s, value: v} => {
let hue = HSV_HUE - *h;
let saturation = HSV_PERCENT - *s;
let value = HSV_PERCENT - *v;
Color::HSV{hue, saturation, value}
}
_ => panic!("Function 'invert' caused an abrupt end to this program's life."),
}
}
}
+#[cfg(test)]
+mod tests {
+ use super::*;
+
+ #[test]
+ fn test_basic() {
+ let color1 = Color::new_rgb(0, 0, 0);
+ assert_eq!(color1.unwrap_rgb().0, 0);
+ assert_eq!(&color1.to_string()[0..1], "#");
-fn main() {
-
+ let color2 = Color::new_hsv(0, 0, 0);
+ assert_eq!(color2.unwrap_hsv().0, 0);
+
+ assert_eq!(color1.invert().unwrap_rgb().0, 255);
+ }
}