Skip to content

Latest commit

 

History

History
53 lines (40 loc) · 3.95 KB

README.md

File metadata and controls

53 lines (40 loc) · 3.95 KB

Bitmap

Нека упражним малко елементарна битова аритметика.

Можем да представяме изображения като линеен масив от байтове (тъй като в Ruby няма тип „байт“ мислете си за масив от цели числа между 0 и 255). Всеки от тези байтове съдържа информация за определен брой „пиксели“. В един байт можем да съберем информация за 8 двуцветни пиксела (0 за първия цвят, 1 за втория цвят), 4 четирицветни пиксела (по два бита за цвят, 00 за първи, 01 за втори, 10 за трети и 11 за четвърти), или 2 шестнадесетцветни пиксела (0000, 0001 и така нататък до 1111).

„Палитрата“ ни с цветове е просто един масив от ASCII символи, в който нулевият елемент представлява първия „цвят“, първият елемент – вторият цвят и така нататък. Например монохромен (а.к.а. „черно-бял“) bitmap можем да представим в текстов вид, като на всеки „пиксел“ със стойност 0 съпоставим символа ., а на всеки „пиксел“ със стойност 1 съпоставим символа #. Така от байт със стойност 41 и палитра ['.', '#'] получаваме следната „картинка“:

41 -> 00101001 -> "..#.#..#"

Напишете клас Bitmap, чийто конструктор приема един задължителен аргумент — списъка с байтове и един опционален аргумент — броя байтове на ред. Ако опционалният аргумент не бъде подаден, ще се подразбира, че матрицата е едноредова, тоест, че на един ред имаме толкова байта, колкото са подадени в списъка.

Класът Bitmap трябва да има един метод render, който приема като опционален аргумент масив, който да представя „палитрата“ (по подразбиране имаме двуцветна палитра със символи . и #, т.е. масив ['.', '#']) и връща текстуалното представяне на въпросната матрица. "Квадратчетата" са залепени едно за друго, както в примерите, а редовете са съединени със символ за нов ред ("\n"). След последния ред няма символ за нов ред.

Пример:

bitmap = Bitmap.new [1, 10, 100]
bitmap.render # => ".......#....#.#..##..#.."

Или, с друга палитра:

bitmap = Bitmap.new [1, 10, 100]
bitmap.render ['+', '@'] # => "+++++++@++++@+@++@@++@++"

Палитрата може да има и повече от два цвята:

bitmap = Bitmap.new [1, 11], 1
bitmap.render ['.', '_', '+', '@'] # => "..._\n..+@"

Считайте, че в списъка с числа ще са ви подадени винаги валидни байтове (между 0 и 255) и че броят елементи в него ще е винаги кратен на опционалния аргумент, когато такъв е подаден. Тоест, няма да ви подадем списък с три елемента и да искаме да рендерирате битова карта с по два байта на ред.