Untitled

 avatar
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