interactive-coding-challenges icon indicating copy to clipboard operation
interactive-coding-challenges copied to clipboard

draw-line challenge bug

Open msm1089 opened this issue 3 years ago • 1 comments

Using the drawline method provided as the solution, it does not handle cases where start_byte != end_byte properly. In end_byte, only the LSB is set.

E.g.

S = BitsScreen()
screen = []
for _ in range(20):
    screen.append(int('00000000', base=2))
S.draw_line(screen, 32, 68, 92)
for row in screen:
    print(f"{row: 09b}")

results in

 00000000
 00000000
 00000000
 00000000
 00000000
 00000000
 00000000
 00000000
 00001111
 11111111
 11111111
 00001000 <---only bit corresponding to x2 = 92 is set
 00000000
 00000000
 00000000
 00000000
 00000000
 00000000
 00000000
 00000000

I have tried to come up with a solution for this but could not. Could anyone provide the correct solution perhaps?

msm1089 avatar Jul 10 '21 13:07 msm1089

UPDATE

In the end I solved it by changing the last else block:

    else:
        start_mask = (1 << (8 - start_bit)) - 1
        end_mask = ~((1 << (8 - end_bit - 1)) - 1)
        screen[start_byte] |= start_mask
        screen[end_byte] = int('11111111', base=2)
        screen[end_byte] &= end_mask

I looked back at the first challenge (bits) in bit_manipulation series. I set the last bit to all 1s, then used the method from the clear_bits_index_to_lsb method in the bits challenge.

I have a couple of questions about this.

  1. Setting all bits in a byte is done using int('11111111', base=2). This could just be done by setting it to equal 255. What is the reason to use the much longer way?
  2. Is there some mask that can be used to set all bits from MSB to an index? This would prevent the need to first set all bits then clear the bits to the right of the index.

msm1089 avatar Jul 10 '21 13:07 msm1089