Помогите с решенем задачи Python
with open('int3.txt') as file:
n = int(file.read())
one = '1'
zero = '0'
ind_one = 0
ind_zero = 0
s = {'0'*n, '1'*n}
for i in range(2**n):
if ind_one > n-1:
ind_one = 0
list_1 = ['0'] * n
list_1.insert(ind_one, one)
#list_1.remove(list_1[ind_one+1])
ind_one += 1
s.add(''.join(list_1[:3]))
if ind_zero > n-1:
ind_zero = 0
list_2 = ['1'] * n
list_2.insert(ind_zero, zero)
#list_2.remove(list_2[ind_zero+1])
ind_zero += 1
s.add(''.join(list_2[:3]))
print(sorted(s))
for i in sorted(s):
print(i)
n = int(file.read())
one = '1'
zero = '0'
ind_one = 0
ind_zero = 0
s = {'0'*n, '1'*n}
for i in range(2**n):
if ind_one > n-1:
ind_one = 0
list_1 = ['0'] * n
list_1.insert(ind_one, one)
#list_1.remove(list_1[ind_one+1])
ind_one += 1
s.add(''.join(list_1[:3]))
if ind_zero > n-1:
ind_zero = 0
list_2 = ['1'] * n
list_2.insert(ind_zero, zero)
#list_2.remove(list_2[ind_zero+1])
ind_zero += 1
s.add(''.join(list_2[:3]))
print(sorted(s))
for i in sorted(s):
print(i)
Нужно чтоб на каждой следующей строке было удалено или добавлена одна цифра 0 или 1 и чтоб каждая строка отличалась от предыдущей.
Что должно вывести: 000 001 011 010 110 111 101 100
Что выводит: 000 101 110 111 001 011 100 010
p.s при новом запуске, порядок меняется
Ответы (2 шт):
n = 3# количество позиций
max_digit = int('1' * n, 2)# максимальное число в десятичной системе 7
s = [bin(x)[2::].zfill(n) for x in range(max_digit + 1)]
# делаем список из вариантов в двоичной системе используя генератор от
# 0 до 7 включительно. Дополняя нулями до количества позиций
result = ' '.join(s)
# соединяем элементы списка в одну строку, разделяя пробелом
print(result)
# выводим на экран
Видим:
>>>000 001 010 011 100 101 110 111
Если задача не состоит просто вывести все комбинации числа 2^N в двоичном виде (которая решается в одну строчку):
print(*[f"{i:0{N}b}" for i in range(2**N)])
Но и надо соблюсти условие "что каждое последующее число должно отличаться от предыдущего только в одном бите", вот 2 решения.
С использованием рекурсии:
N = 3
def search(s, seq=None):
if seq is None: seq = [s]
elif len(seq) == 2**N: return seq
for i in range(len(s)-1, -1, -1):
new_s = s[:i] + ("1" if s[i] == "0" else "0") + s[i+1:]
if new_s not in seq:
res = search(new_s, seq + [new_s])
if res:
return res
print(*search("0"*N))
Без рекурсии:
N = 3
def search(s):
seq = [s]
while len(seq) != 2**N:
s = seq[-1]
for i in range(len(s)-1, -1, -1):
new_s = s[:i] + ("1" if s[i] == "0" else "0") + s[i+1:]
if new_s not in seq:
seq.append(new_s)
break
else:
seq.pop()
return seq
print(*search("0"*N))
range() в обратную сторону был использован только исключительно для того чтобы получить последовательность как в примере.