""" Extra Questions for Lab 13 """ # Q4 def num_splits(s, d): """Return the number of ways in which s can be partitioned into two sublists that have sums within d of each other. >>> num_splits([1, 5, 4], 0) # splits to [1, 4] and [5] 1 >>> num_splits([6, 1, 3], 1) # no split possible 0 >>> num_splits([-2, 1, 3], 2) # [-2, 3], [1] and [-2, 1, 3], [] 2 >>> num_splits([1, 4, 6, 8, 2, 9, 5], 3) 12 """ "*** YOUR CODE HERE ***" # Q5 def insert(link, value, index): """Insert a value into a Link at the given index. >>> link = Link(1, Link(2, Link(3))) >>> print(link) <1 2 3> >>> insert(link, 9001, 0) >>> print(link) <9001 1 2 3> >>> insert(link, 100, 2) >>> print(link) <9001 1 100 2 3> >>> insert(link, 4, 5) IndexError """ "*** YOUR CODE HERE ***" class Link: """A linked list. >>> s = Link(1) >>> s.first 1 >>> s.rest is Link.empty True >>> s = Link(2, Link(3, Link(4))) >>> s.second 3 >>> s.first = 5 >>> s.second = 6 >>> s.rest.rest = Link.empty >>> s # Displays the contents of repr(s) Link(5, Link(6)) >>> s.rest = Link(7, Link(Link(8, Link(9)))) >>> s Link(5, Link(7, Link(Link(8, Link(9))))) >>> print(s) # Prints str(s) <5 7 <8 9>> """ empty = () def __init__(self, first, rest=empty): assert rest is Link.empty or isinstance(rest, Link) self.first = first self.rest = rest @property def second(self): return self.rest.first @second.setter def second(self, value): self.rest.first = value def __repr__(self): if self.rest is not Link.empty: rest_repr = ', ' + repr(self.rest) else: rest_repr = '' return 'Link(' + repr(self.first) + rest_repr + ')' def __str__(self): string = '<' while self.rest is not Link.empty: string += str(self.first) + ' ' self = self.rest return string + str(self.first) + '>' def __len__(self): """ Return the number of items in the linked list. >>> s = Link(1, Link(2, Link(3))) >>> len(s) 3 >>> s = Link.empty >>> len(s) 0 """ return 1 + len(self.rest) def __getitem__(self, i): """Returning the element found at index i. >>> s = Link(1, Link(2, Link(3))) >>> s[1] 2 >>> s[2] 3 """ if i == 0: return self.first else: return self.rest[i-1] def __setitem__(self, index, element): """Sets the value at the given index to the element >>> s = Link(1, Link(2, Link(3))) >>> s[1] = 5 >>> s Link(1, Link(5, Link(3))) >>> s[4] = 5 Traceback (most recent call last): ... IndexError """ if index == 0: self.first = element elif self.rest is Link.empty: raise IndexError else: self.rest[index - 1] = element def __contains__(self, e): return self.first == e or e in self.rest def map(self, f): self.first = f(self.first) if self.rest is not Link.empty: self.rest.map(f)