Как бы я найти изолированные нули в двоичном массиве? - PullRequest
0 голосов
/ 13 ноября 2018

Если у меня есть двоичное число вроде этого - 0b1110111110011011011001000, и я бы вывел на 5 битов, то это выглядит так:

11101 # 29  
11110 # 30  
01101 # 13  
10110 # 22  
01000 # 8

, за исключением 0110/1000 в правом нижнем углу, каждый 0 будет рассматриваться какизолированные нули, поэтому сначала я закодировал, чтобы найти '101', чтобы найти

? 1?
101
? 1?- он найдет в массиве изолированный ноль.

Массив равен [29, 30, 13, 22, 8] и, используя строку,

def find_closed(array,width = 5):
    new_arr = ['1'*(width+2)]+['1'+bin(x)[2:]+'1' for x in array]+['1'*(width+2)]
    for each in range(len(array)):
        a = new_arr[each+1].find('101') +1
        if a and int(new_arr[each][a]) &int(new_arr[each+2][a]):
            return each+1,a
    return False

, поэтому код будет указывать (1,4), строка 4, столбец 1.

ну, я сделал это с помощью сдвига битов,

def bit_closed(array,width = 5):
    new_arr = [2**(width+2)-1]+[2**(width+1)+2*x+1 for x in array]+[2**(width+2)-1]
    for each in range(len(array)):
        for shift in range(width):
            if not ((new_arr[each+1]>>shift)-5)%8 and (new_arr[each]>>(shift+1))%2 and (new_arr[each+2]>>(shift+1))%2:
                return each+1, width - shift
    return False

На самом деле я считаю, что это может быть еще короче, используя циклы списка.В любом случае, есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 14 ноября 2018

Если мы предположим, что 2D-список, [[], [], ...] в качестве входных данных,

def matrix_closed(small):
    org = small[:]
    for objs in org:
        objs.append(1)
    org.append([1]*len(objs))
    n=0
    for lines in org[:-1]:
        x=0
        for points in lines[:-1]:
            if not points and all((org[n-1][x],org[n+1][x],org[n][x-1],org[n][x+1])):
                return n,x
            x+=1
        n+=1
    return False

Это будет работать быстрее, а не в python, поскольку python не поддерживает бинарную поддержкуМассив себя.время для вызова функции больше, чем для работы с битами.

...