def check(seq, i, changes): position = len(changes) while True: for I in (i, i + 1): if seq[I] > 0: Index = I - 1 + seq[I] Data = seq[Index] if seq[I - 1] > 0: if Data == 0 or Data == -seq[I]: changes.append((Index, Data)) seq[Index] = seq[I - 1] elif Data != seq[I - 1]: return False else: if Data == 0: changes.append((Index, Data)) seq[Index] = -seq[I] elif Data != -seq[I]: return False if position == len(changes): return True i = changes[position][0] position += 1 def revert(seq, changes): for change in reversed(changes): seq[change[0]] = change[1] def deep_check(seq, i): found = set() groups = [] last = len(seq) - 1 while seq[last] == 0: last -= 1 for index in range(i, last): if index - 1 in found or seq[index] > 0 or seq[index + 1] <= 0: continue pos = index group = [] if seq[pos - 1] != 0: group.append((pos - 1, seq[pos - 1])) while seq[pos] <= 0 and seq[pos + 1] > 0: pos += seq[pos + 1] if seq[pos - 1] != 0: group.append((pos - 1, seq[pos - 1])) found.add(pos - 1) if len(group) > 1: for member in group: if member[1] > 0: groups.append(group) break test = [0] * len(seq) for group in groups: for member in group: test[member[0]] = member[1] for member in group: if test[member[0] - 1 + member[1]] != 0: return False for member in group: test[member[0]] = 0 return True def generate(seq, terms): seq[0] = 2 used = {2} index = 1 N = 2 while True: if N not in used and seq[index - 1 + N] == 0: seq[index] = N changes = [] if check(seq, index, changes) and deep_check(seq, index): used.add(N) index = seq.index(0) if index >= terms: return N = 1 else: revert(seq, changes) N += 1 term_count = int(input("number of terms to generate: ")) S = [0] * (term_count * 3 + 21) generate(S, term_count) print(S[:term_count])