# From L and S input by the user as two relatively prime numbers, # generates a linked list of length L, and reorders the list by # starting with the Sth element (numbering elements of the list from 1), # at each step jumping over S-1 elements, and looping around when needed. # Eventually the original will have a new head and consist # of the same nodes, but linked differently. import sys from random import seed, randrange from linked_list import * from extended_linked_list import ExtendedLinkedList def gcd(a, b): if b == 0: return a return gcd(b, a % b) def collect_references(L, length): node = L.head references = set() for i in range(length): references.add(id(node)) node = node.next_node return references provided_input = input('Enter 3 integers: ') try: provided_input = [int(arg) for arg in provided_input.split()] except ValueError: print('Incorrect input (not all integers), giving up.') sys.exit() if len(provided_input) != 3: print('Incorrect input (not 3 arguments), giving up.') sys.exit() for_seed, length, step = provided_input if length <= 0 or step <= 0: print('Incorrect input (2nd or 3rd integers not strictly positive, ' 'giving up.') sys.exit() if gcd(length, step) != 1: print('List length and step should be relatively prime, giving up.') sys.exit() seed(for_seed) L =  * length for i in range(length): L[i] = randrange(100) LL = ExtendedLinkedList(L) LL.print() references = collect_references(LL, length) LL.rearrange(step) if collect_references(LL, length) != references: print('You cheated!') sys.exit() else: LL.print()
Resource created Thursday 17 September 2015, 12:13:50 AM, last modified Saturday 19 September 2015, 09:37:42 AM.