Помогите с решенем задачи 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 шт):

Автор решения: A_Vaclav
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
→ Ссылка
Автор решения: GrAnd

Если задача не состоит просто вывести все комбинации числа 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() в обратную сторону был использован только исключительно для того чтобы получить последовательность как в примере.

→ Ссылка