Untitled
unknown
python
a year ago
2.4 kB
13
Indexable
# You can call `read()` on the stream and it will return up to `n` ints as an array. #It's possible the call will return fewer than `n` values, #in which case the stream of data has been consumed completely. # Example usage on a stream which contains 7 values in total: # s = Stream(...) # assume the content is [2, 3, 1, 4, 1, 1, 1] # s.read(5) # => returns [2, 3, 1, 4, 1] - full 5-value read as requested # s.read(3) # => returns [1, 1] - fewer values than requested # s.read(4) # => returns [] - stream is completely exhausted ###### YOUR TASK ######## # Create a new class called `MultiStream` which can store other streams and has a `read()` method that is backed by other streams. # Treat `Stream` objects like black boxes - # you cannot change their implementation. Implement add(stream),read(n),remove(stream) # Example usage across two streams containing a total of 6 values: # ms = MultiStream() # s1 = Stream(...) # s2 = Stream(...) # ms.add(s1) # first Stream's contents: [5, 4, 1, 4, 5] # ms.add(s2) # second Stream's contents: [1, 3] # ms.read(6) # => returns [5, 4, 1, 4, 5, 1] - full 5-value read as requested # ms.remove(s2) # remove [3] # ms.read(2) # => returns [] - all streams are completely exhausted # ms.read(5) # => still returns [] - all streams are completely exhausted` from collections import OrderedDict class ForzenList: def __init__(self, list): self._list = tuple(list) def __hash__(self): return hash(self._list) def __eq__(self, other): return self._list == other._list class Stream: def __init__(self): self.map = OrderedDict() def add(self, l): key = ForzenList(l) self.map[key] = l def remove(self, l): key = ForzenList(l) del self.map[key] def read(self, n:int): result = [] for k in list(self.map.keys()): v = self.map[k] if len(v) >= n: result += v[:n] v = v[n:] return result result += v n -= len(v) del self.map[k] return result ms = Stream() s1 = [5, 4, 1, 4, 5] s2 = [1,3] ms.add(s1) ms.add(s2) assert ms.read(6) == [5, 4, 1, 4, 5, 1] ms.remove(s2) assert ms.read(2) == [] assert ms.read(5) == [] s3 = [88, 66, 88] ms.add(s3) assert ms.read(5) == [88, 66, 88]
Editor is loading...
Leave a Comment