Нека упражним малко елементарна битова аритметика.
Можем да представяме изображения като линеен масив от байтове (тъй като в 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) и че броят елементи в него ще е винаги кратен на опционалния аргумент, когато такъв е подаден. Тоест, няма да ви подадем списък с три елемента и да искаме да рендерирате битова карта с по два байта на ред.