42 lines
1021 B
Elixir
42 lines
1021 B
Elixir
|
defmodule PaintByNumber do
|
||
|
def palette_bit_size(color_count, pow \\ 1) do
|
||
|
if color_count <= 2 ** pow do
|
||
|
pow
|
||
|
else
|
||
|
palette_bit_size(color_count, pow + 1)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def empty_picture() do
|
||
|
<<>>
|
||
|
end
|
||
|
|
||
|
def test_picture() do
|
||
|
<<0::2, 1::2, 2::2, 3::2>>
|
||
|
end
|
||
|
|
||
|
def prepend_pixel(picture, color_count, pixel_color_index) do
|
||
|
size = palette_bit_size(color_count)
|
||
|
pixel = <<pixel_color_index::size(size)>>
|
||
|
<<pixel::bitstring, picture::bitstring>>
|
||
|
end
|
||
|
|
||
|
def get_first_pixel(<<>>, _color_count), do: nil
|
||
|
def get_first_pixel(picture, color_count) do
|
||
|
size = palette_bit_size(color_count)
|
||
|
<<value::size(size), _rest::bitstring>> = picture
|
||
|
value
|
||
|
end
|
||
|
|
||
|
def drop_first_pixel(<<>>, _color_count), do: <<>>
|
||
|
def drop_first_pixel(picture, color_count) do
|
||
|
size = palette_bit_size(color_count)
|
||
|
<<_value::size(size), rest::bitstring>> = picture
|
||
|
rest
|
||
|
end
|
||
|
|
||
|
def concat_pictures(picture1, picture2) do
|
||
|
<<picture1::bitstring, picture2::bitstring>>
|
||
|
end
|
||
|
end
|